GENOウィルス解析記(Episode 1)

いまちょっと話題になっているGENOウィルスAdobe ReaderAdobe 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


(続く)