詳説APIハンマリング: 複数のマルウェアファミリがサンドボックス回避に使う技術に新たな実装

This post is also available in: English (英語)

概要

Unit 42は、興味深いサンドボックス回避技術を実装しているZloaderとBazarLoaderのサンプルを発見しました。本稿はこうした種類のマルウェアが実装している特徴的なAPIハンマリングについて詳しく説明します。APIハンマリングというのは、「サンドボックス環境で検出を回避するためWindows APIを多数呼び出す」という拡張型のスリープの一形態です。

サンドボックス技術は「ある検体に悪意があるか」を検出するさいによく用いられ、コントロールされた環境内でバイナリを実行してその振る舞いを分析します。サンドボックスは大量のバイナリを限られた計算資源で解析せねばならず、対処せねばならない課題がたくさんあります。マルウェアはこうした課題を悪用し、サンドボックス内で「スリープ」してから悪意のある処理を行うことで、じっさいの意図を隠蔽することがあります。

パロアルトネットワークスのお客様は、Cortex XDR またはWildFire脅威防御セキュリティサブスクリプションを有効にした次世代ファイアウォールにより同様の回避技術を使用するマルウェアファミリからの保護を受けています。

Unit 42の関連トピック Malware, evasion

目次

マルウェアの一般的なスリープ方法
APIハンマリングとは何か
BazarLoaderにおけるAPIハンマリング
ZloaderにおけるAPIハンマリング
結論: WildFire対APIハンマリング
IoC

マルウェアの一般的なスリープ方法

最も一般的なマルウェアのスリープ方法は、シンプルにWindowsのAPI関数Sleepを呼び出す、というものです。よりめだちにくい方法として、マルウェアが定期的に特定のIPアドレスにICMPネットワークパケットを送信(Ping送信)し続ける「Ping Sleep」という手法もよく見かけます。こうして無駄にPingメッセージを送受信するのにも一定の時間がかかるので、間接的にスリープしているのと同じことになります。ただしこうした方法はいずれも多くのサンドボックスで簡単に検出されてしまいます。

APIハンマリングとは何か

APIハンマリング(hammering)はずいぶん前から知られているサンドボックスの回避手法で、マルウェアの作者はときおりこの手法でサンドボックスを回避しようとすることがあります。最近、Zloader(さまざまな種類のマルウェアで使われているドロッパー)とBazarLoader(バックドア)がユニークなAPIハンマリングを新たに実装してステルス性を保とうとしていることが確認されました。

APIハンマリングは大量の無駄なWindows API関数呼び出しできています。これらの呼び出しに実行時間がかかるので、マルウェアの実際の悪意のあるルーチンの実行が遅延します。これにより、サンドボックスの解析処理中にマルウェアを間接的にスリープさせることができます。

BazarLoaderにおけるAPIハンマリング

BazarLoaderの古い亜種は決まった数(1550個)のprintf関数呼び出しでマルウェア解析をタイムアウトさせていました。BazarLoaderの新しいバージョンを分析したところ、APIハンマリングのもっと複雑で新しい実装が見つかりました。

以下のデコンパイルされたプロシージャは、今回解析したBazarLoaderのサンプルで、この新しい亜種がどのように実装されているかを示したものです。この亜種はWindowsのランダムなレジストリキーのリストに繰り返しアクセスする、ランダムな回数の巨大ループを利用しています。

APIハンマリングマルウェアサンプルのユニークな実装について学び、パロアルトネットワークスのお客様がどのように保護されているのかを知ることができます。
図1. BazarLoaderのAPIハンマリングループ

ランダムなループ回数とレジストリキーのリストを生成するために、このサンプルはSystem32ディレクトリから定義されたサイズに一致する最初のファイルを読み取ります。その後このファイルはエンコードされて(図2参照)ヌルバイトの大半が削除されます。そしてそのファイルの最初のヌルバイトのオフセットに基づいてランダムな回数が計算されます。ランダムなレジストリキーのリストは、エンコードされたファイルの固定長のチャンクから生成されます。

APIハンマリングマルウェアサンプルのユニークな実装について学び、パロアルトネットワークスのお客様がどのように保護されているのかを知ることができます。
図2. 選択したファイルをBazarLoaderでエンコードする

