影響: XXE 参照を含む巧妙に細工された XML DTD を介した任意のファイルへのアクセス。
根本原因: 安全でない XML ドキュメントパーサー。
このリポジトリには、XXE の影響を確認できるように外部エンティティを許可するよう構成された、脆弱性のある Ktor 2.3.4 アプリが含まれています。
XML 外部エンティティインジェクション (CVE-2023-45612) の概念実証用の、脆弱性のある Ktor (v2.3.4) アプリケーションです。
CVE-2023-45612 は、2.3.5 より前のバージョンで XML が有効な場合に Ktor の ContentNegotiation に存在する XXE (XML 外部エンティティ) バグです。
この脆弱性は CWE-611: XML 外部エンティティ参照の不適切な制限 に該当します。
XXE は OWASP Top 10 A05:2021-セキュリティ設定のミス リスクカテゴリの一部ですが、原因が非制限的な XML パーサーであるため、安全でない設計上の問題でもあります。
Ulf Karlsson 氏による報告 — Jetbrains セキュリティノート を参照してください。
2.3.5 より前の Ktor バージョン
問題を再現するための私の環境は次のとおりです:
XML ドキュメントには、必要に応じて Document Type Definition (DTD) を含めることができ、DTD には、とりわけ XML エンティティを定義する機能があります。URI の形式で置換文字列を指定することでエンティティを定義できます。XML パーサーはこの URI の内容にアクセスし、その内容を XML ドキュメントに埋め込んでさらに処理を続けることができます。
file:// URI で外部エンティティを定義した XML ファイルを送信することにより、攻撃者は処理中のアプリケーションにローカルファイルの内容を読み取らせることができます。
例えば、"file:///c:/winnt/win.ini" のような URI は (Windows では) ファイル C:\Winnt\win.ini を指し、file:///etc/passwd は Unix ベースのシステムのパスワードファイルを指します。
(https://cwe.mitre.org/data/definitions/611.html)
http://localhost:8080/xml エンドポイントに対して POST リクエストが送信されます。
リクエストは、外部エンティティが参照される <!DOCTYPE> 要素を含む XML ファイルである exploit/payloads/xxe-demo-file.xml を送信します。この場合、参照される外部エンティティは exploit/etc/secret.txt です。
これは、プロセスがアクセス権を持つシステム上の他の任意のファイルにもなり得ます。
xxe-demo-file.xml
<!DOCTYPE Mail [ <!ENTITY xxe SYSTEM "exploit/etc/secret.txt"> ]>
<Mail><title>&xxe;</title></Mail>
XML パーサー (DTD を許可するよう構成されている) はこの要素を解決し、リソースデータを取得します。
外部参照は SSRF エンドポイント へのパスにすることもでき、また、システムのリソースを占有するために大きなファイルを指すこともできます (DOS)。
./gradlew run
Responding at http://127.0.0.1:8080
curl -i http://localhost:8080/xml -H "Content-Type: application/xml" --data-binary @exploit/payloads/xxe-demo-file.xml
期待される結果 (脆弱な場合):
コンソール出力:
Received: <external entity data>
期待される結果 (安全な場合):
400 Bad Request、または類似のエラー (XML パーサーが Document Type Definition をブロックします)
コマンドを実行:

cURL で XXE ペイロードを送信し、インジェクションされたファイルの内容が表示された結果:

深刻度は 高/重大 です。ローカルファイルの取得、SSRF 攻撃、DoS 攻撃、その他のシステムへの影響が発生する可能性があります。
NVD ベーススコア: 9.8 CRITICAL (CVSS v3) (https://nvd.nist.gov/vuln/detail/CVE-2023-45612)