1. まえがき

 Sofacy Group(Pawn StormまたはAPT28の別名でも知られる)は、彼らの仕掛けるAPTキャンペーンにおいてゼロデイエクスプロイトをデプロイすることでよく知られている。一例を挙げると、Sofacy Groupが最近利用した2件のゼロデイは、Microsoft OfficeのCVE-2015-2424とJavaのCVE-2015-2590という脆弱性の悪用だった。

 この悪用が成功するとSofacyのダウンローダコンポーネントがインストールされるが、我々が今まで目にしてきたダウンローダとは異なっている。このダウンローダは悪名高きCarberpのソースコードをベースにしている。当該コードは2013年の夏に漏えいし、パブリックドメインとなったものだ。

1.1 Firefoxのブートストラップ型アドオン

 我々は今年の春、ゼロデイエクスプロイトとは別に、Firefoxのブートストラップ型アドオンなど別の手段でデプロイされた、Carberpベースのダウンローダにも遭遇した。だがブートストラップ型のアドオンとは何だろうか?Mozillaによれば、ブラウザを再起動することなくインストールおよび使用が可能なアドオンの一種とのことだ。

 このSofacyのアドオンのインストールは、主にソーシャルエンジニアリングに頼っている。ユーザが悪意のあるWebサイトや侵害されたWebサイトを訪れると、このアドオンをインストールするように促されるのだ。

HTML5 Rendering Enhancements 1.0.
図1:Sofacyのアドオン「HTML5 Rendering Enhancements」

 メインのコードは、アドオンのパッケージ内にあるbootstrap.jsに格納されている。アドオンが有効になった時点で、前述のJavaScriptはSofacyのCarberpベースのダウンローダを次のURLからダウンロードする。

hxxp://dailyforeignnews.com/2015/04/Qih/north-korea-declares-no-sail-zone-missile-launch-seen-as-possible-reports/579382/hazard.edn

 ペイロードはvmware_manager.exeとしてローカルに保存される。

 このブートストラップ型アドオンの技術は、完全に新規のものというわけではない。2007年にはドキュメント化されており、主に潜在的に迷惑なアプリケーションで使われている。しかしながら、Sofacyがこの手法を使っているのを目にするのは、初めてのことだ。Sofacyのbootstrap.jsファイル内のコードの大半は、Metasploitから直接コピーされたもので、{d0df471a-9896-4e6d-83e2-13a04ed6df33}というGUIDや「HTML5 Rendering Enhancements」というアドオン名が含まれている。その一方で、ペイロードをダウンロードする部分はMozillaのコード片の1つからコピーしていた。

2. ドロッパーとDLLに関する技術情報

 このエクスプロイトを使用した文書ファイルやアドオンは、PE実行ファイルを運んでくる。この実行ファイルは、自身に組み込まれているDLLをシステムにインストールするものだ。実行ファイルの大きさは100KB内外で、ファイル圧縮はされていない。一方、インストールするDLLは標準的なWindows APIを用いて圧縮されており、ディスクにドロップする前にRtlDecompressBufferで展開する。我々が見てきた全サンプルが有する重要かつ共通の特徴は、「jhuhugit.temp」という名前の一時ファイルだ。このファイル名は、実行ファイル内にあるほぼ唯一の平文の文字列だ。他の文字列は、固定の11バイトのキーを使ったXORアルゴリズムにより難読化が図られている。一部のサンプルに現れる興味を引く別の文字列は、「bRS8yYQ0APq9xfzC」という暗号キーだ。GitHubにあるCarberpのソースツリーで見つかった固定の「メインパスワード」の1つと一致するものだった。

 このDLLは、OSの実行ファイルであるrundll32.exeを使い、「init」という名前でエクスポートされているものが実行される。DLL自体には多くの機能はない。単純にループし続けて、30分ごとに決まったC2サーバ群のうちの1台に問い合わせを行う。我々は生きているペイロードをこれらのサーバからいまだ取得できていないが、コードに基づくと、DLLは最初に自身が実行されたときとまったく同じ方法でペイロードの実行のみを行う。C2サーバのアドレスや他の設定データは、同じ11バイトのXORキーアルゴリズムを用いて難読化されている。これまでのところ手が込んでいるようなことは何もないが、同じCarberpのパスワードが、しかも我々が見てきたすべてのDLLで使われている。我々はこの関連性を発見しようとするほど、好奇心をそそられた。

 DLLのリバースエンジニアリングを注意深く行うことで、このファミリーはCarberpのソースコードをベースとしていることが明確になった。コードのレポジトリはGitHubで見つかるものとまったく同じではないが、後述する主張をするのに十分なほど似通っている。今回Sofacyが使ったCarberpのソースをベースにした機能には、API解決アルゴリズムとコードインジェクションメカニズムが含まれる。またランダムなURLを生成するために用いたアルゴリズムも、大まかにはCarberpに基づいている。

