SOC Prime Bias: 重大

27 1月 2026 17:12

感染力のあるインタビュー:VS Code タスク感染ベクトルの追跡

Author Photo
Ruslan Mikhalov Chief of Threat Research at SOC Prime linkedin icon フォローする
感染力のあるインタビュー:VS Code タスク感染ベクトルの追跡
shield icon

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に関連する持続性とバックドア活動の法医学的検証を行ってください。

graph TB %% Class Definitions classDef technique fill:#ffcc99 classDef action fill:#c2f0c2 %% Nodes – Techniques node_initial_access[“<b>技法</b> – <b>T1195.001 サプライチェーン侵害</b><br><b>説明</b>: 攻撃者はソフトウェアのサプライチェーンを侵害し、悪意のある NPM パッケージ「jsonwebauth」を配布する。”] class node_initial_access technique node_ide_abuse[“<b>技法</b> – <b>T1176.002 IDE 拡張機能の悪用: VS Code タスク</b><br><b>説明</b>: 悪意のある VS Code 拡張機能が tasks.json を利用し、フォルダーを開いた際にアクションを実行する。”] class node_ide_abuse technique node_execution[“<b>技法</b> – <b>T1202 間接的コマンド実行</b><br><b>説明</b>: folderOpen イベントによりトリガーされた VS Code タスクを介してコマンドが間接的に実行される。”] class node_execution technique node_command_exec[“<b>技法</b> – <b>T1059.004 Unix シェル / T1059.003 Windows コマンドシェル</b><br><b>説明</b>: Unix または Windows シェルで curl や wget パイプラインを使用し、追加コードを取得する。”] class node_command_exec technique node_obfuscation[“<b>技法</b> – <b>T1027.009 フォント/画像に埋め込まれた難読化ペイロード</b><br><b>説明</b>: 検出を回避するため、悪意のあるペイロードがフォントや画像ファイル内に隠される。”] class node_obfuscation technique node_masquerading[“<b>技法</b> – <b>T1036.008 ファイルタイプの偽装</b><br><b>説明</b>: 正常なコンテンツに紛れ込むため、ファイルが正規の種類を装う。”] class node_masquerading technique %% Nodes – Actions node_download[“<b>アクション</b> – ペイロードのダウンロード<br><b>詳細</b>: Vercel または JSON ストレージサービスから悪意のあるペイロードを取得する。”] class node_download action node_persistence[“<b>アクション</b> – 追加実行 / 永続化<br><b>詳細</b>: 侵害されたシステム上で悪意のあるコードを実行し、永続化する。”] class node_persistence action %% Connections node_initial_access –>|につながる| node_ide_abuse node_ide_abuse –>|有効化| node_execution node_execution –>|実行| node_command_exec node_command_exec –>|ダウンロード| node_download node_download –>|含む| node_obfuscation node_obfuscation –>|使用| node_masquerading node_masquerading –>|につながる| node_persistence

攻撃フロー

シミュレーション実行

前提条件: テレメトリと基準のプレフライトチェックが合格していること。

理由: このセクションは、敵対者の技術(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.exe and node.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