スクリプトの断片化攻撃
PacSec 2008
Stephan Chenette, Security Researcher
Websense Security Labs
本日話したい事
エクスプロイトが成功するか否かは幾つかの条件に基づきます
脆弱なサービスやアプリケーションが
 有効であり(Active)
 アクセス可能である(Accessible)
そのエクスプロイトが
 信頼でき(Reliable)
 検知されない(Undetected)
2
本日話したい事
このプレゼンテーションは以下に焦点をあてています
 エクスプトイト検知の回避
もう少し具体的に言うと
 Webによるクライアントの侵害(ブラウザ、ActiveXコントロール
等のバグ)を検知されないようにする新しい回避テクニック
3
何故これが皆さんにとって重要か
 皆さんは以下の人達であると仮定しています
–
–
–
–
レポータ
研究者
セキュリティ管理者
テクニカル・マネジャー
 新しい攻撃や回避テクニックについて、また、組織をそれらか
ら防御することについて興味がある筈です
4
Webの脅威の基本
 攻撃の傾向はここ数年で変っており、侵入者はWebに焦点を
当てていることが顕著になっています
 殆どの企業・ユーザはファイアウォールでHTTPをブロックして
いません
 クライアントに対する悪意のあるWeb攻撃はデスクトップやゲ
ートウェイでのアンチウィルス及びIDSにて防御することが期待
されています
5
本当はどうでしょう?
 現在のデスクトップやゲートウェアでのアンチウィルスではスク
リプトの断片化攻撃を防ぐことはできません
6
HTTP client/server 間の通信
•GET / HTTP/1.1
•Client ブラウザ
•Web サーバ
7
HTTP client/server 間の通信
•GET / HTTP/1.1
•Client ブラウザ
•Web サーバ
8
現状のデスクトップ/ゲートウェイでの防御
 コンテンツの内容を検査します
9
現状の回避テクニック
 難読化された
JS code
10
回避の成功
 ネットワークの通過する悪意のあるコンテンツは、正常な
トラフィックと見分けがつかないため、検知を回避できる
確率が高い
11
スクリプトの断片化
 スクリプト
アクティブなコンテンツ 例えばJavaScript, VBscript等
 断片化
細かく分割されたデータ
注記: AJAXの悪用については Toorcon 2007 で言及されたが,
ここで話すほど詳細については明らかにされていない。これか
らそれについて話そうと思う…
12
基本のレシピ
 追加機能がなくても以下のみで動作します
 ブラウザ
 JavaScript
 XMLHTTPRequest
 以下のブラウザで問題なく動作します
Internet Explorer, Firefox, Safari, Opera, Konqeror
13
Example 1: Basic HTML document
<html>
<body>
<div id=“target” />
</body>
</html>
14
JavaScript によるDOMの操作
 JavaScriptはDOMを変更する機能(欠点)を持つ
var d = document.getElementById(“target”);
var n = document.createElement(“script”);
n.text = “alert(‘test’);”
d.appendChild(n);
15
New DOM
<html>
<body>
<div id=“target”>
<script>
alert(‘test’);
</script>
</div>
</body>
</html>
16
Example 2: Basic HTML document
<html>
<body>
</body>
</html>
17
JavaScript によるDOMの操作
var text = “alert(‘test’);”
eval(text);
 eval() は引数をスクリプトとして実行する
18
New DOM
<html>
<body>
</body>
</html>
19
スクリプトのパワー
 JavaScriptでは複数文字列を連結することが可能です
 そして、連結された文字列をコードとして実行します
例
var text = “ale” + “rt(“ + “‘te” + “st’” + “);”
eval(text);
20
データの動的な読み出し
<script>
xmlhttp.open(“GET”, “/index.php?q=2+2”, true);
var response = xmlhttp.responseText;
</script>
•GET /index.php?q=2+2
•Client ブラウザ
“4”
•Web サーバ
21
正しいことに使われるテクノロジ
 JavaScript != 悪
 XMLHTTPRequest != 悪
 害のない JavaScript/HTTPXMLRequest テクノロジ
– ガジェット
– ウジェット
– マッシュアップ
 Gmail, orkut, facebook, hi5.com, 等は JavaScript と
XMLHTTPRequest を使用しています
22
スクリプトの断片化の手順
–
サーバに悪意のあるコンテンツを保存する
–
サーバ:クライアントに対しWebページを断片化したスクリプトのデコードルー
チンと共に提供
–
クライアント: XMLHTTPRequest オブジェクトを用いて悪意のあるコンテンツ
の小さい断片のみをリクエスト
–
サーバ:リクエストされた悪意のあるコンテンツの断片を返信
–
クライアント: JavaScript変数にデータの断片を保存し、JavaScriptと
XMLHTTPRequestオブジェクを用いて新しいデータの断片をデータが
なくなるまで要求し続ける
–
クライアント:全てのデータを受信したら組み立てたコードの実行を行う
23
実行手順
 ステップ 1) サーバへの悪意のあるコンテンツの保存
