미아스마 공급망 공격, 팬텀 집 웜을 통해 확산
Detection stack
- AIDR
- Alert
- ETL
- Query
요약
새로운 Miasma 웜 변종이 악의적인 binding.gyp 파일을 악용하여 npm 생태계로 확산되고 있습니다. 이 파일은 npm install중 코드 실행을 유발합니다. 이 방법은 많은 전통적인 스크립트 기반 검사를 피하여 대체 Bun 런타임을 다운로드하고 CI/CD 및 클라우드 자격 증명을 탈취하여 수집된 데이터를 GitHub dead-drop 계정으로 전송합니다. 2026년 6월 3일에 불과 두 시간 이내에 진행된 빠르게 진행되는 캠페인 동안 57개 이상의 패키지가 손상되었습니다. 이 웜은 또한 AI 코딩 지원자 구성 파일 내에 백도어를 심습니다.
조사
연구자들은 강화된 GitHub Actions 러너 내에서 침입을 재현하고 공격에 관련된 전체 프로세스 트리, 네트워크 트래픽 및 코드 아티팩트를 캡처했습니다. 그들의 분석은 Phantom Gyp 기술, 4단계 난독화된 페이로드 체인, Node.js 동작에만 중점을 둔 탐지를 피하기 위해 Bun 사용을 밝혀냈습니다. 자격 증명 탈취는 러너 메모리를 읽고 클라우드 인스턴스 메타데이터 엔드포인트를 쿼리하여 수행되었습니다. 이후 탈취는 악의적인 계정으로 인증된 GitHub API 요청을 통해 동적으로 데이터를 저장하는 저장소를 만들어 수행되었습니다.
완화
방어자는 네이티브 빌드 단계 차단, node-gyp 가능한 경우 비활성화, 위험이 높은 환경에서 설치 스크립트 무시 등을 통해 노출을 줄여야 합니다. 레지스트리 냉각 창과 SLSA 출처 서명의 확인도 패키지 변조를 제한하는데 도움이 됩니다. 보안 팀은 예상치 못한 Bun 다운로드, 과도히 큰 루트 index.js 파일, 그리고 CI에서 발행된 토큰으로 GitHub 저장소 생성 여부를 주시해야 합니다. 노출된 모든 토큰이나 클라우드 자격 증명은 즉시 회전해야 합니다.
응답
조직은 binding.gyp 와 같은 패턴이 포함된 파일을 감지하고, Bun 런타임 다운로드를 경고하며, 악의적인 활동이 확인되면 영향을 받은 워크플로를 즉시 중지해야 합니다. 저장소는 삽입된 AI 보조자 구성 파일을 검사하고 신속히 정리되어야 합니다. 모든 탈취된 토큰은 철회 및 회전되어야 하고, CI/CD 권한 범위를 검토해야 하며, 자격 증명 노출의 범위를 결정하기 위해 전체 사고 대응 조사가 시작되어야 합니다. <!(node index.js ...), alert on Bun runtime downloads, and stop the affected workflow as soon as malicious activity is confirmed. Repositories should be scanned for injected AI assistant configuration files and cleaned promptly. All stolen tokens must be revoked and rotated, CI/CD permission scopes reviewed, and a full incident response investigation launched to determine the extent of credential exposure.
공격 흐름
우리는 이 부분을 여전히 업데이트하고 있습니다. 알림을 받으려면 가입하세요
알림 받기탐지
표준 도구를 통한 원격 파일 업로드 / 다운로드 (명령줄을 통해)
보기
임시 폴더에서 Linux 스크립트가 생성되었음 (파일 이벤트를 통해)
보기
Linux 호스트에서 숨겨진 파일이 생성되었음 (파일 이벤트를 통해)
보기
탐지할 IOCs (HashSha256): Miasma npm 공급망 공격: Phantom Gyp를 통한 자체 확산 웜
보기
탐지할 IOCs (HashMd5): Miasma npm 공급망 공격: Phantom Gyp를 통한 자체 확산 웜
보기
Miasma npm 공급망 공격 탐지 [네트워크 지표]
보기
Phantom Gyp 기술을 통한 Miasma npm 공급망 공격 탐지 [Linux 프로세스 생성]
보기
시뮬레이션 실행
필수 조건: Telemetry & Baseline Pre-flight Check가 통과되어야 합니다.
이유: 이 섹션은 탐지 규칙을 트리거하도록 설계된 적의 기술(TTP)의 정확한 실행을 상세하게 설명합니다. 명령 및 서사는 식별된 TTP를 직접 반영해야 하며, 탐지 논리에 의해 예상되는 정확한 텔레메트리를 생성하는 것을 목표로 합니다.
-
공격 서사 및 명령:
공격자는 악의적인binding.gyp을 추가하여 오픈 소스 npm 패키지를 손상시킵니다. 개발자가npm install를 실행하면, 패키지의 빌드 프로세스가node-gyp rebuild를 호출합니다. 생성된 빌드 스크립트 내부에서 공격자는:- Bun 런타임을 다운로드 (서명된 바이너리)를
curl을 통해 임시 디렉토리 (/tmp/b-<rand>/). - 로 을 호출하여 권한을 상승시켜 zip을 압축 해제하고 바이너리를
을 호출하여 권한을 상승시켜 zip을 압축 해제하고 바이너리를에 배치합니다.에 배치합니다.. - 개발자의 GitHub 토큰을 수집 하여
gh auth token. - 을 사용해 데이터 탈취 페이로드를 (
bun run /tmp/p1764ajw42rg.js) 형태로 실행합니다.
각 단계가 프로세스 생성 로그에 그대로 나타나며, Sigma 규칙의
컨텐츠목록을 만족시킵니다. - Bun 런타임을 다운로드 (서명된 바이너리)를
-
회귀 테스트 스크립트: 다음 Bash 스크립트는 통제된 테스트 환경에서 명령 체인을 정확히 재현합니다.
# miasma_phantom_gyp_simulation.sh set -euo pipefail # 1. 악성 binding.gyp를 포함한 가짜 npm 패키지 준비 PKG_DIR=$(mktemp -d /tmp/miasma_pkg.XXXX) cd "$PKG_DIR" npm init -y >/dev/null 2>&1 cat > binding.gyp <<'EOF' { "targets": [ { "target_name": "evil", "sources": [ "evil.c" ] } ] } EOF echo "int main(){return 0;}" > evil.c # 로컬에 node-gyp 설치 npm install node-gyp >/dev/null 2>&1 # 2. node-gyp rebuild 실행 (첫 번째 지표) ./node_modules/.bin/node-gyp rebuild # 3. Bun 런타임 다운로드 (두 번째 지표) TMPDIR=$(mktemp -d /tmp/b-XXXXXX) curl -sSL "https://github.com/oven-sh/bun/releases/download/bun-v1.3.13/bun-linux-x64-baseline.zip" -o "$TMPDIR/bun.zip" # 4. 압축 해제를 위해 sudo python3로 상승 (세 번째 지표) sudo python3 - <<PYTHON import zipfile, sys, os zip_path = os.getenv('TMPDIR') + '/bun.zip' with zipfile.ZipFile(zip_path, 'r') as z: z.extractall(os.getenv('TMPDIR')) PYTHON # 5. GitHub 토큰 획득 (네 번째 지표) # 참고: GitHub CLI가 설치되어 있고 사전에 인증이 되어 있어야 합니다. gh auth token > "$TMPDIR/gh_token.txt" # 6. Bun을 통해 악성 페이로드 실행 (다섯 번째 지표) # 더미 JS 페이로드 생성 echo "console.log('exfiltrated');" > "$TMPDIR/p1764ajw42rg.js" "$TMPDIR/bun" run "$TMPDIR/p1764ajw42rg.js" echo "시뮬레이션 완료. 생성된 경고를 확인하세요." -
정리 명령: 일시적인 아티팩트 및 권한 상승 아티팩트를 제거합니다.
# cleanup_miasma_simulation.sh set -euo pipefail # 임시 디렉토리 제거 rm -rf "$PKG_DIR" "$TMPDIR" # 필요하다면 /usr/local/bin에 배치된 Bun 바이너리 제거 if command -v bun >/dev/null; then sudo rm -f "$(command -v bun)" fi # 캡처된 GitHub 토큰 삭제 shred -u "$HOME/.config/gh/hosts.yml" 2>/dev/null || true echo "정리 완료."