
非常に長い名前のBlobでFirefoxをクラッシュさせる攻撃 29
新バグ 部門より
CSSを使用してSafariをDoS攻撃する実証コードが先日話題になったが、作者のSabri Haddouche氏(pwnsdx)が今度はJavaScriptを使用してFirefoxをDoS攻撃する実証コードを公開している(Bleeping Computer、BetaNews、Neowin)。
この攻撃は非常に長い名前のBlobを生成して繰り返しダウンロードさせることでFirefoxがクラッシュするというもの。条件によってはOSがクラッシュすることもあるという。実証コードはGitHubで公開されているほか、Webサイト「Browser Reaper」で実際に動作を試すことも可能だ。Windows 10上のFirefox 62で試してみたところ、メモリ使用率が大きく増加していき、Windows自体の操作も困難になった。長い時間はかかったものの何とかPCをスリープさせることができ、復帰後にFirefoxのみクラッシュしたが、放置すればWindowsごとクラッシュするかもしれない。なお、Bleeping Computerの記事ではモバイル版のFirefoxには影響しないとしているが、Android版Firefoxで実行して放置するとアプリがクラッシュした。
この攻撃は以前話題になったGoogle Chromeに対する攻撃と似ている。ChromeのデフォルトではWebサイトによる複数ファイルの連続ダウンロードにユーザーの許可が必要になるため、許可を求めるダイアログで「ブロック」をクリックすれば攻撃を回避できる。ただし、Chrome 69ではダイアログが出たまま放置するとフリーズした。Windowsの応答も遅くなったが、タスクマネージャーでChromeを終了させることは可能だった。Microsoft Edgeの場合はダウンロード確認の通知が表示され、一時的にメモリ使用率が増加するものの、しばらくするとページがリロードされて元の状態に戻った。
MozillaのBugzillaでは複数ファイルの自動連続ダウンロードに対する保護の必要性が2年前から議論されている。ただし、今回の実証コードに対するバグリポート(報告者はおそらくHaddouche氏)は複数ファイルのダウンロードではなく、Blob URLの扱いに関するバグ1438214に統合された。バグ1438214は2月から議論されているが、こちらも現在のところ有効な解決策は出ていないようだ。
Browser ReaperではSafariに対するDoS攻撃の実証コード(Reap Safari)と今回の実証コード(Reap Firefox)に加え、Chromeに対するDoS攻撃の実証コード(Reap Chrome)を試すこともできる。こちらは履歴のナビゲーションをループさせる攻撃だ。Chromeでは実行後しばらくするとタブがクラッシュし、Edgeではページがリロードされた。一方、Firefox上ではReap Firefoxの実行時と同様の状態になってしまった。
メモリ使用量を膨らませる攻撃 (スコア:2)
これ、症状の記述だけから見て取れるのは、メモリ使用量を膨らませる攻撃なんだよね。
遅くなる話はメモリ使用量増加によるスラッシングだろうし、クラッシュはメモリもswap(=ディスクの空き)も使い切って次のメモリ確保に失敗したからだよね。
リークじゃなくて、ダウンロードが全部完了するまでメモリ開放しないからってことかな?
Re: (スコア:0)
実際に動かしてみたら、保存先の確認が出て、どうしようかなーと思っている10秒ぐらいでブラウザがクラッシュした。
複数ダウンロードの許可を求めてきたけど、許可も拒否もしないのに先のプロセスに進んでしまったので意味をなさないっぽい。
実証コードは生成したBlobを猛烈な勢いで保存しようとしているだけ。悪意がなくてもバグでやらかしそうな感じのコードだなこれ。
Re:メモリ使用量を膨らませる攻撃 (スコア:1)
どうせ二択なんだからボタンが押されるのを待っている間にもある程度ダウンロードしておけば結果的に待ち時間が短くなる。キャンセル押されたらメモリ内にダウンロードした内容を破棄すればいいだけ。デメリットは無駄なトラフィックを生んだことくらい。
巨大なデータをダウンロードすることは十分考えられるので、たぶん先読みサイズの上限みたいなものは設定されてると思われる。
確認ダイアログに表示するためにファイル名を取得する必要がある。
「非常に長いファイル名×膨大な応答待ちダイアログ」という形でダウンロード待ちが増えることによって、データ自体はダウンロードしてなくても大量にメモリを消費させることができる。
つまりダイアログにファイル名を表示していれば、先読みをやめても何の解決にもならないかも。
うじゃうじゃ
素人考え (スコア:0)
非常に長い名前のBlobを読み込まない様にすれば良いだけなのでは・・・
Re: (スコア:0)
今から1億文字の長さの名前のデータ送るんでよろしく!
Re: (スコア:0)
非常に長いと言っても27KBぐらいですからねえ。
Re: (スコア:0)
長いでしょ。
Windowsじゃ260文字までしか使えないのだから
Re: (スコア:0)
手元ところで確認したら9128000バイト≒8.7MBだったんだけど、その数値はどこから?
Re: (スコア:0)
ごめんなさい、コード斜め読みでrepeat()は処理繰り返してる部分かなとか思ってた。27KBは生成元の文字列(というかソースコードのファイルサイズ)。
8MBだとちょっと大きいね。
マイナンバーカード対策 (スコア:0)
氏名:じゅげむじゅげむごこうのすりきれかいじゃりすいぎょのうんらいまつふうらいまつ・・・あと忘れた
Re: (スコア:0)
ここに記すには余白が狭すぎる。
Re: (スコア:0)
一応、残りは以下の通り...
くうねるところにすむところ
やぶらこうじのぶらこうじ
ぱいぽぱいぽぱいぽのしゅーりんがん
しゅーりんがんのぐーりんだい
ぐーりんだいのぽんぽこぴーの
ぽんぽこなーの
ちょうきゅうめいのちょうすけ
Re: (スコア:0)
最初に聞いたバージョンだと
五劫の擦り切れズ、だったんだよね
「五劫の擦り切れ」より永いとか言ってた。アドリブだったのかな
Re: (スコア:0)
「五劫」経過後も擦り切れない=事実上不滅ってことで,漢文的にいうと「不レ擦切」なんじゃ?
逆に「擦り切れ」だと五劫でなくなっちゃってるような印象
ブラウザのDoSも脆弱性なのか? (スコア:0)
普通に開発していても、間違って変なコード書いてしまうとハングしてにっちもさっちもいかなくなることって結構あると思うが。
Re: (スコア:0)
ブラウザがDoSになるのはしょうがないとしても、OS巻き込んでるのは良くないね。というか、そろそろOSはCPUとメモリをUI側に取っておく工夫がいるんじゃないかな。
Re: (スコア:0)
ブラウザがDoSになるのはしょうがないとしても、OS巻き込んでるのは良くないね。というか、そろそろOSはCPUとメモリをUI側に取っておく工夫がいるんじゃないかな。
ブラウザがDOSでOS巻き込むならメモリは640kbでじゅうぶんですよ!(違
Re: (スコア:0)
もうそうなると、(物理)メモリで無く、仮想記憶(ページファイル)が阿鼻叫喚なのでは?
アプリのプロセスはすべてゼロテスターで、System(PID=4)だけ鬼の様に動いている
状況では?
Re: (スコア:0)
趣味で書いてたスクリプトが、AndroidのChromeを確実に強制終了させるようになっちゃったことがある。このストーリーと同じく大量のデータをダウンロードするようなスクリプトだったけど。
で、Chromeは、「最後に開けていたページのURL」を覚えてから死んだようで、次に起動すると、前回異常終了したのでなるべく元通りに復帰しようとして、そのページを開けて落ちる、と言う状態でハマった。
単発で落ちるだけならまだしもだけど、もう2度とChromeを使えない状態に陥るのはソフトウェアとしてダメだと思う。
ウェブページの方を消してから再起動で、死のループを断ち切れたけど、そうじゃなかったら、データ・キャッシュのクリアとかが居るのかも知れない。あるいはセーフモードで起動、的な方法も用意されてたりするのかな?
Re: (スコア:0)
少なくともMSは任意コード実行につながらないような単なるDoSはセキュリティパッチを提供する必要のある脆弱性とは認めていないね(ただし普通にその後修正されることはある)。
alloc上等という風潮 (スコア:0)
もう、buffer overflow is error でいいんじゃないかとつくづく。
なんのためのC/C++ なのか。
Firefoxはダウンロード周りがおかしい (スコア:0)
何か潜んでるとしか思えない
メモリがあればあるだけ使ってしまうのが悪い (スコア:0)
たとえ64bitアプリでも、標準でメモリ最大1Gとか2Gとか4Gとかしかつかわないようにして、
それを超えたらOSがプロセス強制停止するようにすればいいとおもう
作成するファイルの最大サイズにも標準で制限加えるとかね
もちろん、本当にメモリが必要なアプリは、コンパイルオプションでリミッターはずすことも可能とか
Re: (スコア:0)
ほとんどの64bitアプリがリミッターはずしてコンパイルされることになるだけでは。
Re: (スコア:0)
普通の OS なら、前世紀からメモリ最大量とかディスク使用量とか、OS 側から制限できるよ。
# Windows の事は知らないけど、最近のであれば出来ないわけがないよね。
Re: (スコア:0)
普通のOSがどんなものか知らんが、アプリ毎にディスク使用量を設定できるOSは知らんな。
Re: (スコア:0)
Quotaとか、結構昔からあるありふれた機能なんだけどね。
Windowsだってやろうと思えば出来るよ、ただやろうとしないだけでね。
Re: (スコア:0)
アプリ毎に異なるUIDを振る。
初期状態の /etc/passwd にもその手のエントリが入ってるでしょ。
Re: (スコア:0)
一度メモリ不足が発生すると、リカバリしようとしてもその処理を行うためのメモリが取得できる可能性が危ういから、
大人しくクラッシュさせてしまうのが定石。それでもよければ。
でも、最近はChromeみたいにプロセス大量に作る奴が多いし、子機能は別のexeを持ってたり、
vbsだのpowershellだの共用のエンジン使う奴はどーすんのとか、細かく設定定義するのは大変よ?