なぜその「XML」が泥棒を招くのか?XXE攻撃の正体と、鍵のかけ方を徹底解説
こんにちは!セキュリティの世界へようこそ。
今日は、Web開発の現場で意外と見落とされがちな「XXE(XML External Entity)攻撃」についてお話しします。
「XMLなんて古い技術でしょ?」なんて思っていませんか?実は、今でも多くのシステム間のデータ連携(APIなど)でXMLは現役バリバリです。だからこそ、ここを疎かにするとシステムが丸裸になってしまうリスクがあるんです。
難しく聞こえるかもしれませんが、身近な例えを使って、今日からできる対策まで一歩ずつ見ていきましょう!
—
そもそも「XXE」って何?身近な例えで理解しよう
XMLというデータ形式には、「外部の情報を参照する」という非常に便利な機能があります。
これを「家の郵便受けに差し込まれたメモ」に例えてみましょう。
普通、郵便受けには「宛先」や「差出人」が書いてありますよね。でも、もし悪意のある人物が、そのメモの中に「この家の金庫の場所と、中身を見ろ」という指令を書いたらどうなるでしょうか?
システム(XMLパーサー)がそのメモを律儀に読み込んで、本当に「金庫の中身」を外部に送信してしまったら……これがXXE攻撃の正体です。
- XXE(XML External Entity):XMLの機能を利用して、サーバー内の機密ファイル(設定ファイルやパスワードなど)を外部から盗み出したり、内部ネットワークを攻撃したりする手法です。
—
なぜ攻撃は成功してしまうのか?
多くの開発者は「XMLを読み込んで処理するだけ」のライブラリを使っています。しかし、デフォルトの設定では、「外部の情報を参照してもいいですよ」という鍵が空いたままになっていることが多いんです。
泥棒は「この家、鍵がかかっていないな」と気づくと、郵便受けから指令を送り込みます。開発者が意図しないところで、ライブラリが勝手に「外部のファイル」を読みに行こうとする――これが、多くのインシデントの現場で起きている「泥臭い」現実です。
—
対策:最強の鍵をかけよう
対策はシンプルです。「外部の情報を読み込む機能を無効にする」こと。これだけで、攻撃者は何もできなくなります。
ここでは、Javaの代表的なXMLパーサーである`DocumentBuilderFactory`を例に、安全な設定を見てみましょう。
import javax.xml.parsers.DocumentBuilderFactory;
// 1. まずファクトリーを作る
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
// 2. 「外部エンティティ」という「怪しいメモ」を読み込まない設定(これが一番大事!)
// 以下の2行をセットで書くのが鉄則です
dbf.setFeature(“http://xml.org/sax/features/external-general-entities”, false);
dbf.setFeature(“http://xml.org/sax/features/external-parameter-entities”, false);
// 3. さらにDTD(文書型定義)自体を無効化して、より強固に守る
dbf.setFeature(“http://apache.org/xml/features/disallow-doctype-decl”, true);
// これで準備完了!この設定をしたdbfを使ってXMLを解析すれば、攻撃を遮断できます。
ポイント解説
- `external-general-entities` / `parameter-entities`: 外部の情報を読み込む機能を「オフ」にしています。これで、指令が届いても無視できるようになります。
- `disallow-doctype-decl`: これは「そもそもXMLのルール定義(DTD)なんて認めない!」という非常に強力な設定です。必要ないなら、これが一番安全です。
—
開発現場で意識すべきこと
セキュリティ担当者として、皆さんに一つだけ覚えておいてほしいことがあります。それは、「ライブラリは賢いが、時にはお節介である」ということです。
多くのライブラリは「便利さ」のために、初期設定で「いろいろな機能」をオンにしています。しかし、その便利さは攻撃者にとっての「道具」にもなり得ます。
- デフォルトを信じない: 「ライブラリがよしなにやってくれるだろう」と思わず、公式ドキュメントで「XXE対策はどうすればいいか?」を必ず確認してください。
- XMLを使う意味を問い直す: もし可能なら、最近ではJSONなど、よりシンプルで攻撃のリスクが少ない形式への移行を検討するのも立派なセキュリティ対策です。
—
最後に:セキュリティは「積み重ね」
XXE対策は、家の玄関にしっかりした鍵を取り付けるようなものです。一度設定してしまえば、攻撃者はその玄関から入ることを諦めます。
「設定一つでシステムを守れる」――そう考えると、セキュリティも少し楽しくなってきませんか?
現場で開発をしていると忙しくて忘れがちですが、今日学んだ設定を、ぜひ皆さんのプロジェクトのソースコードで見直してみてください。
もし「自分の使っているライブラリの設定方法がわからない!」という場合は、いつでも調べてくださいね。それが、信頼されるエンジニアへの第一歩ですよ!
それでは、また次の記事でお会いしましょう。安全な開発を!

コメント