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

こんにちは!セキュリティの世界へようこそ。
日々、見えない脅威と戦うエンジニアの皆さん、あるいは「セキュリティって何から手をつければいいの?」と悩んでいる新人の皆さん、いつもお疲れ様です。

今日は、少し古風だけど、今なお油断大敵な「XXE(XML外部エンティティ攻撃)」という厄介な敵についてお話しします。難しそうな名前ですよね。でも大丈夫。身近な「家の防犯」に例えながら、一緒に紐解いていきましょう。

1. XXEって何?「郵便受け」から泥棒を招き入れる仕組み

想像してみてください。あなたは自分の家の玄関(アプリケーション)に、大事な書類を受け取るための「郵便受け(XMLパーサー)」を設置しました。

本来、郵便受けは手紙を受け取るためのものですよね。でも、もしその郵便受けが「中に入っている指示に従って、家中の扉を勝手に開けてしまう魔法」にかかっていたらどうでしょう?

XMLの世界では、「外部エンティティ」という仕組みが、まさにこの魔法の役割を果たしてしまいます。

  • 攻撃者の狙い: 攻撃者は細工したXMLファイルを送りつけます。その中には「このファイルの内容を読み取って、こっそり外部のサーバーに送って!」とか「サーバーのパスワードファイルを覗き見して!」といった命令が書かれています。
  • なぜ起きる?: プログラムがXMLファイルを読み込む際、「このファイルに書いてある通りに、外部の情報を取ってきていいよ」という甘い設定(デフォルト設定)になっていることが原因です。

泥棒が「郵便受けに入れた手紙」を読み込ませるだけで、あなたの家の金庫(サーバー内部の機密データ)の中身を盗み出せてしまう。これがXXEの恐ろしさです。

2. 泥棒を入れないための「3つの鉄則」

では、どうすればこの魔法を無効化できるのでしょうか。対策は「郵便受けを改造すること」です。具体的には、XMLパーサーの設定で「外部の情報を勝手に読み込まない」ように制限をかけます。

対策①:外部エンティティの機能を「オフ」にする

ほとんどのプログラミング言語では、XMLパーサーの設定で外部参照を禁止できます。

Java(DocumentBuilder)での例:

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);

// これで郵便受けは「手紙の中身だけ」を確認し、指示は無視するようになります

対策②:そもそも「不要な機能」を使わない

XMLは非常に多機能ですが、現代のWebアプリケーションでは、そこまで複雑な機能が必要なケースは減っています。もし可能なら、設定で「DOCTYPE宣言」自体を完全に無効化してしまうのが最も安全です。

対策③:JSONへの移行(究極の防犯対策)

「XMLの防犯設定、覚えるのが大変だな……」と感じたら、思い切って「JSON」への移行を検討しましょう。

JSONはデータ交換に特化したシンプルな形式で、XMLのような「外部から命令を読み込む」といった複雑な機能(悪用される隙)がそもそも存在しません。最近のWeb APIの主流もJSONです。玄関を「防犯機能付きの郵便受け」にするのではなく、「そもそも郵便受けを撤去して、安心な宅配ボックスに変える」イメージですね。

3. なぜ今、この話をするのか

セキュリティの世界には「昔からある攻撃は、今でも一番効果的だから使われる」という鉄則があります。攻撃者にとって、古いライブラリのまま放置されたプログラムは、鍵の壊れた玄関と同じです。

皆さんが書くコード一つひとつが、ユーザーの大切な情報を守る「鍵」になります。

1. まずは今の設定を確認しよう: 自分が使っているライブラリで「外部エンティティ」が許可されていないか、ドキュメントを見てみましょう。
2. 小さく修正しよう: 怖いかもしれませんが、設定を無効にするだけで劇的に強固になります。
3. シンプルを心がけよう: 複雑な機能は、時に攻撃者の武器になります。

セキュリティ対策は、一度やって終わりではありません。でも、こうして「仕組み」を理解すれば、怖がる必要はありません。一歩ずつ、確実に。あなたのアプリケーションを、より安全な場所にしていきましょう。

もし現場で「この設定、本当に大丈夫かな?」と迷ったら、いつでもまたここに戻ってきてくださいね。応援しています!

コメント

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