UNC7017がソフトウェアサプライチェーン攻撃でAOMEI Technologyを標的に
Detection stack
- AIDR
- Alert
- ETL
- Query
概要
UNC7017は、AOMEIテクノロジーの更新インフラストラクチャを狙った高度なソフトウェアサプライチェーンキャンペーンを実行しました。この脅威アクターは、短時間の設定改ざんウィンドウを利用して更新要求を悪意のあるサーバーにリダイレクトし、従来のポイントインタイムスキャンを回避しました。キャンペーンは、CROSSROADダウンローダーとSHINYROADバックドアを含む多段階のペイロードチェーンを提供しました。
調査
調査はMandiant Google Threat Intelligence Group(GTIG)とManageEngine Threat Analysis Lab(METAL)によって共同で実施されました。研究者たちはEDRテレメトリを通じてキャンペーンを検出し、敵が5分から10分の短時間で改ざんを行っていたことを確認しました。また、分析により、クラウドプロバイダから専用のベンダーを模したドメインや正規のクラウドストレージへのインフラストラクチャ移動が示されました。
緩和策
ベンダーは、すべてのダウンロード可能な実行ファイルおよび設定ファイルに対して、エンドツーエンドの暗号署名検証を強制する必要があります。組織は、更新クライアントが不正なドメインへのリダイレクトを防ぐために厳格な宛先ピニングを実施するべきです。アプリ内ハンドラー内のURIスキームを制限することも、WebDAVを利用したNTLM資格情報強制攻撃を防ぐのに役立ちます。
対応策
セキュリティチームは、2026年4月から7月の期間をカバーするレトロスペクティブエンドポイントおよびネットワークハントを実施するべきです。信頼できるアップデートランナーによって起動された署名されていない子プロセスや、不正なネットワークリダイレクションの兆候を監視することを優先します。アナリストは、ベンダーがホストするURLのライブチェックに頼らずに、ローカルにキャッシュされたエンドポイント構成ファイルを検査すべきです。
攻撃フロー
この部分はまだ更新中です。
検出
不審なスケジュールされたタスク(監査経由)
疑わしいディレクトリ内でのPowerShell実行プロセス(cmdline経由)
代替のリモートアクセス/管理ソフトウェア(process_creation経由)
疑わしいIPルックアップドメイン通信の試み(dns経由)
IOCs(HashSha256)を検出する:一時的なサプライチェーン改ざんの調査
IOCs(SourceIP)を検出する:一時的なサプライチェーン改ざんの調査
IOCs(DestinationIP)を検出する:一時的なサプライチェーン改ざんの調査
悪意のあるAOMEIソフトウェア更新リダイレクトの検出 [プロキシ]
CROSSROADとSHINYROADマルウェアアクティビティの検出 [Windows Sysmon]
SHINYROADキャンペーンのための悪意のあるDLLおよび一時サービスの検出 [Windows File Event]
シミュレーション実行
-
攻撃の物語とコマンド: 敵は、サプライチェーンの妥協(T1195.002)を通じてワークステーションにCROSSROADダウンローダーを成功裏に配備しました。バックドアの複数のインスタンスが互いに干渉したり、システムの不安定を引き起こすのを防ぐために、マルウェアは特定のMutexを作成しようとします。攻撃者の目標は、長期間にわたるコマンド&コントロール(C2)とデータ抽出のための永続的なバックドア(T1547)を確立することです。このシミュレーションでは、検出ルールで特定された正確なグローバルおよびローカルのミューテックス文字列を作成することにより、この動作を模倣するPowerShellスクリプトを実行します。
-
回帰テストスクリプト:
# CROSSROAD/SHINYROAD Mutexシミュレーションスクリプト # このスクリプトは、検出ルールによってターゲットとされた特定のミューテックスの作成をシミュレートします。 Write-Host "[*] ミューテックスシミュレーションを開始しています..." -ForegroundColor Cyan # 1. グローバルミューテックスのシミュレーション (CROSSROAD) try { $globalMutexName = "GlobalF9E6E3C0-E11A-4F85-9944-AF4AD6E05883" Write-Host "[!] グローバルミューテックスの作成を試みています: $globalMutexName" -ForegroundColor Yellow $globalMutex = New-Object System.Threading.Mutex($true, $globalMutexName) Write-Host "[+] グローバルミューテックスが正常に作成されました。" -ForegroundColor Green } catch { Write-Error "[X] グローバルミューテックスの作成に失敗しました: $($_.Exception.Message)" } # 2. ローカルミューテックスのシミュレーション (SHINYROAD) try { $localMutexName = "Local963d3c60-d406-4ad6-aa1e-dc8e45061ccf" Write-Host "[!] ローカルミューテックスの作成を試みています: $localMutexName" -ForegroundColor Yellow $localMutex = New-Object System.Threading.Mutex($true, $localMutexName) Write-Host "[+] ローカルミューテックスが正常に作成されました。" -ForegroundColor Green } catch { Write-Error "[X] ローカルミューテックスの作成に失敗しました: $($_.Exception.Message)" } Write-Host "[*] テレメトリキャプチャを確実にするために、30秒間ミューテックスが保持されます..." -ForegroundColor Cyan Start-Sleep -Seconds 30 # クリーンアップ(スクリプト終了時に手動解放が行われますが、明示的な方が良い) if ($globalMutex) { $globalMutex.ReleaseMutex() } if ($localMutex) { $localMutex.ReleaseMutex() } Write-Host "[*] シミュレーション完了。" -ForegroundColor Cyan -
クリーンアップコマンド:
# スクリプトが中断された場合に備えて、ミューテックスを解放するためにこれを実行します # 注: PowerShellでは、プロセスが終了すると、通常OSがミューテックスをクリーンアップします。 # これは、シミュレーションランナーのための安全対策です。 Write-Host "[*] クリーンアップを実行しています..." # プロセス終了時に特定のコマンドは必要ありませんが、非運用ハンドルがないことを確認します。