午前I問題

XML文書を処理するアプリケーションの脆弱性に関する記述として、適切なものはどれか。

ア)XML外部実体参照(XXE)攻撃は、XML文書のDOCTYPE宣言内で外部エンティティを定義し、パーサにサーバ内のファイルを読み込ませたり外部サーバへ通信させたりする攻撃である。

イ)XML外部実体参照(XXE)攻撃は、XML文書中のタグをHTMLとして解釈させ、閲覧者のブラウザ上でスクリプトを実行させる攻撃である。

ウ)XML外部実体参照(XXE)攻撃は、XMLスキーマの型定義を偽装し、データベースへの不正なクエリを実行させる攻撃である。

エ)XML外部実体参照(XXE)攻撃は、XML署名の検証ロジックを回避し、改ざんされた電子文書を正当なものと誤認させる攻撃である。

午前I の解答・解説を見る

正解: ア

解説:

  • ア)正解。XXEはDTD(Document Type Definition)内で外部実体(External Entity)を定義し、XMLパーサがその参照を解決する際にローカルファイルの読み取りや外部ホストへのリクエスト発行を引き起こす攻撃です。
  • イ)不正解。これはXSS(クロスサイトスクリプティング)の説明です。
  • ウ)不正解。これはSQLインジェクションに近い説明であり、XMLスキーマ偽装は一般的なXXEの手口ではありません。
  • エ)不正解。これはXML署名ラッピング攻撃(XML Signature Wrapping)の説明であり、XXEとは別種の脆弱性です。

午前II問題

次のXML文書はXXE攻撃を試みるペイロードの例である。

<?xml version="1.0"?>
<!DOCTYPE foo [
  <!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<user><name>&xxe;</name></user>

このペイロードに対するアプリケーション側の対策として、最も効果的なものはどれか。

ア)XML文書を受け付けるAPIの通信経路をTLS化し、盗聴を防止する。

イ)XMLパーサの設定でDTDの処理(外部一般実体・外部パラメータ実体の解決を含む)を無効化する。

ウ)<name> タグの内容を正規表現でフィルタリングし、/etc/passwd という文字列を含むリクエストを拒否する。

エ)XML文書のサイズに上限を設け、一定バイト数を超えるリクエストを拒否する。

午前II の解答・解説を見る

正解: イ

解説:

  • ア)不正解。TLS化は通信経路の盗聴・改ざんを防ぐものであり、アプリケーション内部でのXXE処理自体は防げません。
  • イ)正解。根本対策はXMLパーサでDTDの読み込みと外部実体参照の解決を無効化することです。多くの言語・ライブラリでは既定でDTD処理が有効になっているため、明示的に無効化設定を行う必要があります。
  • ウ)不正解。文字列ブラックリスト方式はエンティティ名の変更や php://filter、expect:// 等別のスキームによる迂回、Base64エンコードなど多様な迂回手法があり、根本対策になりません。
  • エ)不正解。サイズ制限はXML爆弾(Billion Laughs攻撃)のようなDoS対策の一助にはなりますが、XXEによる情報窃取自体を防止するものではありません。
対策効果
DTD処理の無効化根本対策(推奨)
外部実体参照のみ無効化部分的対策
ホワイトリスト型入力検証補助的対策
WAF一部検知(回避される可能性あり)

午後問題

D社は取引先とのデータ連携にXML形式のAPIを提供している。受信したXML文書を社内のXMLパーサライブラリでパースし、注文情報としてデータベースに登録する処理を行っている。セキュリティ診断の結果、以下の指摘を受けた。

指摘事項

  • 現在のXMLパーサはDTDの処理がデフォルトで有効になっており、外部実体参照を含むXML文書を送信すると、サーバ内の任意ファイルを読み取れることが確認された。
  • 診断担当者は、以下のペイロードを送信し、サーバの設定ファイルの内容がレスポンスのエラーメッセージ経由で読み取れることを確認した。
