カレンダーを悪用した C2 : APT41 の革新的な戦術
Google Threat Intelligence Group
【Next Tokyo ’25】
【Next Tokyo】120 以上のセッションをアーカイブ公開中。話題の Gemini、生成 AI、AI エージェントなどの Google Cloud のアップデートや顧客事例をチェックしましょう。
視聴はこちら※この投稿は米国時間 2025 年 5 月 29 日に、Google Cloud blog に投稿されたものの抄訳です。
Google Threat Intelligence グループ(GTIG)の使命は、Google の何十億ものユーザーと Google の多種多様なプロダクトやサービスを保護することです。2024 年 10 月下旬、GTIG は、政府のウェブサイトが悪用されていることを発見しました。このウェブサイトでは、他の複数の政府機関を標的にするために使用されているマルウェアがホストされていました。攻撃を受けたサイトは、Google カレンダーをコマンド&コントロール(C2)に利用した「TOUGHPROGRESS」と呼ばれるマルウェア ペイロードを配信しました。C2 のためにクラウド サービスを悪用することは、多くの脅威アクターが正当なアクティビティに紛れ込むために利用する手法です。
Google は、このマルウェアが中華人民共和国(PRC)を拠点とする脅威アクター APT41(HOODOO としても追跡されている)によって使用されているものであると、高い確度で評価しています。APT41 の標的は世界中に広がっており、政府の他にも、世界的な配送と物流、メディアとエンターテイメント、テクノロジー、自動車といった分野の組織も標的となっています。
概要
このブログ投稿では、マルウェアの配信方法、マルウェア攻撃チェーンの技術的な詳細を分析し、その他の最近の APT41 の活動について取り上げ、セキュリティ担当者が同様の攻撃を防御できるよう、セキュリティ侵害インジケーター(IoC)を共有します。また、GTIG がカスタム検出シグネチャを使用してこのキャンペーンを阻止し、攻撃者が制御するインフラストラクチャをシャットダウンした方法と、セーフ ブラウジングに追加された保護機能についても詳しく説明します。


図 1: TOUGHPROGRESS キャンペーンの概要
配信
APT41 は、侵害された政府機関のウェブサイトでホストされている ZIP アーカイブへのリンクが記載されたスピア フィッシング メールを配信しました。アーカイブには、PDF を装った LNK ファイルとディレクトリが含まれています。このディレクトリ内を確認したところ、節足動物の JPG 画像が 7 つほどありました。ペイロードが LNK を介して実行されると、その LNK は削除され、代わりに、これらの種は輸出の際に申告する必要があると書かれた PDF のおとりファイルがユーザーに表示されます。
$ unzip -l 出境海關申報清單.zip
Length Date Time Name
--------- ---------- ----- ----
0 2024-10-23 11:00 image/
12633 2024-10-23 10:53 image/1.jpg
10282 2024-10-23 10:54 image/2.jpg
8288 2024-10-23 10:54 image/3.jpg
4174 2024-10-23 10:54 image/4.jpg
181656 2024-10-23 10:54 image/5.jpg
997111 2024-10-23 11:00 image/6.jpg
124928 2024-10-23 11:00 image/7.jpg
88604 2024-10-23 11:03 申報物品清單.pdf.lnk
--------- -------
1427676 9 個のファイル
「6.jpg」と「7.jpg」のファイルは偽の画像です。1 つ目のファイルは実際には暗号化されたペイロードであり、2 つ目のファイルによって復号されます。2 つ目のファイルは、ターゲットが LNK をクリックしたときに起動される DLL ファイルです。
マルウェア感染チェーン
このマルウェアには 3 つの異なるモジュールがあり、それぞれが連続してデプロイされ、異なる機能を果たします。各モジュールには、ステルス手法と回避手法も実装されています。メモリのみのペイロード、暗号化、圧縮、プロセスの空洞化、制御フローの難読化、C2 向けの Google カレンダーの活用などです。
-
PLUSDROP - メモリ内の次のステージを復号して実行する DLL。
-
PLUSINJECT - 正当な「svchost.exe」プロセスを起動してプロセスの空洞化を実行し、最終ペイロードを挿入します。
-
TOUGHPROGRESS - 侵害された Windows ホストでアクションを実行します。C2 では Google カレンダーを使用します。
TOUGHPROGRESS の分析
TOUGHPROGRESS は、ハードコードされた 16 バイトの XOR 鍵を使用して、サンプルの「.pdata」領域に保存されている埋め込みシェルコードを復号することから始まります。次に、シェルコードが COMPRESSION_FORMAT_LZNT1 を使用して、メモリ内の DLL を解凍します。この DLL は、複数の難読化手法を重ねて、制御フローをわかりにくくします。
-
レジスタベースの間接呼び出し
-
動的アドレス演算
-
64 ビットのレジスタのオーバーフロー
-
関数ディスパッチ テーブル
レジスタベースの間接呼び出しは、レジスタに保存するアドレスを動的に計算した後に実行されます。この計算には、64 ビットのレジスタを意図的にオーバーフローさせる 2 つ以上のハードコードされた値が関与しています。CreateThread を呼び出す例を次に示します。


