SOC Prime Bias: Crítico

27 Ene 2026 17:12

Entrevista Contagiosa: Seguimiento del Vector de Infección de Tareas de VS Code

Author Photo
Ruslan Mikhalov Chief of Threat Research at SOC Prime linkedin icon Seguir
Entrevista Contagiosa: Seguimiento del Vector de Infección de Tareas de VS Code
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Resumen

El informe detalla una campaña atribuida a Corea del Norte que utiliza definiciones de tareas de Visual Studio Code (tasks.json) para lograr la ejecución inicial de código en los endpoints de desarrolladores. Las entradas de tareas maliciosas ejecutan comandos que obtienen cargas adicionales desde plataformas de alojamiento como Vercel, Render y servicios similares, o integran dependencias NPM maliciosas. Esta cadena de ejecución finalmente permite el despliegue de puertas traseras, incluyendo BeaverTail e InvisibleFerret.

Investigación

Los investigadores utilizaron la búsqueda de código de GitHub para identificar repositorios que contenían archivos tasks.json con ejecuciones embebidas de curl o wget. Analizaron dominios de alojamiento de cargas, documentaron métodos de ofuscación que esconden scripts dentro de archivos de imágenes y fuentes, y descubrieron un paquete NPM malicioso llamado jsonwebauth. El estudio también correlacionó direcciones de correo electrónico de los autores de commits y amplió el mapeo de infraestructura más allá de la entrega basada en Vercel.

Mitigación

Deshabilite la ejecución automática de tareas en VS Code y revise el contenido de tasks.json antes de confiar o abrir un espacio de trabajo. Utilice el entorno github.dev en el navegador para inspeccionar repositorios sin ejecutar tareas locales. Monitoree procesos secundarios sospechosos de VS Code, solicitudes de red inesperadas a dominios de payload conocidos, y rutas de ejecución de Node.js que intenten ejecutar archivos no JavaScript.

Respuesta

Si se identifica, aísle el endpoint, termine los procesos sospechosos generados por VS Code y bloquee el tráfico saliente a los dominios maliciosos asociados. Recolecte y analice las cargas descargadas, y realice validación forense para persistencia y actividad de puertas traseras vinculadas a BeaverTail e InvisibleFerret.

graph TB %% Class Definitions classDef technique fill:#ffcc99 classDef action fill:#c2f0c2 %% Nodes – Techniques node_initial_access[«<b>Técnica</b> – <b>T1195.001 Compromiso de la Cadena de Suministro</b><br><b>Descripción</b>: Los adversarios comprometen la cadena de suministro de software para distribuir el paquete NPM malicioso \»jsonwebauth\».»] class node_initial_access technique node_ide_abuse[«<b>Técnica</b> – <b>T1176.002 Abuso de Extensiones de IDE: Tareas de VS Code</b><br><b>Descripción</b>: Una extensión maliciosa de VS Code utiliza tasks.json para ejecutar acciones cuando se abre una carpeta.»] class node_ide_abuse technique node_execution[«<b>Técnica</b> – <b>T1202 Ejecución Indirecta de Comandos</b><br><b>Descripción</b>: Los comandos se ejecutan indirectamente mediante tareas de VS Code activadas por el evento folderOpen.»] class node_execution technique node_command_exec[«<b>Técnica</b> – <b>T1059.004 Shell Unix / T1059.003 Shell de Comandos de Windows</b><br><b>Descripción</b>: Utiliza canalizaciones de curl o wget en shells Unix o Windows para recuperar código adicional.»] class node_command_exec technique node_obfuscation[«<b>Técnica</b> – <b>T1027.009 Payloads Ofuscados Incrustados en Fuentes/Imágenes</b><br><b>Descripción</b>: Los payloads maliciosos se ocultan dentro de archivos de fuentes o imágenes para evadir la detección.»] class node_obfuscation technique node_masquerading[«<b>Técnica</b> – <b>T1036.008 Enmascaramiento de Tipos de Archivo</b><br><b>Descripción</b>: Los archivos se disfrazan como tipos legítimos para mezclarse con contenido normal.»] class node_masquerading technique %% Nodes – Actions node_download[«<b>Acción</b> – Descargar Payloads<br><b>Detalles</b>: Recupera payloads maliciosos desde Vercel o servicios de almacenamiento JSON.»] class node_download action node_persistence[«<b>Acción</b> – Ejecución Adicional / Persistencia<br><b>Detalles</b>: Ejecuta y mantiene el código malicioso en el sistema comprometido.»] class node_persistence action %% Connections node_initial_access –>|conduce_a| node_ide_abuse node_ide_abuse –>|habilita| node_execution node_execution –>|ejecuta| node_command_exec node_command_exec –>|descarga| node_download node_download –>|contiene| node_obfuscation node_obfuscation –>|usa| node_masquerading node_masquerading –>|conduce_a| node_persistence

