ブラウザクラッシャー(ブラクラ)防御法

注意:Proxomitronでブラクラを完全に封じ込めるのはかなり大変で、無理と言っても過言ではないと思います。
また、ブラクラ対策に凝ると、逆にまともにサイトが見られなくなることもあります。
更に最近はブラクラも見かけませんので、あまり凝らないことを勧めます。

ちなみに、ブラクラが減った理由としては、
PCのスペック向上、OSの安定化により、ブラクラを踏んでも大して害が無くなった。
インターネットで求められるサービスの大半は既にまともなところがやっており、その様なサイトしか利用しない場合ブラクラなど見かけない。
時代遅れの上に意味がない(大して効果がない)ので誰もブラクラを作らなくなった。
などがあると思われます。

FDD/CD-ROM アタック Edit

file:// を使うことにより、FDD/CD-ROMへのアクセスを繰り返すブラクラ。

<img src="file:///A:/test1.txt">
<img src="file:///A:/test2.txt">
<img src="file:///A:/test3.txt">

回避するには、fileスキームを無効化すればよい。

[Patterns]
Name = "Kill file scheme [2007/06/01]"
Active = TRUE
URL = "$TYPE(htm)"
Limit = 256
Match = "(<[^>]++\s)\0(href=|src=)$AV((file://*)\1)(^(^[ >]))"
Replace = "\0title="Killed \1""

テーブルネスト Edit

<table> の入れ子の階層が深くなると、ブラウザの描画速度が低下する。
特に、古いブラウザではその傾向が顕著のようだ。(現在のブラウザは描画速度が上がっているので、まず影響しない)

以下のフィルタは、<table> が入れ子で5つ以上存在するとき、<table> を削除した上で、以降の接続を切断する。
(TOC氏のフィルタ「Kill Excessively Nested Tables (2002/05/14)」からアイデアを得て、作成した。
「Kill Excessively Nested Tables」は正常に動作しない事があるようだ。)

[Patterns]
Name = "Kill Excessively Inner Nested Tables [2007/06/01]"
Active = TRUE
URL = "$TYPE(htm)"
Limit = 2048
Match = "<table[ >]$INEST(<table[ >],"
        "*<table[ >](((^</table>)?)++<table[ >])+{3}*"
        ",</table>)"
        "$STOP()"
Replace = "\k\r\n<p><strong style="color: red">[Killed excessively nested tables]</strong></p>"

mailto ストーム Edit

メールソフトを起動するタグを多数記述し、メールソフトを多重起動させるブラクラ。
(現在のブラウザは対策済みなので、よほど古いブラウザを使っているのでなければ、mailtoストームに遭遇することはないだろう)

<img src="mailto:user1@hogehoge.com">
<img src="mailto:user2@hogehoge.com">
<img src="mailto:user3@hogehoge.com">

mailtoストームを回避するには、mailtoの「正しい使い方」と「正しくない使い方」を見分ける必要がある。
HTML4.01の文法上、mailtoスキームが使われる可能性があるのは、次の3通り。(メールアドレスは適当)

<a href="mailto:user@hogehoge.com">user@hogehoge.com</a>
<link rev="made" href="mailto:user@hogehoge.com">
<form method="post" action="mailto:user@hogehoge.com" enctype="multipart/form-data"></form>

それ以外の使い方では、mailtoストームが発生する可能性がある。
そこで、「a要素, link要素 以外の要素」の「href属性 / src属性」にmailtoが含まれている時に、その属性を削除することで回避する。
(action属性はユーザーが操作しない限り、作用しないので考慮しなかった。)

[Patterns]
Name = "Kill wicked mailto [2007/06/01]"
Active = TRUE
URL = "$TYPE(htm)"
Limit = 256
Match = "(<(^a\s|link\s)[^>]++\s)\0(href=|src=)$AV((mailto:*)\1)(^(^[ >]))"
Replace = "\0title="Killed \1""

要素自体を削除しても良かったが、終了タグへの対応が面倒なので、タグは残しつつ、無効化した。

ブラウザなどのバグを付く Edit

ActiveXObject('htmlfile') + iframe でタブ地獄 Edit

IE7にて、new ActiveXObject('htmlfile')で作成したHTMLDocumentに、<iframe src="~#アンカー名"></iframe>のように、srcにアンカー付きのURIを指定したIFRAME要素を書込むと、何故かブラウザのタブが一杯開いて収集がつかなくなる、という訳のわからない現象に遭遇

http://furyu.tea-nifty.com/annex/2008/04/jscriptactivexo_874a.html

IE8でも発生

IE6/7 を一撃でクラッシュさせる Edit

ぼくはまちちゃん!(Hatena) - IEを華麗に撃墜する一行 TR/HTML.Crashie.E

http://pc11.2ch.net/test/read.cgi/win/1175925637/559-

559 :名無し~3.EXE :sage :2007/08/07(火) 11:54:49 ID:baaR9pRV
はまちちゃんのクラッシュバグを、自分が解析した結果は以下の通りです。

IE 6/7 は、table 要素内に (tbody | tr) 要素がコードに存在しない場合、
自動的に tbody 要素を補います。しかし、この様にフォーム要素が
隣接している場合、フォーム要素の後の不正な位置に tbody 要素を補い、
その副産物として不正な空要素が作成されます。

