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版
です。
お楽しみに!