Flujo de Ataque

Ejecución de Simulación

Prerequisito: La Comprobación Previa de Telemetría y Baseline debe haber pasado.

Motivo: Esta sección detalla la ejecución precisa de la técnica del adversario (TTP) diseñada para activar la regla de detección. Los comandos y la narrativa DEBEN reflejar directamente los TTPs identificados y apuntar a generar la telemetría exacta esperada por la lógica de detección. Ejemplos abstractos o no relacionados llevarán a un diagnóstico erróneo.

  • Narrativa y Comandos de Ataque:
    Un atacante que ya ha comprometido el estación de trabajo del usuario aprovecha tasks.json la característica de VS Code para ejecutar un ejecutable de Windows malicioso (payload.exe) a través de Node.js. El atacante crea una tarea que invoca cmd.exe /c node payload.exe, satisfaciendo así el requisito de tres palabras clave de la regla (tasks.json, node, cmd). Después de guardar la definición maliciosa de la tarea bajo el .vscode del usuario, el atacante ejecuta la tarea a través del paleta de comandos de VS Code, causando cmd.exe and node.exe procesos que aparecen en el registro de seguridad de Windows con una línea de comandos que contiene las tres cadenas requeridas.

  • Script de Prueba de Regresión: (PowerShell – auto-contenido)

     # ---------------------------------------------------------
      # Simulación de Tarea Maliciosa de VS Code - Activa la Regla Sigma
      # ---------------------------------------------------------
    
      # 1. Prepare una carga maliciosa ficticia (ejecutable no JS)
      $payloadPath = "$env:USERPROFILEDesktoppayload.exe"
      # Crear un pequeño ejecutable usando Add-Type de PowerShell (para demo)
      Add-Type -TypeDefinition @"
      using System;
      public class Dummy {
          public static void Main() {
              System.Console.WriteLine("Carga ejecutada");
          }
      }
      "@ -Language CSharp
      [Dummy]::Main() | Out-File -FilePath $payloadPath -Encoding ascii
    
      # 2. Construir el tasks.json de VS Code con comando malicioso
      $vscodeDir = "$env:USERPROFILE.vscode"
      if (-not (Test-Path $vscodeDir)) { New-Item -ItemType Directory -Path $vscodeDir | Out-Null }
    
      $tasksJson = @{
          version = "2.0.0"
          tasks   = @(
              @{
                  label   = "Ejecutar Carga Maliciosa"
                  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. Activar la tarea via CLI de VS Code
      # (Asume que `code` está en PATH)
      Write-Host "Ejecutando tarea maliciosa de VS Code..."
      code --folder-uri "$env:USERPROFILE" --command "workbench.action.tasks.runTask" --args "Ejecutar Carga Maliciosa"
    
      # 4. Espere unos segundos para que los procesos aparezcan en el registro
      Start-Sleep -Seconds 5
    
      # 5. OPCIONAL: Consultar el registro local de eventos para verificar (para demostración)
      Get-WinEvent -FilterHashtable @{
          LogName='Security';
          Id=4688;
          Data='node.exe';
      } | Where-Object {$_.Message -match 'tasks.json'} | ft TimeCreated, Message -AutoSize
  • Comandos de Limpieza: (PowerShell)

     # Eliminar carga maliciosa y definición de tarea de VS Code
      Remove-Item -Path "$env:USERPROFILEDesktoppayload.exe" -Force -ErrorAction SilentlyContinue
      Remove-Item -Path "$env:USERPROFILE.vscodetasks.json" -Force -ErrorAction SilentlyContinue
      # Opcional: reiniciar VS Code para borrar cualquier tarea almacenada en caché
      Get-Process -Name "Code" -ErrorAction SilentlyContinue | Stop-Process -Force