5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

FusicAdvent Calendar 2018

Day 2

PhpSpreadsheet で発見されたXXE脆弱性について

Posted at

Fusic Advent Calendar 2日目です。
昨日は、 @kozo による、 開発効率を上げるGitHub Apps + hadolintのすゝめ でした。
Github Apps を作ってみようという気持ちになりました。

さて、本日は、先日 PhpSpreadsheetで発見された脆弱性について書いてみようと思います。

対象のissue はこちらです。
https://github.com/PHPOffice/PhpSpreadsheet/issues/771

この問題を知った経緯

ずっとgithubを追っていたわけではありません。
そして、特に毎日流れてくる大量の脆弱性情報をウォッチし続けてるわけでもありません。
そんな私がこの脆弱性を知ったのは、Scrutinizer のおかげでした。
Scrutinizerがセキュリティのissue 上がってるよ!と教えてくれたのです。
(正確には、Scrutinizerでセキュリティissueが上がってるよと先輩が教えてくれました)
ありがとう!Scrutinizer!

起こった問題

XXE 脆弱性

XXE脆弱性という言葉を初めて聞きました。
XXE は、 XML eXternal Entity という言葉の略語みたいです。
https://www.owasp.org/index.php/Top_10-2017_A4-XML_External_Entities_(XXE)
https://blog.ohgaki.net/xxe-xml-external-entity

こちらの記事がとても参考になります。
https://www.mbsd.jp/blog/20171130.html
https://www.mbsd.jp/blog/20171213.html

詳しくは上の記事を読んでほしいのですが、簡単に、ごくごく簡単に説明すると、
XMLの外部ファイルを読み込む機能を悪用し、
悪意のあるコードを実行することができるという脆弱性です。
怖いですね。

発生条件

アップロードされたXMLファイルがUTF-8以外の文字コードであった場合に起こる問題だったようです。
Issueは、UTF-7 の場合に起こると起票されていますが、ディスカッションの中で、UTF-16 でも起こるという追加情報が書いてあります。

原因と対策

XXEの問題を防ぐために、 PhpSpreadsheetには、SecurityScan() というメソッドが準備されています。
今回の問題は、上述の発生条件下で、SecurityScan()がスキップされてしまうというものでした。
こちらのPull Request で対策されています。

直接的な解決策は、 libxml_disable_entity_loader(true) を利用して外部エンティティの読み込み機能を無効にするというものです。
興味深いのは、当該issueの議論の中でlibxml_disable_entity_loader自体のバグについても考察がされていることです。この議論に、OSS開発の奥深さを感じました。
また、UTF-8 以外の文字コードでエンコードされているファイルは UTF-8にエンコードしてから処理をするなど、異なる文字コードへの対策が強化されています。
更に、UTF-7 でエンコードされたファイルに対するテストも行われ、今回の対策の有効性が検証されています。

アップデート

すでに、脆弱性対策を行ったバージョンがリリースされています。

PhpSpreadSheet
バージョン >=1.5.1

にアップデートしましょう。

脆弱性をGithub の Issue で報告するということ

Issue 内でも言われていますが、もし脆弱性を発見した場合、
Github のIssue にその内容を記述するのは適切ではありません。
ゼロデイ攻撃が行われる可能性があるからです。
もしも脆弱性を発見したら、メンテナーの方にこっそりとメールしましょう。

感想

今まで脆弱性についてしっかり調査したことはありませんでしたが、
調べてみるととても奥が深いことが分かりました。
特に、libxml_disable_entity_loaderのバグについて議論しているところは感動しました。
これからも、時間があったら調査してみようと思います。

明日は、 @leedohyung-dba によるVUI設計及び開発の話 Amazon Alexa版 です。
お楽しみに!

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?