Billion Laughs攻撃とは
コンピュータセキュリティにおける「Billion laughs攻撃」は、主にXMLドキュメントのパーサーを標的とした、Denial of Service(DoS)攻撃の一形態です。この攻撃は、XML爆弾や指数的エンティティ膨張攻撃(exponential entity expansion attack)とも呼ばれています。
概要
この攻撃の基本的なメカニズムは、数個のエンティティを利用して、それらをエンティティ同士で階層的に結びつけることにより、メモリを急激に消費させることです。具体的には、最初に10のエンティティを設定し、その各エンティティは前のエンティティを10倍に増やす役割を果たします。最終的には、最初のエンティティのコピーが10億個生成されることになります。このような調整によって、攻撃者はXMLを解析しているプロセスのメモリ容量を超える負荷をかけることができるのです。
この攻撃は特に、最初のエンティティが
文字列「lol」とされる場合によく知られています。そのため、Billion laughsという名称が付けられました。この攻撃手法については、2002年に初めて報告され、俗に言う「billion laughs攻撃」として広く知られるようになったのは2008年のことです。
対策
この攻撃に対処するための方法はいくつかあります。例えば、各パーサーにおけるメモリ割当の上限を設定することが挙げられます。ただし、ドキュメントの損失を許容できる場合に限られます。また、エンティティを記号的に扱う方法も有効です。これは、実際にコンテンツが必要になるまでエンティティの展開を遅延させる手法です。
コード例
以下はこの攻撃の具体的な例です。あるXMLパーサーが、「&lol9;」というテキストを含むルート要素「lolz」を読み込むとします。しかし、「&lol9;」は「&lol8;」を10個含むエンティティとして定義されています。「&lol8;」もさらに「&lol7;」を10個含む形で定義され、エンティティの展開が進むと、最終的に1KB未満のXMLドキュメントから10億個の「lol」という
文字列が生成され、約3GBのメモリを占有してしまいます。
バリエーション
このBillion laughs攻撃は、指数的なメモリ消費を伴う点が特徴ですが、二次的爆発(quadratic blowup)と呼ばれる別のバリエーションも存在します。こちらは、大きなエンティティを単に繰り返すことでストレージの消費を二次的に増加させ、過剰にネストされたエンティティの検出を回避する効果があります。これは、計算の複雑性理論と関連しています。
Billion laughs攻撃は、任意の参照が可能なファイルフォーマットにも応用される危険性があります。その一例が
YAML爆弾です。このため、信頼できるソースからのデータを使用することが重要であり、不明なデータには参照のないファイルフォーマットの使用が推奨されます。
関連項目
- - Fork爆弾: 再帰的な手法によってシステムのリソースを枯渇させる攻撃の一種。
- - 高圧縮ファイル爆弾: Zipアーカイブを利用した爆弾攻撃。
- - XML外部実体参照攻撃: 特定のサーバーファイルを取得するためにXMLを用いる攻撃。
このように、Billion laughs攻撃はXMLパーサーに対する深刻な脅威であるため、開発者やシステム管理者は対策を講じることが求められます。