Security
7 min read
1527 views

Billion Laughs Attack: XMLのエンティティ展開でサーバーがダウン

IT
InstaTunnel Team
Published by our engineering team
Billion Laughs Attack: XMLのエンティティ展開でサーバーがダウン

1KB未満の小さなXMLファイルが指数関数的なエンティティ展開を通じてメモリを圧迫し、サーバーをクラッシュさせる仕組み.

はじめに:笑いが武器になるとき

サイバーセキュリティの世界では、最も予期しない場所から最も破壊的な攻撃が生まれることがあります。Billion Laughs攻撃、別名XML爆弾や指数エンティティ展開攻撃は、一見無害に見えるXMLドキュメントが企業のサーバーを崩壊させる例です。このDoS(サービス拒否)攻撃は、XMLパーサーの基本的な機能を悪用し、その役立つエンティティ展開能力を破壊的な武器に変えます。

2002年頃に最初に報告され、2008年頃から広く注目されるようになったこの脆弱性は、現代のアプリケーションにも影響を及ぼし続けています。2024年や2025年の最新のCVEs(例:LangChainライブラリのCVE-2024-1455やサイトマップパーサーのCVE-2025-3225)も、この攻撃ベクトルが発見から20年以上経った今もなお重要であることを示しています。

XMLエンティティとDTDの理解

攻撃の仕組みに入る前に、XMLエンティティの仕組みを理解しましょう。XML(拡張可能マークアップ言語)は、開発者がエンティティ—再利用可能なコンテンツの断片—をDocument Type Definition(DTD)内で定義できる仕組みを持ちます。これらのエンティティは変数や定数のように機能し、XMLドキュメント内で参照されます。

DTDには2種類あります:

内部DTD:XMLドキュメント内に直接定義され、<!DOCTYPE>宣言と閉じ括弧の間に埋め込まれます。

外部DTD:別ファイルに定義され、URI参照を通じてXMLドキュメントにリンクされます。

エンティティは、頻繁に使われるテキストの定義や外部ファイルの参照など、正当な目的で利用されます。しかし、この柔軟性は、再帰的なエンティティ定義と組み合わさると危険な攻撃面を生み出します。

Billion Laughs攻撃の構造

この攻撃の定型的なペイロードは、そのシンプルさゆえに破壊的です。攻撃の構造は次の通りです:

