XML 外部エンティティ インジェクション(XXE)

OWASP カテゴリ: MASVS-CODE: コード品質

概要

XML 外部エンティティ インジェクション(XXE)は、XML 入力を解析するアプリケーションに対する攻撃です。XXE 攻撃は、外部エンティティを参照する信頼できない XML 入力が、構成が不十分な XML パーサーによって処理された場合に発生します。この攻撃は、サービス拒否、ファイル システムへのアクセス、データの引き出しなど、複数のインシデントをステージングするために使用できます。

影響

アプリケーションが XML ドキュメントを解析すると、ドキュメント内に含まれる DTD(ドキュメント タイプ定義、外部エンティティとも呼ばれます)を処理できます。攻撃者は、DTD として悪意のあるコードを挿入することで、この動作を悪用できます。このコードは、デバイスのファイル システムの一部(アプリのみがアクセス可能)にアクセスでき、機密データを含む可能性があります。 さらに、この悪意のあるコードはデバイスからリクエストを行う可能性があり、境界のセキュリティ対策が回避される可能性があります。

最後に、アプリケーションが DTD を展開すると、参照されるエンティティが複数回反復され、デバイスのリソースが使い果たされてサービス拒否につながる可能性があります。

リスクの軽減

DTD を無効にする

XXE を防ぐ最も安全な方法は、DTD(外部エンティティ)を常に完全に無効にすることです。使用しているパーサーによっては、このメソッドは XML プル パーサー ライブラリの次の例に似ている場合があります。

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 パーサーSAX パーサーはどちらも、DTD とエンティティを許可しない安全な方法で構成できます。

リソース