あんちういるす

このサイトはマルウェア、アンチウイルス、あとはセキュリティ全般について、素人がざっくばらんと書いていくブログです。でもあんまりしっかりと書く気はないというか、わりと適当に書いていくつもりなのでちゃんとした文章を期待している高モチベな方々向けではありません。あらかじめご了承ください。

いたちごっこの渦中から

 前回マルウェア作者は、なるべく検知されないマルウェアを作る必要があるという話をしました。そしてポリモーフィックマルウェアや実行形式のまま圧縮するPackerを紹介しましたね。今回は視点をまたアンチウイルス側に戻して、いかにしてこのようなマルウェアに対処するのかを書きたいと思います。

 では最初に"マルウェアを分析することが仕事である"解析者について。
 仕事でマルウェアを扱う人なんて、アンチウイルスベンダーのエンジニアかセキュリティの研究者、あとはインシデントレスポンスでそっち系担当の人くらいしかいないので、マルウェア解析者な人たちも基本的にそういうところにしかいません。マルウェアを渡されて、解析して、その結果をレポートにまとめるなりなんなりしてターン終了、みたいな、そんなお仕事ですね。
 彼らはx86Windows、あとPythonC言語辺りを使ったプログラミングが得意です。マルウェアを解析したり、ソフトウェアの脆弱性を見つけることは最高に大好きですが、ソフトウェアそのものを作るのは苦手で、数万行単位のソースコードを管理したりはできません。でもWindowsについてはカーネルレベルまで知っており、開発者のごとく詳しかったりします。

 ところでマルウェアの解析って具体的になにをするの?って感じですが、基本的に機械語アセンブラに変換して、それを読みつつ動作を解読する作業です。一昔前は本当にアセンブラコードを読むだけのかなり大変な仕事だったのですが、近年はツール類が整備されており、さほど苦労せずに解析を行えますね。
 解析者のだれもが持っているツールIDAと呼ばれる逆アセンブラがあります。ただの逆アセンブラと思いきや、お値段は聞いてびっくり数万円~数十万円とかですね。まぁそれくらいの価値があったりするわけですが。Webページからフリー版や体験版がダウンロードできるので試してみてもよいかと。
 IDAのほかには、WinDbgOllyDbgImmunity Debuggerといったデバッガ系が人気ですが、IDAにもデバッガの機能がついているため必要としない人もいます。あとはプロセス、ネットワーク、ファイル、レジストリモニタといったいわゆるシステムを監視するツール類一式でしょうか(Windows Sysinternals)。またマルウェアを解析する際は、仮想環境や感染しても構わないマシンを用意して行います。当然ですけども。
 といった具合に、近年のマルウェア解析は専門の(そして高価な)ツールを使って行うことが主流だったりするのです。まさに専門家って感じですね。はい。
 そして、そういういわゆる第一線で活躍している人たちのところに当然新種のマルウェアは集まってくるわけです。以前書いたとおり、マルウェアは増加の一途なので、それはもうガンガンと集まってくるわけです。手に負えないくらいに。
 そうなるとヤバいとなって自動化を考え始めます。もう専門家がいちいち解析していたら間に合わない、マルウェア解析をある程度自動化して人間の仕事をなるべく減らすんだ!という方向に進むわけです。マルウェアはほぼ半自動で作られているんだから、解析者も半自動で解析しちゃおうぜ!みたいな。人間は手を抜くことに関してはどこまでも追及できるものなのです。人間万歳!
 そんなこんなで一時期、セキュリティ系の国際会議では○○の自動化ってネタがわんさかあったのでした。まぁいまもありますけどもね。

 具体的にどういった点を自動化するのかというと、たとえば自動unpackerツールなるTitanEngineというものがありますね。これはunpackフレームワーク、つーかライブラリなんですが、サンプルコードに有名どころのpackerに対するunpackerが利用例として入っています。ソースを読めば使い方が一目瞭然ってやつですね。すばらしいですね。
 自動化がたやすいpackingに対して、それを復元するunpackingはその自動化が困難なはずなのですが、実行しちまえばメモリ上にはオリジナルが復元されるやろ、というノリから、TitanEngineではDynamic Unpackingという実際にプロセスを生成し、自動でデバッガで処理を進めて、適当なところをOEPとみなしてダンプする(シグネチャでダンプ箇所を識別)という、まさに解析者がやってることそのままを自動化しました、みたいなノリでunpackingしてくれます。packingはマルウェアの解析対策にも使われるため、このようなツールがあると解析がいくぶん楽になるわけですね。
 さっきも少し触れましたが、マルウェア解析は閉じた環境、いわゆる仮想環境とかネットワークが制限されたマシンで解析を行うため、必然的にEmulation技術が多様されます。パソコンはx86系が主流ですからx86 Emulatorってやつですね。CPUエミュレータ―はQEMUなんかがそのもっとも有名な代表例ですね。
 そういったEmulatorの中でマルウェアを動作させて、その結果を調べたり、unpackの処理をEmulatorの中で行わせたりといったことも、解析の自動化によく使われる手法です。このx86Emulatorというやつはunpackingを目的としたEmulatorのようですね。
 結局のところ、マルウェアをひとつひとつ解析していくのはもう嫌だ、なんかマルウェアを自動で解析してくれるとっても便利なシステムないのー。ドラえもーん、そんな道具出してよー。自分で作れカス!という感じなわけですね。
 また別の理由として、実行ファイルのみから得られる情報よりも、実際に実行することで得られる情報量の方が圧倒的に多い、だから仮想環境なりなんなりで一度実行してみて、その結果も解析の参考に利用しようというのもありますね。Cuckoo Sandboxなんかはそういう目的で作られていますね。

 要するに、マルウェアが増えまくってる昨今、いちいちアセンブラ命令を一個ずつ読んでられないだろどう考えても。だから自動化できるところは可能な限り自動化しようぜってことで、自動でunpackしたり、Emulatorで実行してそのログをとったりするツールを作ったというわけです。
 そしてこういう技術が結果的にマルウェア検知にも生かされることになり、いまに至るわけです。アンチウイルスときくとシグネチャベースの検知方式を思い浮かべますが、現在は、サンドボックスを持ってたり、ヒューリスティックと呼ばれるプログラムの振る舞いでマルウェアを識別したりするアルゴリズムが当たり前に実装されていたりします。DBから特徴的なシグネチャを比較するだけのものとはだいぶ違うわけです。
 もちろん、方向性は違いますが、クラウドを使ったレピュテーションも新しい仕組みで検知しているという点ではシグネチャベースの方式とは大きく異なり、次世代の新技術っぽい感じですね。

 というわけで、これまでの話をまとめると「マルウェアを作ってる側も守ってる側も自動化してなるべく仕事を減らしている」ってことですね。作成側は量産するために、対応側は検知するために自動化しているわけです。涙ぐましい努力ですね。
 そもそも世の中にマルウェアがなければアンチウイルスもないわけですが、それは世の中に犯罪がなければ警察はいらないってことと同じで、まぁ現実あるわけです。そして犯罪者を確実に突き止める方法がないのと同じく、マルウェアを完璧に検知できるシステムもないわけですね。
 いたちごっこを続ける覚悟があるものだけがセキュリティ技術に足を踏み入れなさい、と。つまりはこういうことなんですね(なんじゃそりゃw)。

 まぁ少なくとも一般的なITとはだいぶ違った色の業界であることは確かですね。