図 2: 動的アドレス演算と 64 ビット オーバーフローによるレジスタベースの間接呼び出し
Python の「ctypes」を使用して 64 ビットのレジスタ演算をシミュレートすることで、この動作を再現できます。2 つの値を加算すると 64 ビットのアドレス空間がオーバーフローし、その結果が呼び出される関数のアドレスになります。


図 3: 64 ビット アドレスのオーバーフローのデモ


図 4: ディスパッチ テーブルの CreateThread
これらの難読化手法は、制御フローの難読化戦術として現れます。間接呼び出しと算術演算が原因で、逆アセンブラは制御フローグラフを正確に再現できません。
カレンダー C2
TOUGHPROGRESS は、攻撃者が制御する Google カレンダーで予定を読み書きする機能を備えています。実行されると、TOUGHPROGRESS は、ハードコードされた日付 2023-05-30 に 0 分間のカレンダーの予定を作成します。侵害されたホストから収集したデータは暗号化され、カレンダーの予定の説明に書き込まれます。
オペレーターは、2023-07-30 と 2023-07-31 のカレンダーの予定に暗号化されたコマンドを配置します。これらの日付は事前に決められており、マルウェアにもハードコードされています。その後、TOUGHPROGRESS はこれらの予定についてカレンダーのポーリングを開始します。予定が取得されると、予定の説明が復号され、その説明に含まれるコマンドが侵害されたホスト上で実行されます。コマンドの実行結果は暗号化され、別のカレンダーの予定に書き戻されます。
GTIG は Mandiant FLARE チームと協力して、TOUGHPROGRESS が利用している C2 暗号化プロトコルをリバース エンジニアリングしました。マルウェアは、ハードコードされた 10 バイトの XOR 鍵を使用し、メッセージごとに 4 バイトの XOR 鍵を生成します。
-
LZNT1 でメッセージを圧縮する
-
4 バイトの XOR 鍵でメッセージを暗号化する
-
4 バイトの鍵をメッセージ ヘッダーの末尾に追加する(合計 10 バイト)
-
10 バイトの XOR 鍵でヘッダーを暗号化する
-
暗号化されたヘッダーをメッセージの先頭に追加する
-
暗号化されたヘッダーとメッセージを組み合わせたものがカレンダーの予定の説明になる


図 5: カレンダーの予定の説明の TOUGHPROGRESS 暗号化ルーチン


