2017年5月31日

ビッグデータ時代に昔の手口で検知を逃れるマルウェア

脅威

Kaspersky Labでは日本と韓国を狙った標的型攻撃グループの活動について継続的に調査を行ってきました。このグループでは「XXMM」というマルウェアファミリーを数ある攻撃ツールの一つとして使用しています。このマルウェアの名前は、pdb文字列(C:\Users\123\documents\visual studio 2010\Projects\xxmm2\Release\test2.pdb)に由来しています。当社では2017年の初頭にある検体の提供を受けました。この検体にはpdb情報は含まれていませんでしたが、コードの類似性、マルウェアの機能、暗号アルゴリズム、データの構造、モジュールの構成という点で、XXMMマルウェアの亜種であると判断しました。また、非常に興味深い手口が使われていることも解析の過程で確認できましたので、本ブログにて紹介させていただきます。

2017年初頭、標準のシステムプロセス名に似せた「srvhost.exe」というファイル名のトロイの木馬の提供を受けました。まず、初めに目についたのはファイルサイズが100 MBを超えていた点です。解析を進めると、XXMMの亜種であること、暗号化されたバックドアモジュールを抱えていること、このバックドアモジュール(以下、waliバックドア)を特定プロセスのメモリ内へロードする為のローダーモジュール(以下、waliローダー)であることがわかりました。

次に、攻撃の要として使用されるwaliバックドアについて解析してみると、埋め込まれている文字列から、攻撃者はこのバックドアモジュールに「wali」と名付けたようです。

図1:「[wali]」セクションの文字列

図2:「wali.exe」のファイル名

waliローダーでは、「\x63」バイトと単純なXOR演算を使って、埋め込まれたwaliバックドアの復号化を行います。XORで使用される1byteの鍵は「\x63」だけでなく、他のものも観測されています。次に、waliバックドアが、waliローダーによって特定プロセス上のメモリに注入されます。

さて、話を少し戻しましょう。これほど大きなサイズということは、waliローダーの中にはいったい何が入っているのでしょうか?waliバックドアもそれをロードするwaliローダーも100Mという巨大なデータサイズには到底届きません。実は、この検体には、非常に大きなサイズの無意味なゴミデータがwaliローダーのファイル末尾に追加されているという、古典的な手口が使われていました。当社はオープンソースインテリジェンスを駆使し、検体を収集したところ同様の検体(waliローダー+ゴミデータ)を他に20個以上発見しました。もっとも、ゴミデータ部分を除いた場合、固有検体は6個だけでした。

表1:waliローダー+ゴミデータでサイズが100MBを超える検体の例

提供された検体はwaliローダーでしたが、ローダーをインストールするためのwaliドロッパーも見つかりました。問題となっている巨大なサイズのゴミデータは、waliローダーが標的マシンにインストールされる際に、waliドロッパーによってその都度、動的に生成されます。ゴミデータの生成に関しては次節で説明を行います。

下の図は、マルウェアモジュールの構造とwaliドロッパー等を含む各モジュールの関係を示しています。

図3:waliモジュールの構造

waliドロッパー1はCPUアーキテクチャを確認します。CPUが64ビットの場合、リソースID 101から64ビットバージョンのwaliドロッパー2を復号します。64ビットのCPUでない場合は、リソースID 102から32ビットバージョンのwaliドロッパー2を復号します。リソースデータの抽出にはRC4(暗号鍵は「12345」)を使用し、抽出したデータの解凍にはLZNT1を使用します。ドロッパー1は、復号されたwaliドロッパー2のデータに基づき、現在の一時ディレクトリに「win${random4 chr}.tmp.bat」という名前のファイルを作成します。最後に、ゴミデータを生成し、ドロップしたファイルの末尾に追加してからwaliドロッパー2を実行します。

waliドロッパー2は、ユーザーアカウントに管理者権限があるかどうかを確認してから、ドロッパー1と同じアルゴリズム、同じ暗号鍵を使用してwaliローダーを復号し、以下のファイルパスに新しいファイルを作成します。

  • %ProgramFiles%\Common Files\System\Ole DB\srvhost.exe
  • %appdata%\Microsoft\Windows\Start Menu\Programs\srvhost.exe

また、ドロップ1と同じ関数を使用してゴミデータを生成し、ファイル末尾に追加します。最後に、「sunUpdate」というレジストリ値を「HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run」に作成して、マルウェアを常駐化します。

ゴミデータの生成

ゴミデータをマルウェア実行ファイルに追加してファイルサイズを大きくするのは、waliドロッパー1とwaliドロッパー2に固有の機能です。作成者の狙いは、サイズの大きいファイルを作成することで、サンドボックスの回避やアンチウイルスによる検知の回避、検体を簡単に送受信できないようにする、YARAルールによる検知回避等と考えられます。下の図は、ジャンクデータを生成する関数を示しています。

図4:ゴミデータを生成する関数(create_garbage_data)

create_garbage_data関数は、1,000回の反復処理の中でランダムバイトを生成します。反復処理のたびに、動的にデータ長を計算し、その範囲内でデータブロックを入力します。その後、復号されたwaliローダーのオーバーレイにcreate_garbage_dataの結果を書き込むプロセスを100回繰り返します。これで最大100 MBのジャンクデータが生成されて、実行ファイルに追加されます。

図5:ゴミデータをファイル末尾に追加するループ

あるwaliローダー(MD5: d1e24c3cc0322b22988a1ce366d702e5)のサイズは、最初は1,124,352バイトでした。それが、実際の攻撃でゴミデータを追加する関数が実行されると、新しいファイル(MD5: 8bd0ddeb11518f3eaaddc6fd82627f33)が作成され、ファイルサイズが105,982,049バイトに増加しました。

