Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away