不正なコードを読み込ませられても,セキュリティ対策ソフトで検出できるのではないかと考える人も多いだろう。だが,最近ではこれらのソフトの目をごまかす改造が凝らされている。セキュリティ対策ソフトを使っていても,すり抜けられてしまうケースが増えているのだ。第2回では,こうした防御をかいくぐるトリックを解説する。

コードの難読化で検出を逃れる

 典型的なのは「コードの難読化」と呼ばれるもの。攻撃コードとしての効果は変えずに,文字列やビット列のパターンを変えてしまう。簡単に言えば,暗号化の一種と考えればよい。パソコンに渡すデータを別のパターンに変えることで,パターン・マッチングで不正なコードを見つけるセキュリティ対策ソフトのチェックをかいくぐる。

 難読化の方法は無数にある。不正なコードはスクリプトの形で送られることが多い。簡易プログラミング言語であるスクリプトなら,かなり複雑な処理でも,Webブラウザで実行できてしまう。

 スクリプトを難読化する典型的な手口を確認してみよう(図2-1)。例えば,コードを途中で分割するという方法がある(図2-1のa)。スクリプトを途中で分割して「+」といった文字を間に挿入することで,パターンを別のものに変えるというものである。例えば,セキュリティ・ホールが見つかっているWebViewというWindowsのモジュールを呼び出す「WebViewFolderIcon」というコードを「'WebV'+'iewFol'+'de'+'rI'+'con'」といった書き方をする。同様に,わざと無意味な文字列を挿入すると言った手も使われる。

図2-1●不正なコードであることを偽装する工夫の例
図2-1●不正なコードであることを偽装する工夫の例
文字列を分割して「+」でつなげたり(a),文字の表記方法を変えたり(b),別の文字に対応付けたりする(c)ことで,セキュリティ対策ソフトでのパターン・マッチングによる検出を回避する。これ以外に,無駄なコードを挿入するなどの手法もある。

 まったく別の文字列に置き換えるという手もある(同b)。例えば,スクリプトの文を,strings関数でアスキー・コード以外の文字列に変えるというのが典型的だ。JavaScriptで用意している文字をエンコード/デコードするescape/unescapeといった関数を使って文字列を置き換える手法もよく使われる。

 スクリプトを使えば,独自の変換ルールを用意しておくことも可能だ(同c)。こうなると,変換表以外に元の文字列との間に相関関係がないので,見つけるのは難しい。