3. Carberpのソースコードとの比較

3.1. API解決アルゴリズム

 公開されているCarberpのソースコードでは、実行時にAPIが解決される。これには以下のようなコードの構造を用いている。

#define pLoadLibraryA   pushargEx< DLL_KERNEL32, 0xC8AC8026, 2 >

 例では、pLoadLibraryAという関数が別のpushargEx関数で定義されている。この関数には以下の引数が与えられている。

  • モジュールの識別子として、この例ではDLL_KERNEL32
  • 関数名のハッシュ値としてC8AC8026。これは実行時に計算される
  • 関数のキャッシュのインデックスとして「2」

 このpushargEx関数は複数の定義により、見込まれる引数の数のすべてに対応する。引数が5個の場合の定義を以下に例示する。

inline LPVOID pushargEx(A a1, B a2, C a3, D a4, E a5)
{
    typedef LPVOID (WINAPI *newfunc)(A, B, C, D, E);
    newfunc func = (newfunc)GetProcAddressEx2( NULL, h, hash, CacheIndex );
    return func(a1, a2, a3, a4, a5);
}

 PushargExGetProcAddressEx2に行きつく。この関数は名前のハッシュ値に基づきAPIの関数アドレスを割り出すものだ。その後、当該アドレスの関数が実行される。このような構造にした目的は、通常コード内にある標準的なWin32のAPI関数を、「p」という文字を関数名の先頭に追加して使えるようにすることだ。その結果得られるコンパイル後のコードは、あまり読みやすいものではない。したがってリバースエンジニアリングの過程に時間がかかるようになる。また、このような完全な位置独立コードによる恩恵もある。コードインジェクションには都合が良いのだ。

 CarberpのソースツリーにはAPIのハッシュ値と、対応するキャッシュのインデックスのリストが含まれる。以下のような素敵なリストだ。

Carberp API list.
図2:CarberpのAPIリスト

 ここでSofacyのバイナリコードに戻ろう。逆コンパイルしたコード片の実例から、Sofacyが同じハッシュアルゴリズムとインデックスの採番方式を採用していることは明白だ。

