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

XMLの「外部エンティティ(XXE)」攻撃を玄関の鍵で例える、セキュリティの基礎

こんにちは。セキュリティの世界へようこそ。今日は、少し専門的に聞こえる「XML外部エンティティ(XXE)攻撃」というものについて、一緒に紐解いていきましょう。

名前だけ聞くと難しそうですよね。でも大丈夫。身の回りの「家の防犯」に例えると、その正体は驚くほどシンプルに見えてきます。

1. XMLと「魔法の合鍵」の仕組み

まず、XMLというデータ形式は「手紙の封筒」のようなものだと考えてください。「誰から、どんな内容で」という情報を整理して送るためのルールですね。

そして、このXMLには「外部エンティティ」という、ちょっと便利な(そして危険な)機能があります。これは、手紙の中に「中身は書いていないけれど、この住所に行けば最新の情報が書いてあるから、それを読んでおいてね」と指示する「参照コード」を書くようなものです。

  • 正常な利用: 「設定ファイルはここにあるよ」とサーバー内の別の場所を指す。
  • 悪意ある利用(XXE): 泥棒が玄関の郵便受けに「家の中の金庫の場所と鍵を開ける方法が書いてあるファイル」を指し示すメモを投げ込む。

XMLパーサー(手紙を開封する係の人)が、このメモを信じて勝手に家の奥深くへ侵入し、機密情報を読み取って攻撃者に渡してしまう。これがXXE攻撃の仕組みです。

2. なぜ「パーサー」は騙されてしまうのか?

開発現場でよくあるのが、「パーサー(解析エンジン)のデフォルト設定」です。

多くのパーサーは、親切心から「外部から指定されたファイルも、言われた通りに読み取りますよ!」という設定になっています。いわば、「怪しいメモが書いてあっても、まずは中身を確認しに行く」という、お人好しな執事を雇っているような状態です。

これが、家のセキュリティで言えば「郵便受けに入っていた怪しいメモをそのまま実行して、家中のドアを解錠してしまう」ようなもの。これが、XXE攻撃が成立する最大の盲点です。

3. どうやって防ぐ?一歩ずつ対策を学ぼう!

対策はとても明確です。「怪しいメモがあっても、絶対に外部のファイルを見に行かない」というルールを、パーサーに徹底させること。これが一番の防御策になります。

例えば、Javaの代表的なXMLパーサーである「DocumentBuilderFactory」を使う場合、以下のように設定を追加します。

// パーサーの設定を安全にするための実装例
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

// 1. 外部からのエンティティ参照(外部ファイルへのアクセス)を無効にする
dbf.setFeature(“http://xml.org/sax/features/external-general-entities”, false);

// 2. パラメータエンティティも無効にする
dbf.setFeature(“http://xml.org/sax/features/external-parameter-entities”, false);

// 3. これらを組み合わせ、DTD(文書型定義)の処理自体を無効化するのがより安全です
dbf.setFeature(“http://apache.org/xml/features/disallow-doctype-decl”, true);

// この設定を終えてから、安心してXMLを読み込みましょう!

4. まとめ:セキュリティは「疑うこと」から始まる

XXE攻撃を防ぐために大切なのは、「パーサーのデフォルト設定を信頼しない」という心構えです。

  • 「外部と通信する機能」は本当に必要ですか? 不要ならオフにするのが鉄則です。
  • 設定を確認しましょう。 使っているライブラリのドキュメントを開き、「XXE」や「External Entity」というキーワードで検索してみてください。
  • 防犯意識を常に持つ。 セキュリティは「一度設定したら終わり」ではなく、新しいライブラリやフレームワークを使うたびに「この執事(パーサー)は怪しいメモを読みに行かないかな?」と確認する習慣が大切です。

最初は難しく感じるかもしれませんが、こうやって少しずつ「穴」を塞いでいく作業は、まるで家を頑丈にしていくようで、実はとても面白い仕事なんですよ。

皆さんが書くコードが、今日も安全でありますように。また次のステップで、一緒にお話ししましょう!

コメント

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