Entrevista Contagiosa: Seguimiento del Vector de Infección de Tareas de VS Code
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.
Flujo de Ataque
Detecciones
Creación o Modificación del Archivo de Tareas de VS Code (vía evento de archivo)
Ver
Detección de Ejecución Maliciosa de Node.js en Tareas de VS Code [Creación de Proceso en Windows]
Ver
Detección de Ejecución Maliciosa de Tareas de VS Code [Creación de Proceso en Linux]
Ver
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 invocacmd.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.vscodedel usuario, el atacante ejecuta la tarea a través del paleta de comandos de VS Code, causandocmd.exeandnode.exeprocesos 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