特徴 2
Webサイト経由の攻撃では、攻撃コードがJavaScriptで書かれており、そのコードは難読化されていることが多い。難読化とは、ぱっと見てどんな処理がされるか分からないようにコードを複雑にすることである。JavaScriptはユーザのブラウザ上で実行されるため、コードそのものをユーザが見ることができる。そのため、コードを読まれたくない開発者は、コードを複雑にして読みにくくするのだ。下記に難読化の例を紹介しよう。
function inputFunction(){
var Str1 = "funcA";
var Str2 = " Done.";
var Str3 = Str1 + Str2;
alertFunction(Str3);
}
function alertFunction(str){
alert(str);
}
inputFunction();
上記のような簡単な関数があったとする。これをJavaScript難読化ツールの一つ、ObfuscateJSで難読化すると、下記のように変換される。空白、タブといった削除可能な文字を削除し、変数名が単純なものに置換されている。このツールでは、関数名が置換されていないが、実際には関数名も変数名と同様に置換されることが多い。
function inputFunction(){var aa="funcA";var ba=" Done.";var
ca=aa+ba;alertFunction(ca);}
function alertFunction(da){alert(da);}
Mpackの事例では、JavaScriptの各オブジェクトが持つ、eval(), unescape()といった関数を利用して、一見するとどんな処理を実施しているか分からないように攻撃コードを作成しておく。
<script language=javascript>document.write(unescape("%3Cscript%20language%3DJavaScript%3Efunction%20dc%28x%29%7Bvar%20l%3Dx.length%2Ci%2Cj%2Cr%2Cb%3D%282048/2%29%2Cp%3D0%2Cs%3D0%2Cw%3D0%2C%20t%3D
(割愛)
x1bYjkaLxDnH%22%29%3C/script%3E"))</script>
攻撃コードの難読化には、解析を難しくする以外にIntrusion Detection System (IDS)/ Intrusion Prevention System (IPS) に検知・遮断を回避するという利点がある。難読化されたJavaScriptコードは、ユーザのブラウザで解析され、実行される。IDS/IPSでは難読化されたまま、パターンマッチングして、攻撃であるかを精査する。難読化された攻撃コードは不特定の文字列でできており、検査パターンを作れない。JavaScriptの関数を検知するシグネチャを作ると誤検知が多くなってしまう。IDS/IPSではWebサイト経由の攻撃を検知するのが難しいのが現状である。
では次に、Webサイト経由の攻撃で悪用されるブラウザ関連コンポーネントの脆弱性を見ていこう。