Sofacy GetModuleHandleA
図3:SofacyのGetModuleHandleA

 GetModuleHandleAは、Sofacyが動的に解決する数多くの関数の1つに過ぎない。ただしそれらの関数はすべて、Carberpのソースコードと完全に一致する。ハッシュ値や引数、インデックス値までもだ(図2のインデックス番号の#43を見てほしい)。

 API解決部分までさらに観察していくと、GetProcAddressExおよびGetProcAddressEx2と名付けられた関数に著しい類似性が見られた。CarberpのソースとSofacyのバイナリを逆コンパイルしたコードのGetProcAddressEx2のスクリーンショットを、以下に並べて示す。

GetProcAddressEx2 from Carberp and Sofacy.
図4:CarberpおよびSofacyのGetProcAddressEx2

 CarberpのソースとSofacyのバイナリを逆コンパイルしたコードのGetProcAddressExの類似性の比較は以下のようになる。

GetProcAddressEx from Carberp and Sofacy
図5:CarberpおよびSofacyのGetProcAddressEx

 上記の逆コンパイルしたコード片においては、意図的にすべての関数と変数の名前がCarberpのソースに従うようにした。これは単に説明のためだ。

3.2. コードインジェクション

 Sofacyは、ネットワーク周りのコードすべてにおいてコードインジェクションを用いている。自身の関数をブラウザのプロセス群にインジェクションするのだ。プロセス群を探すために、Carberpのプロセス名ハッシュアルゴリズムを用いている。このような仕組みにした目的は、十中八九パーソナルファイアウォールやその他のビヘイビア検知システムを迂回するためだ。

 コードインジェクションはInjectIntoProcessという名前の関数から開始する。この関数はプロセスをオープンしてInjectCode4 によりコードを注入し、CreateRemoteThreadで実行する。以下にCarberpのコード片を示す。

InjectCode4 from the Carberp source.
図6:CarberpのソースにあるInjectCode4

 SofacyのバイナリにあるInjectIntoProcessInjectCode4が、この機能を結び付けている。

InjectIntoProcess from Sofacy
図7:SofacyにあるInjectIntoProcess

Figure 8: InjectCode4 from Sofacy
図8:SofacyにあるInjectCode4

3.3. ミステリアスなメインパスワード

 Carberpのソースには、MainPassword、あるいはRC2_Password、DebugPasswordと呼ばれるパスワードが存在する。このパスワードの取り得る値の1つが「bRS8yYQ0APq9xfzC」というもので、Sofacyでも使用されている。Carberpにおけるこのパスワードの目的は、たとえばHTTPトラフィックの暗号化だ。一方Sofacyでは、まったく異なる方法で使用されている。SofacyではAPI解決のためのアルゴリズムに手が加えられており、そこでこのパスワードを用いている。Carberpでは、API解決部分において平文でDDL名のリストを持っている。GetProcAddressEx2が参照するインデックスパラメータのことだ。Sofacyではこのリストは、Carberpの「メインパスワード」を用いて単純なXORベースのアルゴリズムで難読化がなされている。

4. 結論

 本ブログ記事で示された分析に基づけば、新たなSofacyのダウンローダはCarberpのソースコードをベースにしている。しかしながら非常に大きな違いもある。たとえばAPIの解決や、Carberpのメインパスワードの使用といったものだ。その関連について我々が下せる結論とは?Sofacyの一味は、Carberpのソースコードのプライベートなソースツリーを保有していることを意味すると、我々は考えている。APIの解決部分でDDL名を保護するためにパスワードを使用していることは、GitHubで一般公開されているソースよりも新しいことを示唆するものだ。これはSofacy一味は単にソースツリーをコピーして開発を継続していることを意味するのだろうか?あるいは、舞台裏で誰か別の人物がさらに開発を重ねているのだろうか?これについては、我々はまだ把握していない。しかしSofacyとのつながりや、さらに加えて(Carberpをベースにしている)AnunakやCarbanakによる最近のインシデントにより、Carberpがいまだに健在であることが示唆される。

5. ハッシュ値

bootstrap.js:

e7d13aed50bedb5e67d92753f6e0eda8a3c9b4f0

ドロッパー:

b8aabe12502f7d55ae332905acee80a10e3bc399
015425010bd4cf9d511f7fcd0fc17fc17c23eec1
51b0e3cd6360d50424bf776b3cd673dd45fd0f97
4fae67d3988da117608a7548d9029caddbfb3ebf
b7788af2ef073d7b3fb84086496896e7404e625e
63d1d33e7418daf200dc4660fc9a59492ddd50d9
b4a515ef9de037f18d96b9b0e48271180f5725b7
f3d50c1f7d5f322c1a1f9a72ff122cac990881ee

DLL:

5c3e709517f41febf03109fa9d597f2ccc495956 (逆コンパイルされたコードの例)
ed9f3e5e889d281437b945993c6c2a80c60fdedc
21835aafe6d46840bb697e8b0d4aac06dec44f5b
d85e44d386315b0258847495be1711450ac02d9f
ac61a299f81d1cff4ea857afd1b323724aac3f04
7319a2751bd13b2364031f1e69035acfc4fd4d18
b8b3f53ca2cd64bd101cb59c6553f6289a72d9bb
f7608ef62a45822e9300d390064e667028b75dea
9fc43e32c887b7697bf6d6933e9859d29581ead0
3b52046dd7e1d5684eabbd9038b651726714ab69
d3aa282b390a5cb29d15a97e0a046305038dbefe