APT&標的型攻撃
攻撃グループ「Earth Freybug」が新型マルウェア「UNAPIMON」を展開:セキュリティ監視用のAPIフックを解除
攻撃グループ「Earth Freybug」の新型マルウェア「UNAPIMON」について、「DLLハイジャック」や「APIフック解除」による検知回避の技術を中心に解説します。
トレンドマイクロでは数ヶ月に渡り、攻撃グループ「Earth Freybug(APT41のサブグループとしても知られる)」のサイバー諜報活動を調査してきました。Earth Freybugは遅くとも2012年頃から攻勢を強め、世界各国のさまざまな業界に対して諜報または金銭目的の活動を行ってきました。その手段として、独自仕様によるマルウェアの他、LOLBins(標的システムにはじめから存在するツール類)などのツールを多岐に渡って利用します。今回Earth Freybugは、不正な処理を担う子プロセスをセキュリティ監視から隠蔽するために、「DLLハイジャック」、「API(Application Programming Interface)フック解除」という2種の手口を行使しました。また、これらの手口を支援するツールとして、新型マルウェア「UNAPIMON」を導入しました。本稿では、以上の発見事項について詳しく解説します。
攻撃の流れ
本攻撃キャンペーンで使用されたTTPs(Tactics:戦略、Techniques:テクニック、Procedures:プロシージャ)は、サイバーセキュリティ企業「Cybereason」が報告した攻撃事例に類似します。今回の場合、はじめにプロセス「vmtoolsd.exe」がschtasks.exeを実行し、リモート用のタスクスケジュールを登録しました。本タスクが開始すると、対象のリモート端末上で、事前に配備済みのバッチファイル「cc.bat」が起動します。
vmtoolsd.exeは、VMWare Toolsのコンポーネント「VMWareユーザプロセス」であり、ゲストの仮想端末内で動作し、ホスト端末との通信をサポートします。一方schtasks.exeは、Windows用コンポーネント「タスクスケジューラ設定ツール」に相当し、ローカル端末やリモート端末でのタスク管理を担います。トレンドマイクロのテレメトリ情報によると、今回の攻撃ではvmtoolsd.exeに出元不明のコードがインジェクトされ(埋め込まれ)、そこからschtasks.exeが実行されました。なお、vmtoolsd.exeとschtasks.exeは、双方とも正規の実行ファイルです。今回vmtoolsd.exeにインジェクトされたコードの出元は不明ですが、外部公開された脆弱なサーバを経由して正規なアプリケーションの脆弱性が突かれ、感染に至ったという報告があります。
第1のcc.bat:偵察活動
登録済みのスケジュールに従ってタスクが稼働すると、リモート端末内に配備済みのバッチファイル「%System%\cc.bat」が起動します。トレンドマイクロのテレメトリ情報によると、本バッチファイルは、下記のコマンドを利用してさまざまなシステム情報を取得します。
- powershell.exe -command "Get-NetAdapter |select InterfaceGuid"
- arp -a
- ipconfig /all
- fsutil fsinfo drives
- query user
- net localgroup administrators
- systeminfo
- whoami
- netstat -anb -p tcp
- net start
- tasklist /v
- net session
- net share
- net accounts
- net use
- net user
- net view
- net view /domain
- net time \\127.0.0.1
- net localgroup administrators /domain
- wmic nic get "guid"
上記コマンドによって得られたシステム情報は、テキストファイル「%System%\res.txt」に保存されます。
続いてvmtoolsd.exeが、もう1つのタスクスケジュールを登録します。本タスクが開始すると、標的端末上で以下のバッチファイルが起動し、バックドア機能を呼び出します。
%Windows%\Installer\cc.bat
第2のcc.bat:DLLのハイジャックとサイドローディング
第2のcc.batは、サービス「SessionEnv」を経由して不正なDLLをサイドロードする点で特徴的です。SessionEnvには、デフォルトで存在しないライブラリ「TSMSISrv.DLL」をロードしようとする性質があり、今回はその点が攻撃者に利用されました。具体的な流れとして、はじめに第2のcc.batが起動し、事前に配備済みの以下のバイナリファイルを
%Windows%\Installer\hdr.bin
以下のパスにコピーします。
%System%\TSMSISrv.DLL
次に、サービス「SessionEnv」を停止し、数秒間待機した後で、これを再起動します。結果、本サービスを通してコピー先の以下がロード、実行されるようになります。
%System%\TSMSISrv.DLL
SessionEnvを用いる手口については、こちらの記事で詳しく解説されています。
TSMSISrv.DLLの主な機能として、DLLファイル「Windows%\_{5桁から9桁のランダムなアルファベット列}.dll」を作成してロードすること、「cmd.exe」を起動して当該DLLをインジェクトすること、同DLLを先述のサービス「SessionEnv」にもインジェクトすること、の3点が挙げられます。トレンドマイクロのテレメトリ情報によると、ここで起動されるcmd.exeのインスタンスはバックドアとして動作し、別の端末から指示されたコマンドを実行します。インジェクト対象のDLLについては、その機能的特徴を踏まえて「UNAPIMON」の名で呼ぶこととしました。
防御回避に使用されるUNAPIMONの概要
今回の攻撃で着目すべき点は、特殊な性質を備えたマルウェア「UNAPIMON」にあります。このマルウェアは防御回避を意図したものであり、子プロセスをセキュリティ監視から隠そうとします。以降、その詳細について解説します。
マルウェア解析
UNAPIMONはDLL形式のマルウェアであり、C++で作成されています。その構造自体は単純であり、圧縮や難読化などの技巧は見られず、ただ1つの文字列を除いて暗号化の使用もありません。
本DLLの関数「DllMain」は、はじめに自身がロード目的で呼び出されているのか、アンロード(解除)目的で呼び出されているのかを確認します。ロード目的の場合、処理の同期用にイベントオブジェクトを作成し、フック(APIの機能を書き換える仕組み)用のスレッドを開始します。
図3に示す通り、フック用スレッドでは、まずkernel32.dllが提供するAPI「CreateProcessW」のアドレス値を取得し、後の使用に備えて保存しておきます。CreateProcessWはWindowsが提供するAPIであり、プロセスの作成や起動に用いられます。次に、CreateProcessWに対するフック設定を登録します。登録用のツールとして、Microsoftによるオープンソース・ソフトウェアパッケージ「Microsoft Detours」を利用します。このツールは本来、API呼び出しの監視や調整に用いられるものです。
上記のフック設定により、DLL「UNAPIMON」をロードしたプロセス(図1のcmd.exeやサービス「SessionEnv」に相当)がAPI「CreateProcessW」を呼び出すと、当該APIの代わりに「フック関数」が起動します。
このフック関数は、先に保存したアドレス値を用いて以下を呼び出すことで、対象の子プロセスを確かに作成しますが、
CreateProcessW
そのオプションとして以下を指定します。
CREATE_SUSPENDED(4)
結果、当該の子プロセスは、メインスレッドが「止まった状態」で起動します。
次に、下記のDLLリストを扱った処理に進みます。これらDLLのファイル名は、全てハードコーディングで定義されています。
まず、作成済みの子プロセス側でロードされたDLLの一覧情報を取得し、上記のDLL名リストと突き合わせ、「名前が一致」するものを1つずつ抜き出します。次に、当該のDLLファイルをWindowsのデフォルトフォルダから以下のパスにコピーします。
%User Temp%\_{5桁から9桁のランダムなアルファベット文字}.dll
続いて、以下のAPIを用いてコピー先のDLLをロードします(以降、区別のために「親プロセス側のDLL」と呼ぶ)。
LoadLibraryEx
この際、以下のパラメータを指定することで、ロード時のエラーを抑制します。
DONT_RESOLVE_DLL_REFERENCES(1)
続いて、親プロセス側でロードしたDLLイメージと、子プロセス側でロードされたDLLイメージのそれぞれをメモリ上に展開し、両者を比較します。まず、ヘッダーのチェックサム値と、エクスポート表に含まれる名前ポインタの個数を比較します。差異がある場合、両DLLは名前が一致するだけで実質的に別ファイルと考えられるため、処理の対象外とします。
上記の比較で差異が見られない場合、子プロセス側から対象DLLのエクスポート表を取得します。さらに、表に含まれるエクスポートアドレスを1つ1つ取り出し、それが「実行可能メモリページのコードを指しているか」、「当該コードの先頭部が変更されているか」の2点をチェックします。前者では、メモリ保護定数として以下のいずれかが設定されているかを確認します。
PAGE_EXECUTE(0x10)
PAGE_EXECUTE_READ(0x20)
PAGE_EXECUTE_READWRITE(0x40)
後者では、コードの先頭バイトが「0xE8(CALL:処理の呼び出し)」、「0xE9(JMP:処理の分岐)」のいずれかに相当するか、または、先頭2バイト分が親プロセス側のものと異なっているかを確認します。以上の他に、エクスポートアドレスの名前が「RtlNtdllName」でないことも確認します。RtlNtdllNameの場合、当該アドレスは実行コードではなくデータを指すためです。
以上のチェックを全て通過した場合、子プロセス側の当該エクスポートアドレスを「変更解除リスト」に追加します。
全DLLのチェック完了後、変更解除リストに含まれる各アドレスについて、親プロセス側の先頭8バイトを子プロセス側に上書きコピーします。これにより、子プロセス側に加えられているコード上の変更が解除されます。
最後にUNAPIMONは、親プロセス用にランダムな名前で作成したDLLファイルを削除し、子プロセスのメインスレッドを再開させます。なお、UNAPIMONのアンロード時には、CreateProcessWに設定したフックを取り消します。
攻撃による影響
以上に述べたUNAPIMONの挙動や攻撃時の使用法を踏まえると、本マルウェアの主目的は、サンドボックス環境などによる解析や監視を妨害することにあると考えられます。解析環境では、APIに対してフックを設定することで、その利用状況を監視しようとします。これに対しUNAPIMONは、重要APIに設定されたフックを解除することで、子プロセスの不正な挙動を監視の目から隠そうとします。
本マルウェアで注目すべき性質は、その簡潔さと、発想力にあります。Microsoft Detoursを用いた手口から示されるように、例え簡易なツールであっても、攻撃者の発想力によって強力な武器に変化する場合があります。また、こうしたことを実行できるマルウェア開発者は、相応の発想力に加え、高いコーディング力を有していると考えられます。通常、フックの設定はマルウェア側が行うものですが、今回はその逆パターンとなりました。
セキュリティ推奨事項
今回のEarth Freybugによる攻撃では、被害システムの管理者権限が不正利用されました。そのため、管理者の認証情報は事前に攻撃者の手元にあり、グループポリシーが実質的に機能しなかったと考えられます。こうした事態を防ぐためには、パスワードの頻繁な変更、管理者アカウントへのアクセス制限、動作ログの採取などを通し、管理や監視を強化することが重要です。
本事例では、トレンドマイクロによる制御の効かないサードパーティ製のグループウェアを介してデータが流出しました。流出元と考えられるグループウェア用フォルダに書き込み禁止設定を行ったとしても、攻撃者は管理者権限を保持しているため、その設定を容易に上書きできると考えられます。
ユーザの方は、「最小権限」の原則を遵守し、管理者権限の対象者を厳密に制限することを推奨します。管理者権限を行使できる人が少なければ少ないほど、攻撃者につけ入れられる隙間も狭くなります。
まとめ
Earth Freybugはかなりの期間に渡って攻撃活動を展開し、手口を進化させてきました。今回の事例はそうした傾向を裏付けるものであり、当該グループが目的の達成に向けて強力な手段を模索し続けていることが明らかになりました。
本事例からは、例え単純な手口であっても、使い方によっては大きな脅威となることが示唆されます。一連の手口が既存の攻撃パターンに応用されれば、その検知はより一層困難なものとなるでしょう。以上を踏まえ、セキュリティ調査チームやSOCチームでは、最新の高度な攻撃手法だけでなく、見過ごされやすい簡易な手口にも警戒することを推奨します。
侵入の痕跡(IoC:Indicators of Compromise)
こちらをご参照ください。
参考記事:
Earth Freybug Uses UNAPIMON for Unhooking Critical APIs
By: Christopher So
翻訳:清水 浩平(Core Technology Marketing, Trend Micro™ Research)