追加されるゴミデータは動的に作成され、乱数値に基づいているため、サイズが変わる場合があります。当社は100MBのファイル以外だけでなく50MBサイズの違う検体が実際の攻撃で使用されたことを確認しました。当社が確認した中で最大のファイルサイズは、同じ手口で作成された200MBのマルウェア検体でした。現在のところ、カスペルスキー製品のマルウェア検知能力がこの手口の影響を受けることはありません。検知名は以下のとおりです。

  • Trojan.Win32.Xxmm
  • Trojan.Win64.Xxmm
  • Trojan-Downloader.Win32.Xxmm
  • Trojan-Downloader.Win64.Xxmm
  • Trojan-Dropper.Win32.Xxmm
  • Trojan-Dropper.Win64.Xxmm

ゴミデータを使ってファイルサイズを大きくする手口は、目新しいものではありません。かつてのポリモーフィック型のウイルスやワームもこの手口を多用しており、元のコードにゴミデータを混入してマルウェアファイル全体に行き渡らせ、ファイルサイズを数百KB、場合によっては数MBも増加させることがありました。一部のソフトウェアプロテクターが、おとりファイルをパッケージファイルに挿入し、ファイルサイズを1MBまで増大させることもあります。また、動画ファイルやISOファイルに偽装した実行可能マルウェアが、ファイル共有ソフトを介して拡散した例も確認されています。こうしたケースでは、本物のコンテンツに見せかけるために、マルウェアサイズが数GBにも膨れ上がります。

今回の事例で注目すべきは、この手口が標的型攻撃に利用されている点と、最初の感染後、攻撃の後半段階になってからゴミデータをファイルに追加し、ファイルサイズを増大させて検知を回避している点です。

検知回避のアプローチが原始的という点で、効率の悪い手口のように思えますが、YARAルールを使用してハードディスクドライブをスキャンするインシデントレスポンス担当者やフォレンジック分析担当者の目から、このマルウェアが逃れているケースもあると考えられます。というのも、YARAルール作成者はよく、主にスキャンプロセスのパフォーマンス向上を目的として、スキャン対象ファイルのサイズを制限するからです。XXMMマルウェアが生成するような大きなファイルは、こうしたルールで拾えない場合もあるため、セキュリティリサーチャーの方々には、ドロップされたマルウェア用のルールを作成する際に、この点を考慮していただきたいと思います。

脅威存在痕跡(IOC)

検体のSHA256sum

waliドロッパー1:

  • 9b5874a19bf112832d8e7fd1a57a2dda180ed50aa4f61126aa1b7b692e6a6665

waliドロッパー2:

  • da05667cd1d55fa166ae7bd95335bd080fba7b53c62b0fff248ce25c59ede54a
  • 10fca84ae22351356ead529944f85ef5d68de38024d4c5f6058468eb399cbc30

waliローダー+オーバーレイ:

  • 1f73d3a566ab7274b3248659144f1d092c8a5fc281f69aa71b7e459b72eb6db2
  • 24835916af9b1f77ad52ab62220314feea91d976fdacad6c942468e20c0d9ca1
  • 303c9fabf6cff78414cebee9873040aeb9dcf6d69962bd9e0bbe1a656376ed16
  • 3ffd5d3579bddbfd7136a6969c03673284b1c862129cfafe7a40beea1f56e790
  • 803a5a920684a5ab1013cb73bf8581045820f9fc8130407b8f81475d91ff7704
  • d2126d012de7c958b1969b875876ac84871271e8466136ffd14245e0442b6fac
  • d7b661754cae77aa3e77c270974a3fd6bda7548d97609ac174a9ca38ee802596
  • dc5e8c6488f7d6f4dcfac64f8f0755eb8582df506730a1ced03b7308587cdc41
  • f4a07e6dcb49cb1d819c63f17a8250f6260a944e6e9a59e822e6118fb1213031
  • ffd45bde777b112206b698947d9d9635e626d0245eb4cfc1a9365edc36614cbe

waliローダー:

  • a24759369d794f1e2414749c5c11ca9099a094637b6d0b7dbde557b2357c9fcd
  • b55b40c537ca859590433cbe62ade84276f3f90a037d408d5ec54e8a63c4ab31
  • c48a2077e7d0b447abddebe5e9f7ae9f715d190603f6c35683fff31972cf04a8
  • 725dedcd1653f0d11f502fe8fdf93d712682f77b2a0abe1962928c5333e58cae
  • cfcbe396dc19cb9477d840e8ad4de511ddadda267e039648693e7173b20286b1

waliのC2(改ざんされたWebサイト):

  • hXXp://******essel[.]com/mt/php/tmpl/missing.php
  • hXXp://******essel[.]com/mt/mt-static/images/comment/s.php
  • hXXp://******hi[.]com/da******/hinshu/ki******/ki******.php
  • hXXp://******an[.]jp/_module/menu/menug/index.php
  • hXXp://******etop.co[.]jp/includes/firebug/index.php
  • hXXp://******etop.co[.]jp/phpmyadmin/themes/pmahomme/sprites.html
  • hXXp://******usai[.]com/ex-engine/modules/comment/queries/deleteComment.php
  • hXXp://******1cs[.]net/zy/images/patterns/preview/deleteComments.php
  • hXXp://******1cs[.]net/zy/images/colorpicker/s.php

ファイル名(サイズが50MB以上):

  • srvhost.exe
  • propsyse.exe
  • perfcore.exe
  • oldb32.exe
  • oledb32.exe
  • javaup.exe