はじめに
XMLは、サービス間のデータ送信や内部でのデータ処理に有用ですが、ユーザ入力が介在すると危険が伴います。XML処理器は初期設定で外部実体が有効となっているため、ファイル処理時に固有のリスクがあります。これらの設定に気付かないケースも多く、ファイル取得やコード実行に悪用される可能性があるため、決して望ましい状況ではありません。
A4:XML 外部実体 (XXE)
脅威エージェント/攻撃手法 | セキュリティの弱点 | 影響 |
---|---|---|
悪意ある攻撃者がこの脆弱性を狙う場合、自身のXMLファイルを挿入する方法や、開発者が安全対策を講じていないファイルに内容を加える方法を探します。 | XMLライブラリやプロセッサが初期設定で外部実体を有効にしていたため、多くのWebアプリは知らないうちにこの状態となっていました。仕様の一部であるためツール自体の誤りではありませんが、システムに有害な表現が評価される可能性があります。さらに、テスターがXXEを定期的にチェックしないため、問題は深刻化します。 | 技術的影響は、ファイルの情報漏洩、コードの実行、内部機能やサーバへの接続、さらにはDoS攻撃にまで及ぶ可能性があります。具体的な業務への影響は、どの機能にどのような影響が出るかによります。 |
XXE攻撃は、攻撃者が操作可能なXML形式(例:XMLアップロード、SOAPリクエスト、またはDOCXファイルなど)でデータを送信し、XML内に外部実体を挿入、その実体をノードで呼び出すことで発生します。これにより、システムが外部実体を実行し、例えばコードが実行される可能性があります。下記に例を示します。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY smbConf SYSTEM "file:///smb.conf"> ]>
<TestDocument>
<name>test</name>
<lastName>&smbConf<lastName>
ここでは、XXE攻撃が文書のどのノードでも発生し得ることを示すため、2番目のノードに &smbConf 外部実体を追加しました。
上記の例から分かるように、XXE攻撃でファイルを取得するには2段階のプロセスがあります。まず、外部実体を挿入する必要があります。
&lt;!DOCTYPE fakeDocType [ <!ENTITY smbConf SYSTEM "file:///smb.conf"> ]&gt;
次に、この実体を文書内の任意のノードで呼び出す必要があります。
<lastName>&smbConf</lastName>
攻撃用XMLには smbConf という外部実体が含まれており、smb設定ファイルの取得を試みます。前述のとおり、攻撃者は外部実体が有効なノードを探し、ファイルを取得して表示する試みを行います。
XXE脆弱性により、SSRF攻撃が実行されると、サーバが攻撃者に代わってHTTPリクエストを発行し、さまざまな深刻な影響を及ぼす可能性があります。
XXE経由でSSRF攻撃を行う場合、サーバがリクエストを実行するURLを以下のように定義する必要があります。
<!DOCTYPE fakeDocType [ <!ENTITY adminPanel SYSTEM "http://192.168.1.12/admin/"> ]>
上記の例のように、XXE処理器は内部ネットワーク上の管理パネル(内部からのみアクセス可能)を持つサーバへリクエストを発行します。これにより、攻撃者はSSRFを経由して管理パネルにアクセスできるようになります。もしデータが返らなくとも、ブラインドSSRFの可能性は残ります。
ブラインドSSRF脆弱性と同様、ブラインドXXE脆弱性も存在します。外部実体は処理されるものの、必ずしもデータが返るとは限りません。この種の脆弱性は検出や悪用が難しいですが、工夫次第で攻撃者はこれらの問題を見つけ、利用することが可能です。
ユーザが直接制御するXMLファイルのみが脆弱と考えられがちですが、実際はそれだけに限りません。攻撃者は、XMLでないパラメータ内にXXE攻撃ベクターを挿入し、後にサーバがその入力をXMLファイルに統合する『xinclude』攻撃を仕掛ける可能性があります。この場合、攻撃文字列をXML内に挿入するだけで全体を制御することはできないため、創意工夫が求められます。幸い、XML仕様のxinclude機能を利用することで対応可能です。以下はxinclude攻撃の例です。
<fakeElement xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include parse="text" href="file:///smb"/></foo>
これはOWASPトップ10脆弱性の中でも、見落とされがちで深刻な影響を及ぼす、非常に手強い攻撃手法の一つです。
コード解析ツールを活用し、ソースコードを検査して問題点を報告してもらう必要があります。また、XMLファイルのインポート、DOCXファイルやSVG画像のアップロード、SOAPエンドポイントなど、XMLの入力点をすべて把握することが大切です。通常のXXE問題に加え、検出が難しいブラインドXXEも考慮し、XML内のすべてのノードをテストするようにしてください。SAML、DTD、SOAP など、脆弱性を含む可能性のある項目も漏れなく確認することが求められます。
XML文書の一部しか攻撃者が制御できない場合は、xinclude攻撃の確認も行うと良いでしょう。
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE sshKey [<!ELEMENT sshKey ANY >
<!ENTITY key SYSTEM "file:///.ssh/id_rsa" >]>
<foo>&xxe;</foo>
最初のシナリオは、攻撃者が被害者の秘密SSH鍵を盗むため、XXE攻撃を用いて被害者から秘密鍵である id_rsa ファイルの取得を試みるものです。同時に、同手法で .ssh フォルダ内の known_hosts ファイルも取得できれば、他のサーバへ接続する可能性も生じます。
次のシナリオでは、内部ネットワーク内のホストからのみ接続可能なWebサーバ上のURLへアクセスします。ここでは、攻撃者が狙う機微なデータ、例えばクレジットカード情報のリストの流出を防ぐ意図があります。
<!DOCTYPE fakeDocType [ <!ENTITY xxe SYSTEM "http://127.0.0.1/creditCards/"> ]>
Webサーバ自体にリストが含まれているため、SSRF攻撃では別のサーバへアクセスする必要はなく、ループバックIPアドレスで接続が可能です。
これらは理論上の例ですが、実際の事例が一番理解を深めるため、ここではXMLインタプリタの不適切な実装が深刻な問題を引き起こすことを示す古い脆弱性CVE-2018-12463の報告を紹介します。この場合、XXE脆弱性により未認証ユーザでもファイル読み込みやSSRF攻撃が可能となり、事態が悪化しました。
https://www.cvedetails.com/cve/CVE-2018-12463/
大手企業であっても、十分な予算があってもこの脆弱性から逃れることはできないことが、IBMのWebSphereアプリで確認されました。XXE脆弱性により、攻撃者がリソースを消費させ、機微なユーザデータにアクセスする事例が見受けられます。CVE-2021-20454は、XXE検査の徹底と、場合によってはJSONなど他のデータ形式の検討が必要である理由を示す好例です。
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-20454
XXE攻撃の防止には、すべてのXML入力点を把握し、不必要な場所で外部実体が有効になっていないか確認することが重要です。XMLは一見シンプルに見えますが、実際は奥が深いため、可能ならばJSONなど他のデータ形式の利用を検討してください。
SOAPを利用する場合は、1.2以上のバージョンを用い、適切なパッチが当たっていることを確認する必要があります。他のXMLライブラリも速やかに更新し、依存関係のチェックツールなどを活用してください。
また、可能な箇所では外部実体を無効化する設定を行うべきです。
ユーザデータがXMLファイルに取り込まれる場合(アプリがユーザ入力とXMLを結合する場合も含む)は、適切なデータ管理とサニタイズを実施してください。ホワイトリスト方式が理想ですが、業務上の制約で難しい場合もあります。
XSDを利用して、すべての入力XMLファイルが定められた要件を満たしているか検証することも有効です。
コードレビューも本番前に問題を検出する手段となります。手動またはツールを用いて、特にXML入力を受け付けるエンドポイントに注意して検査してください。
最後の対策として、WAFやAPIセキュリティファイアウォールの導入も考えられますが、これらは上記の予防対策と併用する前提です。
XMLの学習方法や、外部実体、xincludeといった詳細な機能に触れる機会が少ないため、XXEは見落とされがちな問題です。これらの問題は容易に見逃され、影響も大きいため、XMLの入力点には十分留意し、徹底的なテストが必要です。
最新情報を購読