Windowsのバージョンが違っていたり(Windows 7、Windows 8など)、適用された更新プログラムの組み合わせが違っていれば、System32ディレクトリ以下にあるファイルの組み合わせが変わってきます。このため異なるマシンで実行すれば、BazarLoaderの使用するループ回数やレジストリキーのリストが変化します。

APIハンマリングの機能は、BazarLoaderサンプルのパッカー内にあります(図3参照)。これがペイロードのアンパック処理を遅延させ、前述のように検知を回避します。すべてのアンパック処理が実行されなければ、BazarLoaderサンプルはただランダムなレジストリキーにアクセスしているように見えますし、こうした振る舞いは正当なソフトウェアでもよく見られます。

図3. APIハンマリングによりBazarLoaderのアンパック処理を遅延させる
図3. APIハンマリングによりBazarLoaderのアンパック処理を遅延させる

ZloaderにおけるAPIハンマリング

BazarLoaderのサンプルはAPIハンマリングの実行をループにたよっていましたが、Zloaderでは異なるアプローチがとられています。こちらは巨大なループを必要とせず、4つの大きな関数で構成されており、そのなかに複数のちいさな関数へのネストされた呼び出しが含まれています(図4参照)。

ZLoaderのAPIハンマリングを担う大きな関数の1つ
図4. ZLoaderのAPIハンマリングを担う大きな関数の1つ

これらの小さなプロシージャには、ファイルI/Oに関連した4つのAPI関数呼び出しが存在します。GetFileAttributesWReadFileCreateFileWWriteFileの4つです(図5参照)。

 ZLoaderのAPIハンマリングを担う小さな関数の1つ
図5. ZLoaderのAPIハンマリングを担う小さな関数の1つ

デバッガを使うとこれら4つのファイルI/O関数の呼び出し回数を確認できました(図6参照)。これらの関数は大小合わせて合計で100万回以上の関数呼び出しを生成していましたが、BazarLoaderで見られたような単一の大きなループは使われていませんでした。

ZLoaderでAPIハンマリングを担うAPIのデバッガのログ
図6. ZLoaderでAPIハンマリングを担うAPIのデバッガのログ

以下の表は、分析過程で行われたAPI関数の呼び出し回数を示したものです。

I/O API 関数 合計呼び出し回数
ReadFile 278,850
WriteFile 280,921
GetFileAttributesW 113,389
CreateFileW 559,771

表1 API関数の呼び出し回数

これら4つの大きな関数の実行時間がZloaderペイロードのインジェクションを遅延させます。これらの関数をすべて実行しなければ、ファイルI/O操作を実行しているだけの無害なサンプルに見えます。

以下に示す逆アセンブルコードは4つのAPIハンマリングプロシージャとそれに続くインジェクションプロシージャを示しています。

逆アセンブルコード。4つのAPIハンマリングプロシージャとそれに続くインジェクションプロシージャを示している
図6. ZLoaderのペイロードインジェクション前のAPIハンマリング

結論: WildFire対APIハンマリング

APIハンマリングのさまざまな実装を分析した結果、WildFireでサンドボックス回避を狙ってAPIハンマリングを使用するマルウェアサンプルを検出するようになりました。WildFireはBazarLoaderやZloaderなどのマルウェアファミリによるAPIハンマリングの使用を検出します。

以下はWildFireレポートからの抜粋で、今回のBazarLoaderサンプルがAPIハンマリングの使用により検出されたさいのエントリです。

「APIハンマリングはサンドボックス解析を遅延させる技術で悪意のある活動を隠蔽します」と説明してある部分が赤い枠で囲われている
図7 WildFireが今回のBazarloaderのサンプルをAPIハンマリングやそのほかの振る舞いによって検出したところ

パロアルトネットワークスのお客様は、Cortex XDRまたはWildFireと脅威防御セキュリティサブスクリプションを有効にした次世代ファイアウォールにより同様のサンドボックス回避技術を使用するマルウェアファミリからの保護を受けています。

IoC

BazarLoaderサンプル
ce5ee2fd8aa4acda24baf6221b5de66220172da0eb312705936adc5b164cc052

Zloaderサンプル
44ede6e1b9be1c013f13d82645f7a9cff7d92b267778f19b46aa5c1f7fa3c10b