【入門編】XML External Entity (XXE) 攻撃の仕組みとパーサー設定 – アプリケーションセキュリティ & 安全な開発防御ガイド

「XMLの裏口」にご用心!XXE攻撃からシステムを守るための防犯知識

こんにちは。セキュリティの世界へようこそ。
今日は、一見すると地味で難しそうな「XXE(XML External Entity)攻撃」について、私たちの身近な「家の防犯」に例えながら、一緒に紐解いていきましょう。

「セキュリティなんて難しそう…」と思うかもしれませんが、大丈夫です。仕組みさえ分かれば、今日からあなたのコードはぐっと堅牢になりますよ。一歩ずつ、見ていきましょう。

—

1. XXE攻撃って、たとえるならどんな状況?

XMLというのは、データを整理してやり取りするための「手紙の封筒」のようなものです。この封筒には「外部エンティティ」という、ちょっと変わった仕組みがあります。

これを例えるなら、「手紙の中に書かれた『近所の鍵屋さんの電話番号』を、受け取った郵便屋さんが律儀に全部メモして、勝手に鍵屋を呼び出してしまう」ような状況です。

本来なら、郵便屋さんは中身を確認して届けるだけでいいはずですよね?
でも、悪意のある攻撃者が手紙に「この封筒を開けたら、裏口にある金庫の鍵を開けて、中身を俺のところに送れ!」なんて細工をしておくと、郵便屋さんはその命令に従って、あなたの金庫(サーバー内の機密ファイル)を勝手に覗き見してしまうのです。

これが「XXE攻撃」の正体です。XMLパーサー(封筒を開ける担当者)が、悪意ある命令を真に受けて実行してしまうことで、サーバー内部のパスワードファイルなどが盗み出されてしまいます。

—

2. なぜそんなことが起こるの?

実は、昔のXMLパーサーは「親切すぎた」のが原因です。
「外部にある便利な情報を読み込んで、一緒に処理してあげよう」という機能が標準で有効になっていました。しかし、現代のWeb環境では、これがそのまま「裏口の開けっ放し」になってしまったわけですね。

—

3. どうやって防ぐの?(設定のポイント)

対策はシンプルです。「郵便屋さんに、外部からの怪しい指示は無視するように教え込む」こと。つまり、パーサーの設定で「外部エンティティの参照を禁止」するだけでいいのです。

もしJavaのライブラリ(DocumentBuilderなど)を使っているなら、以下のように設定を追加してください。

// XMLパーサーのファクトリーを作成
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

// 【重要】外部エンティティの読み込みを禁止する設定
// これで、怪しい命令が書かれていても無視するようになります
dbf.setFeature(“http://xml.org/sax/features/external-general-entities”, false);
dbf.setFeature(“http://xml.org/sax/features/external-parameter-entities”, false);

// DTD(文書型定義)自体を無効化するのも有効な防衛策です
dbf.setFeature(“http://apache.org/xml/features/disallow-doctype-decl”, true);

DocumentBuilder db = dbf.newDocumentBuilder();
// あとは通常通りXMLを読み込む

このように、たった数行の設定で、あなたのシステムの「鍵」が固く閉ざされることになります。

—

4. 究極の対策:「XMLを使わない」という選択肢

ここまでXXEの防ぎ方を説明しましたが、プロの視点から一つだけアドバイスさせてください。

「そもそも、XMLを使う必要はあるでしょうか?」

現在、Web APIの世界では「JSON」が主流です。JSONには、今回のような「外部から勝手にファイルを読み込ませる」といった複雑で危険な機能はありません。
もし今から新しい機能を作るのであれば、XMLではなくJSONを採用することをおすすめします。「複雑な機能を持たない」ことが、最強のセキュリティ対策になるという良い例ですね。

—

最後に:セキュリティは「泥棒との知恵比べ」

セキュリティ対策は、完璧な鍵を一つ作って終わりではありません。
攻撃者は常に「裏口はないか?」「設定を忘れている窓はないか?」と探しています。

  • パーサーの設定を確認する(まずはここから!)
  • 不要な機能はオフにする
  • 可能ならもっと安全な形式(JSON)に移行する

この3つを意識するだけで、あなたの開発するシステムは、攻撃者にとって「攻略しにくい、面倒なターゲット」に変わります。

最初は難しく感じるかもしれませんが、こうして一つずつ知識を積み上げていけば、いつの間にか「守りのプロ」の視点が身についているはずです。また一緒に学んでいきましょうね!

コメント

タイトルとURLをコピーしました