<?xml version="1.0"?>
<!DOCTYPE order [
  <!ENTITY xxe SYSTEM "file:///app/config/database.yml">
]>
<order><item>&xxe;</item></order>
  • また、外部実体のURIスキームに http:// を指定した場合、社内ネットワーク上の管理用エンドポイント(本来はインターネットから直接アクセスできない)にリクエストが到達することも確認された。

設問1

上記の指摘のうち、外部実体のURIに http:// を指定した場合に発生する二次的な攻撃の名称を答え、その攻撃によって生じ得るリスクを40字以内で述べよ。

設問1の解答・解説を見る

正解例:

  • 攻撃の名称:SSRF(サーバサイドリクエストフォージェリ)
  • リスク:外部から直接到達できない社内の管理系エンドポイントに、サーバを踏み台にしてアクセスされる。

解説・採点基準(計15点):

採点項目キーワード配点
攻撃名称SSRF/サーバサイドリクエストフォージェリ6点
リスクの内容社内ネットワーク/内部リソースへのアクセス6点
リスクの内容サーバを踏み台(プロキシ)にする点への言及3点(部分点)

XXEはファイル読み取りだけでなく、外部実体のURIにHTTP等のスキームを指定することでSSRFの入り口としても悪用されます。クラウド環境ではメタデータサービス(http://169.254.169.254/)への到達によりクレデンシャル窃取に発展する事例もあるため、午後問題では併せて問われやすい組み合わせです。

設問2

D社がとるべき恒久対策を、パーサ設定の観点から40字以内で述べよ。また、パーサ設定の変更に加えて多層防御として有効な対策を1つ挙げよ。

設問2の解答・解説を見る

正解例:

  • パーサ設定の対策:XMLパーサでDTDの読み込みおよび外部一般・外部パラメータ実体の解決を無効化する設定に変更する。
  • 多層防御:XML文書を処理するサーバプロセスの権限を最小化し、機密ファイルへの読み取り権限を付与しない。あわせてアウトバウンド通信を必要な宛先のみに制限するネットワーク分離(エグレスフィルタリング)を行う。

解説・採点基準(計15点):

採点項目キーワード配点
パーサ設定の対策DTD無効化/外部実体解決の無効化7点
多層防御の内容最小権限/エグレスフィルタリング/ネットワーク分離のいずれか6点
具体性対策が実装レベルで具体的である2点(部分点)

解説: XXE対策は「入力のブラックリスト検証」ではなく「パーサ自体の危険な機能を無効化する」ことが唯一の根本対策です。加えて、仮に対策漏れがあっても被害を限定できるよう、プロセス権限の最小化とアウトバウンド通信制限による多層防御が推奨されます。

重要キーワード

用語説明
XXE(XML外部実体参照)DTD内で定義した外部実体をXMLパーサに解決させ、ファイル読み取りや内部通信を引き起こす攻撃
DTD(Document Type Definition)XML文書の構造を定義する仕組み。外部実体宣言の起点となる
SSRFサーバに任意の宛先へリクエストを発行させ、内部ネットワークやメタデータサービスへ到達させる攻撃
Billion Laughs攻撃実体参照を再帰的に展開させメモリを枯渇させるXML爆弾型のDoS攻撃
最小権限の原則プロセスやユーザに必要最小限の権限のみを付与し被害範囲を限定する考え方
エグレスフィルタリングサーバからの送信(アウトバウンド)通信を必要な宛先のみに制限する対策

まとめ

  • 午前I視点: XXEはDOCTYPE宣言と外部実体宣言(<!ENTITY ... SYSTEM ...>)がキーワード。XSSやXML署名ラッピングとの選択肢の混同に注意
  • 午前II視点: 対策の本質は「ブラックリスト検証」ではなく「DTD処理・外部実体解決の無効化」である点を選択肢の妥当性判断で問われる
  • 午後視点: XXEはファイル読み取りだけでなくSSRFへの発展経路になる点、パーサ設定変更に加え最小権限・ネットワーク分離といった多層防御を説明できるようにする