OWASP カテゴリ: MASVS-CODE: コード品質
概要
XML 外部エンティティ インジェクション(XXE)は、XML 入力を解析するアプリケーションに対する攻撃です。XXE 攻撃は、外部エンティティへの参照を含む信頼できない XML 入力が、構成が不十分な XML パーサーによって処理されるときに発生します。この攻撃は、サービス拒否攻撃、ファイル システムへのアクセス、データの引き出しなど、複数のインシデントを引き起こす可能性があります。
影響
アプリケーションが XML ドキュメントを解析するときに、ドキュメントに含まれる DTD(ドキュメント タイプ定義。外部エンティティとも呼ばれます)を処理することがあります。攻撃者は、DTD として悪意のあるコードを挿入することで、この動作を悪用する可能性があります。このコードは、アプリケーションのみがアクセスできるデバイスのファイル システムの一部にアクセスし、センシティブ データが含まれている可能性があります。さらに、この悪意のあるコードはデバイスからリクエストを行うことができ、境界セキュリティ対策を回避する可能性があります。
最後に、アプリケーションが DTD を展開すると、参照されるエンティティが複数回繰り返される状況が発生し、デバイスのリソースが枯渇してサービス拒否攻撃につながる可能性があります。
リスクの軽減
DTD を無効にする
XXE を防ぐ最も安全な方法は、DTD(外部エンティティ)を完全に無効にすることです。使用するパーサーに応じて、XML Pull Parser ライブラリの次の例のような方法があります。
Java
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
Kotlin
val factory = XmlPullParserFactory.newInstance()
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true)
DTD を無効にすると、パーサーはサービス拒否攻撃から保護されます。 DTD を完全に無効にできない場合は、パーサーごとに固有の方法で外部エンティティと外部ドキュメント タイプ宣言を無効にする必要があります。
市場には多数の XML 解析エンジンがあるため、XXE 攻撃を防ぐ方法はエンジンによって異なります。詳しくは、エンジンのドキュメントをご覧ください。
入力サニタイズを行う
ユーザーが XML ドキュメントのプリアンブルに任意のコードを挿入できないように、アプリケーションを再構成する必要があります。クライアントサイドの制御はバイパスされる可能性があるため、サーバーサイドで検証する必要があります。
別のライブラリを使用する
使用するライブラリまたはメソッドを安全に構成できない場合は、別のライブラリまたはメソッドを検討する必要があります。XML Pull Parser と SAX Parser は どちらも安全に構成でき、DTD とエンティティを許可しないように設定できます。
リソース
- OWASP XXE
- OWASP XXE Prevention Cheat sheet
- XML 定数: FEATURE_SECURE_PROCESSING
- XML Pull Parser
- SAX Parser