DEV#POPPER RAT이 손상된 Joyfill npm 릴리스를 통해 배포됨
Detection stack
- AIDR
- Alert
- ETL
- Query
요약
두 개의 손상된 베타 릴리스 @joyfill npm 패키지에는 가져오기 시 임플란트되는 JavaScript가 포함되어 있습니다. 이 임플란트는 Tron, Aptos, BNB Smart Chain 전반의 블록체인 트랜잭션을 사용하여 DEV#POPPER 원격 접근 트로이 목마(RAT)를 해결하고 다운로드합니다. 이 캠페인은 모듈이 import되는 즉시 악성 코드를 실행하여 개발자 워크스테이션과 CI/CD 파이프라인을 대상으로 합니다.
조사
소켓 연구 팀은 분석하는 동안 손상을 밝혀냈습니다. @joyfill/layouts and @joyfill/components. 연구원들은 난독화된 JavaScript와 블록체인 기반 전달 메커니즘을 결합한 다단계 페이로드 전달 체인을 확인했습니다. 조사는 초기 로더를 PolinRider 가족과 연결하여 최종 페이로드가 DEV#POPPER 악성코드 패밀리에 속함을 확인했습니다.
완화
개발자는 즉시 영향을 받은 @joyfill 베타 버전을 락파일, 패키지 캐시, 빌드 환경, 배포 아티팩트에서 삭제해야 합니다. 의존성을 인증된 릴리스에 고정하는 것이 권장됩니다. @joyfill/layouts@0.1.1 or @joyfill/components@4.0.0-rc24 보안 팀 또한 레지스트리 프록시와 의존성 관리 도구를 통해 손상된 버전을 차단해야 합니다.
대응
영향을 받은 패키지를 가져온 모든 시스템은 격리되어야 하며, 손상된 Node.js 프로세스에 접근 가능한 모든 자격 증명은 교체되어야 합니다. 조사자는 VS Code, GitHub Desktop, 디스코드를 포함한 개발자 애플리케이션에서 핵심 모듈에 대한 예기치 않은 변경 사항을 검사해야 합니다. 엔드포인트 및 CI/CD 원격 측정은 고립된 Node.js 프로세스, 알려진 C2 주소, 의심스러운 블록체인 RPC 트래픽을 검토해야 합니다.
공격 흐름
탐지
C2 채널로서의 공용 노드 이더리움 남용 시도 가능성(via dns_query)
보기
IP 조회 도메인 통신 시도 가능성(via dns)
보기
Linux 스크린샷이 찍힌 가능성(via cmdline)
보기
Linux 호스트에 숨김 파일이 생성됨(via file_event)
보기
IOCs (HashSha256)을 감지: DEV#POPPER 원격 접근 트로이 목마를 전달하기 위해 손상된 두 Joyfill npm 베타 릴리스
보기
IOCs (SourceIP)을 감지: DEV#POPPER 원격 접근 트로이 목마를 전달하기 위해 손상된 두 Joyfill npm 베타 릴리스
보기
IOCs (DestinationIP)을 감지: DEV#POPPER 원격 접근 트로이 목마를 전달하기 위해 손상된 두 Joyfill npm 베타 릴리스
보기
DEV#POPPER 악성코드 지표 탐지 [Windows 네트워크 연결]
보기
손상된 Joyfill npm 패키지가 원격 접근 트로이 목마를 전달함 [Linux 파일 이벤트]
보기
Node.js 모듈 주입 및 분리 프로세스 실행 탐지 [Linux 프로세스 생성]
보기
시뮬레이션 실행
전제 조건: 원격 측정 및 기준치 사전 점검이 통과해야 합니다.
이유: 이 섹션은 탐지 규칙을 촉발시키기 위해 설계된 적대 기술(TTP)의 정확한 실행을 설명합니다. 명령과 서술은 반드시 식별된 TTP를 직접 반영하고, 탐지 논리에 의해 예상되는 정확한 원격 측정을 생성해야 합니다. 추상적이거나 관련 없는 예는 오진의 원인이 될 것입니다.
-
공격 서사 및 명령: 적은 널리 사용되는 npm 종속성에 악성 코드를 성공적으로 주입했습니다(공급망 손상). 개발자가
npm install을 실행하거나 프로젝트를 시작할 때 악성 스크립트가 실행됩니다. 스크립트는 먼저require함수를 글로벌 변수(global.r = require)에 할당하여 의도를 숨기려고 시도하며, 이를 통해require직접 호출하지 않고 애플리케이션의 어느 곳에서나 모듈을 로드할 수 있습니다(난독화). 마지막으로child_process.spawn을 사용하여 Command & Control (C2) 서버로 연결하는 분리된 셸 프로세스를 시작하며, 부모 Node.js 프로세스에서 악성 프로세스를 분리하여 탐지를 피하려고 시도합니다. -
회귀 테스트 스크립트:
#!/bin/bash # Node.js 주입 탐지 규칙을 유발하기 위한 시뮬레이션 스크립트. # 이 스크립트는 임시 악성 JS 파일을 생성하고 Node.js를 통해 실행합니다. MALICIOUS_FILE="malicious_pkg.js" echo "[+] 악성 Node.js 스크립트 생성중..." cat << 'EOF' > $MALICIOUS_FILE // 글로벌 모듈 주입 시뮬레이션 (T1027) global.r = require; // detached 프로세스 실행 시뮬레이션을 위한 child_process.spawn (T1059.006) const cp = require('child_process'); cp.spawn('bash', ['-c', 'sleep 30 &'], { detached: true, stdio: 'ignore' }); console.log("[!] 악성 페이로드가 실행되었습니다."); EOF echo "[+] Node.js를 통해 악성 스크립트 실행중..." node $MALICIOUS_FILE echo "[+] 시뮬레이션 완료. SIEM을 체크하여 경고 확인: Node.js 모듈 주입 및 분리 프로세스 실행 탐지." -
정리 명령:
# 시뮬레이션된 악성 파일 제거 rm -f malicious_pkg.js # 시뮬레이션에 의해 생성된 고아 sleep 프로세스 제거 pkill -f "sleep 30"