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

「なぜかサーバーの中身が丸見え?」XXE攻撃の正体と、鍵をかけ忘れたXMLパーサーの話

こんにちは!セキュリティの世界へようこそ。今日は、少し古風だけど、今もなお現役で恐ろしい攻撃手法「XXE(XML External Entity)攻撃」についてお話しします。

「XMLとか難しいことはよくわからない…」という方も安心してください。まずは、私たちの身近な「家の防犯」に例えて、この攻撃の仕組みを紐解いていきましょう。

—

1. XXE攻撃って、結局なにをしているの?

想像してみてください。あなたは、大切な書類を封筒に入れて、郵便受け(XMLパーサー)から届けてもらう仕組みを作りました。

普通なら、封筒の中には「お名前」や「住所」といった、あなたが許可した情報だけが入っているはずですよね。ところが、悪意のある泥棒は、封筒の中に「郵便局への指示書(外部エンティティ)」をこっそり忍ばせます。

その指示書にはこう書かれています。
「この封筒を届けたついでに、家の金庫の中身を読み取って、こっそり教えてくれ」

XMLパーサーという名の郵便屋さんは、律儀なのでその指示に従ってしまいます。結果、本来は見せてはいけない「サーバー内の設定ファイル」や「パスワード」が、悪意ある人の元へ届けられてしまうのです。これがXXE攻撃の正体です。

—

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

実は、XMLには「DTD(Document Type Definition)」という、データの構造を定義する昔ながらの機能があります。この機能の中に「外部のファイルを参照して、内容を読み込む」という便利な仕組みがあるのですが、これが現代のWebアプリケーションでは「不要どころか凶器」になります。

多くのXMLパーサーは、デフォルト設定でこの「外部参照」を許可してしまっています。つまり、「鍵をかけ忘れた玄関」のまま運用している状態なんです。

—

3. 実践!パーサーの鍵をしっかりかける方法

では、どうすればこの「鍵」をかけられるのでしょうか?
幸い、今の開発環境では設定一つでこの脆弱性を封じ込めることができます。

Java (DocumentBuilder) の場合

JavaでXMLを読み込む際は、以下のように設定を追加してください。これが「外からの指示書は一切受け付けない」という強い意思表示になります。

// 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);
dbf.setFeature(“http://apache.org/xml/features/disallow-doctype-declarations”, true);

DocumentBuilder db = dbf.newDocumentBuilder();
// この後、安全にXMLをパース処理する

なぜこの設定が必要なの?

  • external-general-entities / parameter-entities: これを false にすることで、「外部のファイルやURLを読みに行く」という機能を停止します。
  • disallow-doctype-declarations: これを true にすると、「そもそもDTD宣言なんて認めない!」と、より厳しく門前払いできます。基本的にはこれを使うのが最強の防御策です。

—

4. 開発者として覚えておいてほしいこと

セキュリティというと、「何か特別な魔法のツールを入れなきゃ」と思われがちです。でも、多くの脆弱性は今回のように「デフォルト設定のまま、便利な機能を使い続けていること」から生まれます。

皆さんがプログラムを書くとき、以下の3つを心に留めておいてください。

1. 「デフォルトは脆弱」と疑う: フレームワークやライブラリは、誰でも使いやすいように「何でも許可」の設定になっていることが多いです。
2. 不要な機能はOFFにする: DTDが必要ないなら、最初から無効にしておく。これが最強の防犯です。
3. ライブラリを更新する: パーサー自体に脆弱性が見つかることもあります。定期的なアップデートを忘れないでくださいね。

—

最後に:一歩ずつ進んでいきましょう

「セキュリティ」は、一度勉強して終わりではありません。泥棒が手口を変えるように、攻撃手法も進化します。でも、今日学んだ「外部からの指示を信じない」という考え方は、XXEだけでなく、SQLインジェクションやクロスサイトスクリプティング(XSS)にも通じる、セキュリティの基本中の基本です。

まずは今動いているプロジェクトのパーサー設定を、こっそり覗いてみてください。もし「設定を変えたら動かなくなった!」なんてことがあっても大丈夫。それは、ちゃんとセキュリティの防波堤が機能した証拠ですから。

また、次のステップで一緒に学びを深めていきましょう!応援しています!

コメント

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