•Web サーバ
24
実行手順
 ステップ 1) サーバへの悪意のあるコンテンツの保存
•Web サーバ
25
実行手順
 ステップ 2) サーバ: クライアントに対し断片化したスクリプトのデコード
ルーチンを提供
•<DECODER>
•Client ブラウザ
•Web サーバ
26
断片化したスクリプトのデコードルーチン
27
実行手順
 ステップ 2) クライアント: XMLHTTPRequest オブジェクトを用いて悪意
のあるコンテンツの小さい断片のみをリクエスト
•GET /index.cgi?o=0&rl=3
•Client ブラウザ
•Web サーバ
28
実行手順
 ステップ 3) サーバ:リクエストされた悪意のあるコンテンツの断片を返信
•“var”
•Client ブラウザ
•Web サーバ
29
実行手順

ステップ 4) クライアント: 断片を保存しデータがなくなるまで断片を
要求し続ける
•GET /index.cgi?o=3&rl=3
•Client ブラウザ
•“ he”
•Web サーバ
•var text = “var he”;
30
実行手順
 ステップ 4) クライアント: 断片を保存しデータがなくなるまで断片を要
求し続ける
•GET /index.cgi?o=6&rl=3
•Client ブラウザ
•“apS”
•Web サーバ
•var text = “var heapS”;
31
実行手順
 ステップ 4) クライアント: 断片を保存しデータがなくなるまで断片を要
求し続ける
•GET /index.cgi?o=9&rl=3
•Client ブラウザ
•“pra”
•Web サーバ
•var text = “var heapSpra”;
32
実行手順
 ステップ 4) クライアント: 断片を保存しデータがなくなるまで断片を要
求し続ける
•GET /index.cgi?o=12&rl=3
•Client ブラウザ
•“yTo ”
•Web サーバ
•var text = “var heapSprayTo”;
33
実行手順

ステップ 5) クライアント:全てのデータを受信したら組み立てたコードの
実行を行う
•Client ブラウザ
•// Method 1
•eval(text);
•// Method 2
•var div = GetElementById(‘target’);
var n = document.CreateElement(“script”);
n.text = text;
div.appendChild(n);
34
可能性
基本のスクリプト断片化攻撃の応用
 オフセットをランダム化する
 XOR/暗号化
 複数のWebサーバにデータを分散させる(ボットネット)
 最後の瞬間まで文字列をメモリ内に暗号化して保持する
35
データ転送のオプション
XMLHttpRequestは動的なHTTPリクエストを行うためのオ
ブジェクトですが、その他にもデータ転送に使用できる複
数のデータフォーマットがあります
 RAW
 XML
 JSON
 その他.…
36
RAW data フォーマット
•GET /index.cgi?o=0&rl=3&u=guid
•Client ブラウザ
“var”
•Web サーバ
37
XML dataフォーマット
•GET /index.cgi?o=0&rl=3
•Clientブラウザ
“<Data eof=“0” text=“var” />” •Webサーバ
38
JSON dataフォーマット
•GET /index.cgi?o=0&rl=3
•Clientブラウザ
// S = server resp.
var data = eval(S);
var text = data.text;
“{
eof : “0”,
text : “var”
•Webサーバ
}”
39
全ての主要なブラウザで問題なく動作
 実証コードのデバック出力
40
アンチウィルスはスクリプトの断片化を検知できない
 初期ページはスクリプトタグにデコードルーチンを持ちbodyは


ブランク
ディスク上のファイルは変更されない
メモリ内のDOMも変更されない
 コンテンツは悪意のあるものとして検出されない!
41
実証ページ
42
ディスク上のHTMLファイル
 ディスク上のファイルは前後で同じ
 C:\Documents and Settings\<USER>\Local
Settings\Temporary Internet Files
43
メモリ内のDOM
 メソッド 1: DOM は全く変更されない
44
メモリ内のDOM
 メソッド 2: DOMのみ変更
45
勝利!
 スクリプトの断片化は現状のデスクトップ・ゲートウェイ
でのアンチウィルスが検知するできない非常に有効な回避
攻撃です
46
結びの言葉
 怖がらせましたか?
….ごめんなさい
 この攻撃はまだ数年先のものでしょう
 実際に使用されたことはまだありません
 難読化は未だに最大の問題です
47
考えられる解決策
 デコードルーチンの検知
 ネットワークのアノーマリの検知
 “feedback loop”の使用と遠隔地での実行
 ブラウザへの防御策の追加? 恐らくセキュリティより機能性の
方が勝るのではないでしょうか
48
ありがとうございました
 ご質問をどうぞ?
Stephan Chenette, Websense Security Labs
[email protected]
 Webサイトとブログを参照下さい。
 http://securitylabs.websense.com/content/blogs.aspx
 http://securitylabs.websense.com/
49
ダウンロード

スクリプトの断片化攻撃 - GentooJP Server / macaroni.gentoo.gr.jp