GENOウィルス解析記(Episode 1)
いまちょっと話題になっているGENOウィルス。Adobe ReaderやAdobe Flash Playerの脆弱性を突いたものなんだんけれども、最初の感染が通販サイトのGENOであるが故にこのように呼ばれている。GENOにとってはハタ迷惑かもしれないが、GENOの対応の悪さも手伝ってこの通称が一般化しているようだ。
Adobeの脆弱性をつくなんてのは別に珍しいわけではなく、メールでばらまいたりWebサイトを改ざんしてダウンロードさせるといった感染手法も、とりたてて真新しいものではない。でも、聞いた話によるとWebサイトを改ざんされた場合の痕跡が一切みつからず、どのように改ざんされたのかが不明らしい。このウィルスそのものよりもウィルスをダウンロードさせるためのWebサイト改ざん方法のほうが実際には注目されているとかいないとか。
先日、このGENOウィルスの検体を入手した。ファイル名は「インフルエンザ病人の路線.pdf」(MD5:9137fec2f6a1b020cd877cebce8b8f67)というもの。ありがちな便乗系の名前。新型インフルエンザが猛威をふるって日本でも若干過剰なくらいに反応していたけれでも、だからといって、こんな怪しいファイル開いてしまうんだろうか。無頓着な人は開いてしまうんだろうなぁ。
さて、対象はPDFファイルだ。動的で調べてもいいんだけれど例によってまずここは静的で。なぜ静的かって、ひとつは手前に適当なサンドボックス環境がないことと、あとは、まぁ趣味みたいなもの。100%完璧に検体を丸裸にするのは無理かもしれないけど、静的でできるところまでやってみて、あとは動的で補完する。このほうが自分の腹に落ちるし説得力もありそうだ。
ちょっと前にwmvファイルの解析をしたことがあったが、pdfファイルの仕様もAdobeから公開されている。
[Adobe PDF Reference, Sixth Edition, version 1.7]
http://www.adobe.com/devnet/pdf/
この仕様を参考に「インフルエンザ病人の路線.pdf」を見てみよう。仕様書を隅々まで読んだわけではないが、pdfファイルはオブジェクトの羅列でメタデータ的な可読な部分(ASCII)とstreamであるバイナリ部分に分かれているようだ。ひとつのオブジェクトは「CR-LF」で区切られるので、pdfファイルは意外とバイナリエディタよりもテキストエディタで覗くほうが見やすかったりする。
でよく見てみると、JavaScriptが埋め込まれていることが分かる。
11656行目の「 24 0 obj<>」。「24」はオブジェクトナンバー「25 0 R」はオブジェクトナンバー「25」を参照ということ。で、同様にオブジェクトナンバー「25」(参照)→「26」(参照)→「27」で、オブジェクトナンバー「27」がJavaScriptの実体のように見える。オブジェクトナンバー「27」には「27 0 obj<>stream」というヘッダがついている。これは 「Flate」 でエンコードされていることをあらわしている。「Flate」はZipなどで使われている圧縮アルゴリズム。pdf内ではこの「Flate」と「LZW」がエンコード方法としてよく使われるらしい。この「Flate」は「ziplib」や「zlib」などを使用することでデコードできる。
「.NET用ライブラリ(SharpZipLib)」
http://www.icsharpcode.net/OpenSource/SharpZipLib/
「ネイティブ用ライブラリ(zlib)」
http://zlib.net/
以下は SharpZipLib を使用した場合のデコードコード(VB.NET)。
Private Function FlateDecode(ByRef fsOutFile As FileStream, ByRef fsSourceFile As FileStream, ByVal lOffSet As Long, ByVal lLength As Long) As Boolean Dim i As Long Dim stream As MemoryStream Dim zip As InflaterInputStream Dim writeData(4096) As Byte Dim iNumRead As Integer Try stream = New MemoryStream(lLength) fsSourceFile.Position = lOffSet While (i < lLength) stream.WriteByte(CByte(fsSourceFile.ReadByte())) i += 1 End While stream.Position = 0 zip = New InflaterInputStream(stream) While (True) iNumRead = zip.Read(writeData, 0, writeData.Length) If iNumRead > 0 Then fsOutFile.Write(writeData, 0, iNumRead) Else Exit While End If End While Catch ex As Exception Throw ex Finally zip.Close() fsSourceFile.Close() fsOutFile.Close() End Try End Function
これを使って、FlateエンコードされているさきほどのJavaScriptの実体があると思われる部分をデコードしてみた。その結果が以下。
どうも、バッファオーバーフローを狙っているようだ。「sc」がシェルコードだろう。38行目をデコードしてみると以下のようになる。
Collab["\x67\x65\x74\x49\x63\x6f\x6e"](of+a[0x0]);
↓
Collab["getIcon"](of+a[0x0]);
実はCollab.GetIcon()にはバッファオーバーフローの脆弱性が指摘されている。
http://www.securityfocus.com/bid/34169
http://www.ca.com/us/securityadvisor/vulninfo/vuln.aspx?id=37210
これだね。このバッファオーバーフローをついている。シェルコード部分を一応デコードしてみると以下のようになる。このシェルコードはいったいなにをしようとしているのか。なんか9割がたアスキーコードが並んでいて怪しいが.......
LACの岩井さんのブログ(↓)によると、中国のサイトに飛ばされるらしいのだが。
http://trackback.blogsys.jp/livedoor/fsecure_blog/50244449
(続く)