전염성 인터뷰: VS Code Tasks 감염 벡터 추적
Detection stack
- AIDR
- Alert
- ETL
- Query
요약
이 보고서는 Visual Studio Code 작업 정의(tasks.json)를 무기화하여 개발자 엔드포인트에서 초기 코드 실행을 얻으려는 북한 소행의 캠페인을 다룹니다. 악성 작업 항목은 Vercel, Render와 같은 호스팅 플랫폼에서 추가 페이로드를 가져오거나 악성 NPM 종속성을 가져오도록 명령을 실행합니다. 이 실행 체인은 결국 BeaverTail과 InvisibleFerret을 포함한 백도어의 배포를 가능하게 합니다.
조사
연구원들은 GitHub 코드 검색을 활용하여 curl 또는 wget 실행이 내장된 tasks.json 파일을 포함하는 저장소를 식별했습니다. 그들은 페이로드 호스팅 도메인을 분석하고, 스크립트를 이미지 및 폰트 파일 내부에 숨기는 난독화 방법을 문서화했으며, jsonwebauth라는 악성 NPM 패키지를 발견했습니다. 또한, 커밋 작성자 이메일 주소를 연계하고 Vercel 기반의 전달을 넘어선 인프라 매핑을 확장했습니다.
완화
VS Code에서 자동 작업 실행을 비활성화하고 작업 공간을 신뢰하거나 열기 전에 tasks.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)의 정확한 실행을 설명합니다. 명령어와 서술은 식별된 TTP를 직접 반영하고 탐지 로직이 예상하는 정확한 수집을 생성해야 합니다. 추상적이거나 관련 없는 예는 오진으로 이어질 것입니다.
-
공격 서사 및 명령어:
이미 사용자의 워크스테이션을 침투한 공격자는 VS Code의 tasks.json 기능을 활용하여 악성 Windows 실행 파일(payload.exe)을 Node.js를 통해 실행합니다. 공격자는cmd.exe /c node payload.exe를 호출하는 작업을 작성하여, 규칙의 세 가지 키워드 요구사항(tasks.json,node,cmd)을 만족시킵니다. 사용자의.vscode폴더에 악성 작업 정의를 저장한 후, 공격자는 VS Code의 명령어 팔레트를 통해 작업을 실행하여cmd.exeandnode.exe프로세스가 윈도우 보안 로그에 세 가지 요구된 문자열이 포함된 명령 줄과 함께 나타나도록 합니다. -
회귀 테스트 스크립트: (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를 통해 작업 실행 # (PATH에 `code`가 있다고 가정) Write-Host "Executing malicious VS Code task..." 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