感染力のあるインタビュー:VS Code タスク感染ベクトルの追跡
Detection stack
- AIDR
- Alert
- ETL
- Query
概要
このレポートは、北朝鮮に起因するキャンペーンの詳細を説明しています。このキャンペーンでは、Visual Studio Codeのタスク定義(tasks.json)を武器化して、開発者のエンドポイントで初期のコード実行を行います。悪意のあるタスクエントリは、Vercel、Render、または同様のサービスなどのホスティングプラットフォームから追加のペイロードを取得するコマンドを実行するか、悪意のあるNPM依存関係を取り込みます。この実行チェーンは、最終的にBeaverTailやInvisibleFerretなどのバックドアを展開することを可能にします。
調査
研究者たちは、GitHubのコード検索を活用して、curlやwgetが埋め込まれたtasks.jsonファイルを含むリポジトリを特定しました。彼らは、スクリプトを画像やフォントファイルに隠す難読化方法を文書化し、悪意のあるNPMパッケージjsonwebauthを明らかにしました。また、コミットの作者のメールアドレスを関連付け、Vercelベースの配信を超えたインフラストラクチャマッピングを拡大しました。
緩和策
VS Codeでの自動タスク実行を無効にし、タスク.jsonの内容を信頼する前にレビューしてください。リポジトリをローカルでタスクを実行することなく調査するために、ブラウザのgithub.dev環境を利用してください。VS Codeの子プロセスに対する不審な動作、既知のペイロードドメインへの予期しないネットワークリクエスト、非JavaScriptファイルを実行しようとするNode.jsの実行パスを監視してください。
対応策
特定された場合は、エンドポイントを隔離し、疑わしいVS Codeが生成したプロセスを終了させ、関連する悪意のあるドメインへの送信トラフィックをブロックしてください。ダウンロードされたペイロードを収集して分析し、BeaverTailやInvisibleFerretに関連する持続性とバックドア活動の法医学的検証を行ってください。
攻撃フロー
シミュレーション実行
前提条件: テレメトリと基準のプレフライトチェックが合格していること。
理由: このセクションは、敵対者の技術(TTP)をトリガするように設計された検出ルールの正確な実行を詳細に説明します。コマンドと記述は識別されたTTPsを直接反映し、検出ロジックに期待される正確なテレメトリを生成することを目的としていなければなりません。抽象的または無関係な例は誤診に繋がります。
-
攻撃の説明とコマンド:
すでにユーザーのワークステーションを侵害した攻撃者は、VS Codeの tasks.json 機能を利用して、悪意のあるWindows実行ファイル(payload.exe)をNode.js経由で実行します。攻撃者は、cmd.exe /c node payload.exeを呼び出すタスクを作成し、ルールの3つのキーワード要件(tasks.json,node,cmd)を満たします。悪意のあるタスク定義をユーザーの.vscodeフォルダの下に保存した後、攻撃者はVS Codeのコマンドパレットを介してタスクを実行し、cmd.exeandnode.exeプロセスが、必要な3つの文字列を含むコマンドラインとともにWindowsセキュリティログに表示されます。 -
回帰テストスクリプト: (PowerShell – 自己完結型)
# --------------------------------------------------------- # 悪意あるVS Codeタスクのシミュレーション – Sigmaルールをトリガー # --------------------------------------------------------- # 1. ダミーの悪意のあるペイロード(非JS実行可能ファイル)を準備する $payloadPath = "$env:USERPROFILEDesktoppayload.exe" # デモ用にPowerShellのAdd-Typeを使用して小さな実行可能ファイルを作成する Add-Type -TypeDefinition @" using System; public class Dummy { public static void Main() { System.Console.WriteLine("Payload executed"); } } "@ -Language CSharp [Dummy]::Main() | Out-File -FilePath $payloadPath -Encoding ascii # 2. 悪意のあるコマンドを含むVS Codeのtasks.jsonを作成する $vscodeDir = "$env:USERPROFILE.vscode" if (-not (Test-Path $vscodeDir)) { New-Item -ItemType Directory -Path $vscodeDir | Out-Null } $tasksJson = @{ version = "2.0.0" tasks = @( @{ label = "Run Malicious Payload" type = "shell" command = "cmd.exe" args = @("/c", "node", "`"$payloadPath`"") } ) } | ConvertTo-Json -Depth 5 $tasksFile = Join-Path $vscodeDir "tasks.json" $tasksJson | Set-Content -Path $tasksFile -Encoding UTF8 # 3. VS Code CLIを介してタスクをトリガーする # (codeがPATHにあることを前提とする) Write-Host "悪意のあるVS Codeタスクを実行中..." code --folder-uri "$env:USERPROFILE" --command "workbench.action.tasks.runTask" --args "Run Malicious Payload" # 4. プロセスがログに表示されるまで数秒待つ Start-Sleep -Seconds 5 # 5. オプション: 検証のためにローカルのイベントログを問い合わせる(デモ用) Get-WinEvent -FilterHashtable @{ LogName='Security'; Id=4688; Data='node.exe'; } | Where-Object {$_.Message -match 'tasks.json'} | ft TimeCreated, Message -AutoSize -
クリーンアップコマンド: (PowerShell)
# 悪意のあるペイロードとVS Codeタスク定義を削除する Remove-Item -Path "$env:USERPROFILEDesktoppayload.exe" -Force -ErrorAction SilentlyContinue Remove-Item -Path "$env:USERPROFILE.vscodetasks.json" -Force -ErrorAction SilentlyContinue # オプション: キャッシュされたタスクをクリアするためにVS Codeを再起動する Get-Process -Name "Code" -ErrorAction SilentlyContinue | Stop-Process -Force