サンプル1 : 不正な空要素が table 要素と フォーム要素の間に生成されている。

<head><script>
function funcA(){
var elms = document.getElementsByTagName('*'); var tagStr = '';
for (i=0 ; i < elms.length; i++) {
window.alert(elms[i].tagName+' ['+elms[i].tagName.length+']');
tagStr += elms[i].tagName + '\n';
}
window.alert(tagStr+'this page used '+i+' elements');
}
</script></head><body onload="funcA()"><table><input>


560 :名無し~3.EXE :sage :2007/08/07(火) 11:56:32 ID:baaR9pRV
上のサンプルで実験した結果、TABLE要素の次に不正な空要素が存在する事が
確認できます。従って、次のコード(サンプル 2)でもクラッシュするはずです。

サンプル 2: TABLE要素の次に隣接する不正な空要素でクラッシュする

<style>table *{position:relative}</style><table><input>

なお、クラッシュは、以下の要素の組み合わせでも発生します。
table + (legend | button | input | textarea | select | input)


561 :名無し~3.EXE :sage :2007/08/07(火) 12:22:27 ID:baaR9pRV
実際にサンプル2で使われている例は、隣接セレクタでなく子孫セレクタでしたね。

ちなみに、サンプル 1 の forループの内側末行に

if(elms[i].tagName.length == 0) {
if(window.confirm('clash style setting ?')) { elms[i].style.position = 'relative';}
}

を挿入して、position = 'relative'にする事でもクラッシュが確認できます。

concon クラッシャー Edit

<img src="file:///c:/con/con/con.con">

などでWindows9x系が停止する con以外にもnulなどでも動く

JavaScript でブラクラを出力する Edit

JavaScript は暗号化も可能なので、Proxomitron で書き換えるだけでは完全な無効化はできない

JavaScript で JavaScriptによるブラクラ(無限ループなど)を出力/実行する Edit

JavaScript は暗号化も可能なので、Proxomitron で書き換えるだけでは完全な無効化はできない

eval() で実行する場合は、window.eval = function(){} のように代入可能なので、書き換え可能だが、
onmouseover などにセットされたり、innerHTML, appendChild などで script タグを挿入し実行された場合、対処不能(?)

JavaScript の無限ループ Edit

for、while、setInterval、setTimeout、再帰関数 などで無限にループさせる事が可能

CPU使用率100%化 Edit

<script type="text/javascript">
for(;;);
</script>
<script type="text/javascript">
while(1);
</script>

※setInterval では100%化は出来ない様子

防御法

無限アラート/コンファーム/プロンプト/ウインドウオープン/印刷ダイアログ Edit

<script type="text/javascript">
for(;;) alert();
</script>
<script type="text/javascript">
while(1) alert();
</script>
<script type="text/javascript">
setInterval('alert()', 1)
</script>

防御法

その他 Edit

フィッシング詐欺等 Edit

信頼出来るサイトのpromptと思い込ませて、情報を盗む(タブブラウザ共通の脆弱性)
IE6, IE7 は駄目 Opera9.25, Firefox2.0.11 は大丈夫(何もしなくてもURLが表示される&別のタブにフォーカスがある場合ダイアログが表示されない)
IEの場合、fileuser.js の様な方法で、promptを上書きして、メッセージの最初にURLを表示するようにするとか、「url」を入力するとURLを表示するようにするとかする必要がありそう。
Internet Explorerの「スクリプトによる貼り付け処理」でクリップボードの内容が盗まれる
IE6 SP2 以降では標準の設定で「ダイアログを表示する」になっているので問題ない。
ただし IE コンポーネントタブブラウザではその状態でも盗聴される欠陥を持つものもあるので、 タブブラウザ側の設定を変更したりアップデートするなどの対策が必要。
タブブラウザ側で対策できない場合はインターネットオプションで「無効にする」に変更する必要がある。
クリップボードにマルウェア配布サイトのURLを書き込まれる
前項はクリップボードから読み込み機能によるものだが、クリップボードへの書き込み機能においても、 マルウェア配布サイトやフィッシングサイトなどのURLを書き込まれるという問題がある。

同じ「スクリプトによる貼りつけ処理」機能に属する問題で、対策は前項と同じ。

加えて、古い Flash Player にはユーザの意図しないタイミングでクリップボードの書き込みが行われてしまう脆弱性があるため、 Flash Player 10 以降にアップデートする。

IEがHTMLじゃないのにHTMLとして処理してしまう現象 Edit

頭から 200Byte 内に <(html|head|title|body|script|img|table|pre|plaintext)> がある。
または、
頭から 200Byte 内に <(html|head|title|body|script|img|table|pre|plaintext)? があり、そのあと範囲未指定で *> にマッチする場合、
例えば text/plain で 拡張子も .txt であっても、HTMLとして処理してしまう。
Proxomitronなどでブラクラを潰したい場合は、この動作に気をつける必要がある。
※IE6で確認 大文字小文字区別せず 確認した全てのタグ:http://www.htmq.com/html/index.shtml 最終確認日:2007/08/11

対策

コメント Edit



添付ファイル: fileAnti_Browser_Crasher030529.zip 258件 [詳細] fileuser.js 352件 [詳細]

複製名前変更