図 6: TOUGHPROGRESS が作成したカレンダーの予定の例
攻撃者を阻止して Google、Google のユーザー、Google のお客様を保護する
GTIG は、脅威をモニタリングするだけでなく、脅威に対抗し、脅威を阻止することを目標としています。Google は、Google のプロダクト全体でマルウェア キャンペーンを事前にブロックし、ユーザーとお客様を大規模に保護することを目指しています。
APT41 と TOUGHPROGRESS マルウェアを阻止するために、Google は、攻撃者が制御するカレンダーを特定して削除するカスタム フィンガープリントを開発しました。また、攻撃者が制御する Workspace プロジェクトも停止し、APT41 がこのキャンペーンで利用したインフラストラクチャを事実上解体しました。さらに、ファイル検出を更新し、Google セーフ ブラウジングのブロックリストに悪意のあるドメインと URL を追加しました。
GTIG は、Mandiant Consulting と連携して、侵害を受けた組織に通知しました。通知を受けた組織には、検出とインシデント対応を支援するために、TOUGHPROGRESS ネットワーク トラフィック ログのサンプルと脅威アクターに関する情報を提供しました。
進行中のアクティビティに対する保護
GTIG は、Workspace アプリケーションを使用して、数年間にわたり APT41 の攻撃を積極的にモニタリングして、防御してきました。この脅威グループは、創造的なマルウェア キャンペーンで知られており、Workspace アプリケーションを利用することもあります。
-
Google Cloud の CISO オフィスは、2023 年 4 月に Threat Horizons レポートを公開しました。このレポートでは、HOODOO がマルウェアの C2 のために Google スプレッドシートと Google ドライブを使用した経緯を詳しく説明しています。
-
2024 年 10 月、Proofpoint が公開したレポートでは、VOLDEMORT マルウェア ファミリーが APT41 に属するものであると結論づけています。
-
2024 年 7 月に GTIG と Mandiant が報告した DUSTTRAP マルウェア ファミリーは、C2 のためにパブリック クラウド ホスティングを使用していました。
いずれの場合も、GTIG は攻撃者が制御する Workspace プロジェクトと、APT41 がこれらのキャンペーンで利用していたインフラストラクチャを特定し、停止しました。
無料のウェブ ホスティング インフラストラクチャ
少なくとも 2024 年 8 月以降、APT41 がマルウェアの配布に無料のウェブ ホスティング ツールを使用していることが確認されています。これには、VOLDEMORT、DUSTTRAP、TOUGHPROGRESS に加えて、他のペイロードも含まれる可能性があります。これらの無料ホスティング サイトへのリンクは、さまざまな地域や業界の何百ものターゲットに送信されています。
APT41 は Cloudflare Worker サブドメインを最も頻繁に使用していますが、InfinityFree や TryCloudflare の使用も確認されています。下記のサブドメインと URL は、過去のキャンペーンで確認されたものですが、現在は APT41 では使用されていない可能性があります。
Cloudflare Workers
-
word[.]msapp[.]workers[.]dev
-
cloud[.]msapp[.]workers[.]dev
TryCloudflare
-
term-restore-satisfied-hence[.]trycloudflare[.]com
-
ways-sms-pmc-shareholders[.]trycloudflare[.]com
InfinityFree
-
resource[.]infinityfreeapp[.]com
-
pubs[.]infinityfreeapp[.]com
また、APT41 は、フィッシング メッセージで URL 短縮サービスを使用していることが確認されています。短縮 URL にアクセスすると、無料ホスティング アプリケーションのサブドメインでホストされているマルウェアにリダイレクトされます。
-
https[:]//lihi[.]cc/6dekU
-
https[:]//tinyurl[.]com/hycev3y7
-
https[:]//my5353[.]com/nWyTf
-
https[:]//reurl[.]cc/WNr2Xy
このブログ投稿で紹介したすべてのドメインと URL は、セーフ ブラウジングのブロックリストに追加されています。これにより、サイトへのアクセス時に警告が表示されるようになり、ユーザーによるマルウェアのダウンロードを防げます。
セキュリティ侵害インジケーター
このブログ投稿で紹介した IOC は、Google Threat Intelligence のコレクションとしても利用できます。
ハッシュ
ドメイン
-
word[.]msapp[.]workers[.]dev
-
cloud[.]msapp[.]workers[.]dev
-
term-restore-satisfied-hence[.]trycloudflare[.]com
-
ways-sms-pmc-shareholders[.]trycloudflare[.]com
-
resource[.]infinityfreeapp[.]com
-
pubs[.]infinityfreeapp[.]com
URL 短縮リンク
-
https[:]//lihi[.]cc/6dekU
-
https[:]//lihi[.]cc/v3OyQ
-
https[:]//lihi[.]cc/5nlgd
-
https[:]//lihi[.]cc/edcOv
-
https[:]//lihi[.]cc/4z5sh
-
https[:]//tinyurl[.]com/mr42t4yv
-
https[:]//tinyurl[.]com/hycev3y7
-
https[:]//tinyurl[.]com/mpa2c5wj
-
https[:]//tinyurl[.]com/3wnz46pv
-
https[:]//my5353[.]com/ppOH5
-
https[:]//my5353[.]com/nWyTf
-
https[:]//my5353[.]com/fPUcX
-
https[:]//my5353[.]com/ZwEkm
-
https[:]//my5353[.]com/vEWiT
-
https[:]//reurl[.]cc/WNr2Xy
カレンダー
-
104075625139-l53k83pb6jbbc2qbreo4i5a0vepen41j.apps.googleusercontent.com
-
https[:]//www[.]googleapis[.]com/calendar/v3/calendars/ff57964096cadc1a8733cf566b41c9528c89d30edec86326c723932c1e79ebf0@group.calendar.google.com/events
YARA ルール
rule G_Backdoor_TOUGHPROGRESS_LNK_1 {
meta:
author = "GTIG"
date_created = "2025-04-29"
date_modified = "2025-04-29"
md5 = "65da1a9026cf171a5a7779bc5ee45fb1"
rev = 1
strings:
$marker = { 4C 00 00 00 }
$str1 = "rundll32.exe" ascii wide
$str2 = ".\\image\\7.jpg,plus" wide
$str3 = "%PDF-1"
$str4 = "PYL="
condition:
$marker at 0 and all of them
}
rule G_Dropper_PLUSDROP_1 {
meta:
author = "GTIG"
date_created = "2025-04-29"
date_modified = "2025-04-29"
md5 = "9492022a939d4c727a5fa462590dc0dd"
rev = 1
strings:
$decrypt_and_launch_payload = { 48 8B ?? 83 ?? 0F 0F B6 ?? ?? ??
30 04 ?? 48 FF ?? 49 3B ?? 72 ?? 80 [1-5] 00 75 ?? B? 5B 55 D2 56 [0-8] E8
[4-32] 33 ?? 33 ?? FF D? [0-4] FF D? }
condition:
uint16(0) == 0x5a4d and all of them
}
その他の YARA ルール
これは、別の TOUGHPROGRESS キャンペーンで PLUSDROP を開始するために使用される 2 つ目のドロッパーです。
rule G_Dropper_TOUGHPROGRESS_XML_1 {
meta:
author = "GTIG"
description = "XML lure file used to launch a PLUSDROP dll."
md5 = "dccbb41af2fcf78d56ea3de8f3d1a12c"
strings:
$str1 = "System.Convert.FromBase64String"
$str2 = "VirtualAlloc"
$str3 = ".InteropServices.Marshal.Copy"
$str4 = ".DllImport"
$str5 = "kernel32.dll"
$str6 = "powrprof.dll"
$str7 = ".Marshal.GetDelegateForFunctionPointer"
condition:
uint16(0)!= 0x5A4D and all of them and filesize > 500KB and
filesize < 5MB
}
PLUSBED は、他の TOUGHPROGRESS キャンペーンで確認された追加のステージです。
rule G_Dropper_PLUSBED_2 {
meta:
author = "GTIG"
date_created = "2025-04-29"
date_modified = "2025-04-29"
md5 = "39a46d7f1ef9b9a5e40860cd5f646b9d"
rev = 1
strings:
$api1 = { BA 54 B8 B9 1A }
$api2 = { BA 78 1F 20 7F }
$api3 = { BA 62 34 89 5E }
$api4 = { BA 65 62 10 4B }
$api5 = { C7 44 24 34 6E 74 64 6C 66 C7 44 24 38 6C 00 FF D0 }
condition:
uint16(0) != 0x5A4D and all of them
}
-Google Threat Intelligence グループ、執筆者: Patrick Whitsell