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のランダムなレジストリキーのリストに繰り返しアクセスする、ランダムな回数の巨大ループを利用しています。
ランダムなループ回数とレジストリキーのリストを生成するために、このサンプルはSystem32ディレクトリから定義されたサイズに一致する最初のファイルを読み取ります。その後このファイルはエンコードされて(図2参照)ヌルバイトの大半が削除されます。そしてそのファイルの最初のヌルバイトのオフセットに基づいてランダムな回数が計算されます。ランダムなレジストリキーのリストは、エンコードされたファイルの固定長のチャンクから生成されます。
Windowsのバージョンが違っていたり(Windows 7、Windows 8など)、適用された更新プログラムの組み合わせが違っていれば、System32ディレクトリ以下にあるファイルの組み合わせが変わってきます。このため異なるマシンで実行すれば、BazarLoaderの使用するループ回数やレジストリキーのリストが変化します。
APIハンマリングの機能は、BazarLoaderサンプルのパッカー内にあります(図3参照)。これがペイロードのアンパック処理を遅延させ、前述のように検知を回避します。すべてのアンパック処理が実行されなければ、BazarLoaderサンプルはただランダムなレジストリキーにアクセスしているように見えますし、こうした振る舞いは正当なソフトウェアでもよく見られます。
ZloaderにおけるAPIハンマリング
BazarLoaderのサンプルはAPIハンマリングの実行をループにたよっていましたが、Zloaderでは異なるアプローチがとられています。こちらは巨大なループを必要とせず、4つの大きな関数で構成されており、そのなかに複数のちいさな関数へのネストされた呼び出しが含まれています(図4参照)。
これらの小さなプロシージャには、ファイルI/Oに関連した4つのAPI関数呼び出しが存在します。GetFileAttributesW、ReadFile、CreateFileW、WriteFileの4つです(図5参照)。
デバッガを使うとこれら4つのファイルI/O関数の呼び出し回数を確認できました(図6参照)。これらの関数は大小合わせて合計で100万回以上の関数呼び出しを生成していましたが、BazarLoaderで見られたような単一の大きなループは使われていませんでした。
以下の表は、分析過程で行われたAPI関数の呼び出し回数を示したものです。
I/O API 関数 | 合計呼び出し回数 |
ReadFile | 278,850 |
WriteFile | 280,921 |
GetFileAttributesW | 113,389 |
CreateFileW | 559,771 |
表1 API関数の呼び出し回数
これら4つの大きな関数の実行時間がZloaderペイロードのインジェクションを遅延させます。これらの関数をすべて実行しなければ、ファイルI/O操作を実行しているだけの無害なサンプルに見えます。
以下に示す逆アセンブルコードは4つのAPIハンマリングプロシージャとそれに続くインジェクションプロシージャを示しています。
結論: WildFire対APIハンマリング
APIハンマリングのさまざまな実装を分析した結果、WildFireでサンドボックス回避を狙ってAPIハンマリングを使用するマルウェアサンプルを検出するようになりました。WildFireはBazarLoaderやZloaderなどのマルウェアファミリによるAPIハンマリングの使用を検出します。
以下はWildFireレポートからの抜粋で、今回のBazarLoaderサンプルがAPIハンマリングの使用により検出されたさいのエントリです。
パロアルトネットワークスのお客様は、Cortex XDRまたはWildFireと脅威防御セキュリティサブスクリプションを有効にした次世代ファイアウォールにより同様のサンドボックス回避技術を使用するマルウェアファミリからの保護を受けています。
IoC
BazarLoaderサンプル
ce5ee2fd8aa4acda24baf6221b5de66220172da0eb312705936adc5b164cc052
Zloaderサンプル
44ede6e1b9be1c013f13d82645f7a9cff7d92b267778f19b46aa5c1f7fa3c10b