<?xml version="1.0"?>
<!DOCTYPE lolz [
  <!ENTITY lol "lol">
  <!ELEMENT lolz (#PCDATA)>
  <!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
  <!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
  <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
  <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
  <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
  <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
  <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
  <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
  <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
]>
<lolz>&lol9;</lolz>

どのように指数展開が機能するのか

この攻撃は、lolからlol9までの10個のエンティティを定義します。最初のエンティティは単に文字列「lol」を含みます。次のエンティティは、前のエンティティを10回参照します。XMLパーサーがこのドキュメントを処理するとき、&lol9;に遭遇します。

数学的には次のように展開されます:

  • &lol9;&lol8;を10回展開
  • &lol8;&lol7;を10回展開
  • これが再帰的に続き、&lol;まで展開される

結果として、文字列「lol」の10^9(10億)コピーを含むドキュメントになります。この小さなXMLファイルは、サイズは1キロバイト未満ですが、メモリ上では約3ギガバイトに膨れ上がります。「Billion Laughs」という名前は、この10億回の「lol」の繰り返しからきています。

二次的な爆発:Quadratic Blowup

セキュリティ研究者や攻撃者は、防御策を回避するためのバリエーションを開発しています。quadratic blowup攻撃は、深くネストされたエンティティの検出を回避するために異なるアプローチを取ります。

再帰的なネストの代わりに、大きなエンティティを1つ定義し、何千もの文字を含め、そのエンティティを何千回も参照します。約200キロバイトのペイロードがパース時に2.5ギガバイトに膨張します。この方法は、深くネストされたエンティティ構造を検出するパーサーの対策を回避します。

実世界の影響と歴史的事例

WordPressとDrupalの脆弱性(2014)

2014年、数百万のWordPressやDrupalのインストールがXMLのquadratic blowup攻撃に脆弱であることが判明しました。PHPのXMLプロセッサの脆弱性により、攻撃者はCPUとメモリの枯渇を引き起こし、サイトをダウンさせたり、データベースに過剰な接続リクエストを送ったりしました。

MediaWikiの脆弱性(2015)

バージョン1.24.2以前のMediaWikiは、SVGアップロードやXMPメタデータの解析を通じてBillion Laughs攻撃に脆弱でした。これにより、無害に見えるファイルアップロードを通じて攻撃が拡散する可能性が示されました。

最新のAIフレームワークの脆弱性(2024-2025)

最先端技術も例外ではありません。CVE-2024-1455は、人気のLangChain AIライブラリに影響し、特定のコンポーネントのXML解析を悪用したBillion Laughs攻撃が可能でした。これは、脆弱性が従来のWebアプリケーションだけでなく、最新のAIインフラにも及ぶことを示しています。

XML以外の攻撃ベクトル

もともとXMLを対象としていましたが、Billion Laughsの概念はマクロやエンティティ展開をサポートする他のフォーマットにも適用されます。

YAMLパーサ

YAMLパーサは、アンカー(&)やエイリアス(*)を通じて再帰的な参照を可能にし、デシリアライズ時に指数関数的なデータ展開を引き起こすリスクがあります。PyYAMLライブラリには、この攻撃パターンに関する脆弱性が報告されています。

SVGや画像のメタデータ

SVGファイルはXMLベースであり、Billion Laughsペイロードを含むことができます。同様に、PDFやJPEGのXMPメタデータもXML爆弾を含むことがあり、メタデータ抽出ツールの脆弱性を突きます。

JSONの考慮点

JSONはネイティブのエンティティサポートを持ちませんが、深くネストされた構造や再帰的な構造を通じてDoS攻撃が行われることがあります。JavaのJacksonライブラリは、CVE-2020-36518の脆弱性により、無制限のネストがスタックオーバーフローを引き起こす例もあります。

一般的な攻撃シナリオ

攻撃者は複数の経路を通じてBillion Laughsペイロードを仕掛けることが可能です:

WebアプリケーションのPOSTリクエスト:悪意のあるXMLを直接エンドポイントに送信(例:SOAPサービスやREST API)。

ファイルアップロード:SVG画像やOfficeドキュメント(DOCX、XLSX)、その他XMLを含むファイルをアップロードし、サーバー側で解析させる。

SOAPメッセージ:SOAPを利用するエンタープライズWebサービスは、信頼できないXMLペイロードを処理する際に特に脆弱です。

設定ファイル:XML設定ファイルをユーザーから受け入れるアプリケーションは、意図せず悪意のあるエンティティを処理してしまう可能性があります。

防止と対策

Billion Laughs攻撃からアプリケーションを守るには、多層的な防御策が必要です。

1. DTD処理を完全に無効化

最も効果的な防御は、DTD(Document Type Definition)の処理を完全に無効にすることです。DTDを許可しない設定にすれば、ほぼすべてのXMLエンティティ攻撃は防止できます。OWASPのガイドラインでも、これを最優先の防御策としています。

2. エンティティ展開の制限

DTD処理を無効にできない場合は、エンティティ展開の制限を厳格に設定します。例えば、.NETアプリケーションではMaxCharactersFromEntitiesプロパティを使って展開可能な文字数を制限できます。JavaではXMLConstants.FEATURE_SECURE_PROCESSINGを有効にします。

3. セキュアなパーサー設定の利用

各言語に応じた設定例:

Javahttp://apache.org/xml/features/disallow-doctype-declをtrueに設定

Pythondefusedxmlライブラリを使うか、resolve_entities=Falseを設定

PHP:バージョン8.0以前は外部エンティティの読み込みを明示的に無効化。PHP 8.0以降はデフォルトでXXE防止

.NET:バージョン4.5.2以降は組み込みの保護機能がありますが、古いバージョンはDtdProcessingProhibitまたはIgnoreに設定する必要があります。

4. 遅延エンティティ展開

すべてのエンティティを即座に展開するのではなく、必要なときだけ展開する設定により、指数展開の影響を抑えます。

5. 代替フォーマットの検討

JSONはXMLの代替として広く使われており、外部エンティティやエンティティ展開をサポートしないため、この種の脆弱性を根本的に排除します。

6. 入力の検証とサニタイズ

XML入力を処理する前に、内容を検証・サニタイズします。<, >, `

Continue from this article into the most relevant product guides and workflows.

Related Topics

#billion laughs attack, xml bomb, xml entity expansion, xml denial of service, billion laughs vulnerability, xml dos attack, xml parser vulnerability, billion laughs example, xml entity injection, xml entity expansion attack, xml parser exploit, xml performance issue, xml bomb attack, billion laughs xml example, xml expansion exploit, xml entity nesting, xml payload explosion, xml parsing denial of service, xml parser configuration, xml bomb prevention, billion laughs attack tutorial, billion laughs mitigation, xml security, xml parser hardening, xml injection prevention, billion laughs owasp, xml entity resolution, billion laughs exploit, xml parser settings, xml external entity, billion laughs dos, billion laughs 2025, xml vulnerability testing, xml parser safe mode, xml resource exhaustion, xml payload analysis, xml input validation, xml denial of service example, xml parsing protection, billion laughs protection, xml recursive entities, xml parser attack detection, xml library vulnerability, xml dos mitigation, xml expansion vulnerability, xml security best practices, billion laughs exploit detection, xml denial of service prevention, xml parser optimization, xml input sanitization, xml security configuration, xml parser resource limits, xml parsing safeguards, xml hardening guide

Keep building with InstaTunnel

Read the docs for implementation details or compare plans before you ship.

Share this article

More InstaTunnel Insights

Discover more tutorials, tips, and updates to help you build better with localhost tunneling.

Browse All Articles