활성 공급망 공격, node-ipc 패키지 손상
Detection stack
- AIDR
- Alert
- ETL
- Query
요약
Socket 연구원들이 발견한 소프트웨어 공급망 공격은 다음의 84개 npm 패키지에 영향을 미쳤습니다: @tanstack 네임스페이스에 속한 패키지들입니다. 악성 업데이트는 GitHub Actions, AWS, HashiCorp Vault, Kubernetes 환경으로부터 CI 관련 비밀을 탈취하기 위한 강력하게 난독화된 자바스크립트 파일을 도입했습니다. 그런 다음, 이러한 자격 증명을 사용하여 npm에 다시 배포되었습니다. 페이로드는 또한 Claude Code 및 VS Code 구성 디렉토리에 지속성 훅을 심었습니다. 연구원들은 이 활동을 더 넓은 Mini Shai-Hulud 공급망 멀웨어 캠페인과 연관시켰습니다.
조사
조사에 따르면 새로 추가된 파일 router_init.js가 발견되었으며, 문자열 배열 회전, 추가 XOR 및 Base64 디코딩 레이어, 데몬화를 사용하여 행동을 숨겼습니다. 멀웨어는 환경 변수, 클라우드 메타데이터 서비스 및 GitHub, AWS, Vault, Kubernetes와 관련된 API 엔드포인트를 표적으로 하여 자격 증명을 수집했습니다. GitHub Actions OIDC 연합을 악용하여 npm 게시 토큰을 획득하고 악성 optionalDependency on @tanstack/setup를 삽입했습니다. 데이터 송수신 트래픽은 Session 분산 메시징 네트워크를 통해 라우팅되었습니다.
완화
캠페인에 영향을 받은 조직은 모든 @tanstack/* 패키지 내용을 해시로 검증하고, 모든 CI 및 클라우드 자격 증명을 교체하며, 노출된 OIDC 연합 권한을 철회하고, 무단 파일을 .claude and .vscode 디렉토리에서 제거해야 합니다. 또한 filev2.getsession.org 으로의 아웃바운드 트래픽을 차단하고, npm 패키지의 무결성 제어를 시행함으로써 노출을 줄일 수 있습니다. GitHub Actions 워크플로우는 타사 작업을 고정하고 최소화하여 강화되어야 합니다 id-token 권한을.
대응
방어자는 router_init.js 및 관련 파일 이름의 존재를 사냥하고, 의심스러운 프로세스 스폰 조짐을 모니터링하며, 확인된 클라우드 메타데이터 엔드포인트에 대한 접근을 경고해야 합니다. 손상된 패키지는 격리되고, 악성 훅은 제거되어야 하며, 모든 노출된 자격 증명은 즉시 교체되어야 합니다. 보안 팀은 또한 무단으로 사용된 토큰에 대해 GitHub Actions 활동을 전체 리뷰하고, 모든 게시된 npm 패키지의 출처를 검증해야 합니다.
"graph TB %% 클래스 정의 classDef technique fill:#e6f7ff classDef operator fill:#ffcc66 %% 각 ATT&CK 기술을 대표하는 노드 a_initial_access["<b>기술</b> – <b>T1195.001 소프트웨어 공급망 공격</b><br/><b>설명</b>: 적이 초기 접근을 위해 소프트웨어 공급망(e.g., 악성 npm 패키지)을 공격합니다."] class a_initial_access technique b_execution["<b>기술</b> – <b>T1129 공유 모듈</b><br/><b>설명</b>: 악성 공유 모듈(router_init.js)이 패키지 설치 시 자동으로 실행됩니다."] class b_execution technique c_persistence["<b>기술</b> – <b>T1176.002 IDE 확장</b><br/><b>설명</b>: 숨겨진 파일 (.claude, .vscode) 및 훅을 작성하여 손상된 IDE 확장을 통해 지속성을 유지합니다."] class c_persistence technique d_def_evasion["<b>기술</b> – <b>T1027 난독화된 파일 또는 정보</b><br/><b>설명</b>: 페이로드는 탐지를 피하기 위해 난독화됩니다.<br/><b>기술</b> – <b>T1140 디난독화/디코드 파일 또는 정보</b><br/><b>설명</b>: 실행 전에 런타임 루틴이 코드를 디난독화합니다."] class d_def_evasion technique e_cred_access["<b>기술</b> – <b>T1552.005 보안되지 않은 자격 증명</b><br/><b>설명</b>: 클라우드 인스턴스 메타데이터 API에서 자격 증명을 읽습니다.<br/><b>기술</b> – <b>T1555.006 클라우드 비밀 관리</b><br/><b>설명</b>: 클라우드 비밀 저장소에서 비밀을 검색합니다."] class e_cred_access technique f_account_disc["<b>기술</b> – <b>T1087.004 클라우드 계정</b><br/><b>설명</b>: 리소스 및 권한을 식별하기 위해 클라우드 계정 정보를 열거합니다."] class f_account_disc technique g_cred_use["<b>기술</b> – <b>T1078 유효한 계정</b><br/><b>설명</b>: 수집된 OIDC 토큰을 유효한 계정으로 사용하여 추가 악성 패키지를 게시합니다."] class g_cred_use technique h_propagation["<b>기술</b> – <b>T1195.001 공급망 공격</b><br/><b>설명</b>: optionalDependencies 및 npm prepare 훅을 통해 다운스트림 프로젝트로 확산되도록 악성 패키지를 재사용합니다."] class h_propagation technique i_command_exec["<b>기술</b> – <b>T1059.009 클라우드 API 호출</b><br/><b>설명</b>: 손상된 환경에서 GitHub, AWS, Vault API를 직접 호출하여 명령을 실행합니다."] class i_command_exec technique j_exfiltration["<b>기술</b> – <b>T1041 C2 채널을 통한 데이터 탈출</b><br/><b>설명</b>: 손상된 노드 간에 설정된 피어 투 피어 세션 채널을 통해 데이터를 탈출시킵니다."] class j_exfiltration technique k_remote_services["<b>기술</b> – <b>T1021.007 클라우드 서비스</b><br/><b>설명</b>: GitHub GraphQL 커밋을 원격 서비스로 활용해 명령 및 제어를 유지합니다."] class k_remote_services technique %% 순차적 흐름 연결 a_initial_access –>|leads_to| b_execution b_execution –>|leads_to| c_persistence c_persistence –>|leads_to| d_def_evasion d_def_evasion –>|leads_to| e_cred_access e_cred_access –>|leads_to| f_account_disc f_account_disc –>|leads_to| g_cred_use g_cred_use –>|leads_to| h_propagation h_propagation –>|leads_to| i_command_exec i_command_exec –>|leads_to| j_exfiltration j_exfiltration –>|leads_to| k_remote_services "
공격 흐름
탐지
의심스러운 실행 파일 다운로드 (프록시 경유)
보기
비정상 디렉터리에 생성된 Visual Studio Code 자동 작업 구성 파일 [MACOS] (파일 이벤트 경유)
보기
비정상 디렉터리에 생성된 Visual Studio Code 자동 작업 구성 파일 [LINUX] (파일 이벤트 경유)
보기
탐지를 위한 IOCs (HashSha256): 활성 공급망 공격: node-ipc 패키지 손상
보기
탐지를 위한 IOCs (HashSha1): 활성 공급망 공격: node-ipc 패키지 손상
보기
탐지를 위한 IOCs (HashMd5): 활성 공급망 공격: node-ipc 패키지 손상
보기
AWS 자격 증명 수집 IMDSv2 및 ECS 작업 메타데이터 엔드포인트 경유 [AWS Cloudtrail]
보기
시뮬레이션 실행
전제조건: 텔레메트리 및 기준 비행 전 점검이 완료되어야 합니다.
이유: 이 섹션은 탐지 규칙을 트리거하기 위한 적의 기술(TTP)의 정확한 실행을 자세히 설명합니다. 명령 및 내러티브는 확인된 TTP를 직접 반영하고 탐지 로직에서 기대하는 정확한 텔레메트리를 생성해야 합니다. 추상적이거나 관련 없는 예시는 오진을 초래할 수 있습니다.
-
공격 내러티브 및 명령:
- IMDSv2 세션 토큰 확보 – 공격자가 발급한
PUT토큰 엔드포인트에 21600초의 TTL로 요청. - 토큰을 사용하여 IAM 역할 이름 조회 다음에서 노출된
/latest/meta-data/iam/security-credentials/. - 임시 IAM 자격 증명 검색 (AccessKeyId, SecretAccessKey, Token) 인스턴스 프로필에 대한.
- 자격 증명을 저장 나중에 사용하기 위해 로컬에 (예: AWS API 호출, 회전, 또는 비밀번호 스프레이 공격 수행).
이 단계들은 Sigma 규칙에 명시된 정확한 URI로 HTTP 트래픽을 발생시켜, VPC 플로우 로그에 캡처될 때 탐지 조건을 충족시킵니다.
- IMDSv2 세션 토큰 확보 – 공격자가 발급한
-
회귀 테스트 스크립트:
#!/usr/bin/env bash # ------------------------------------------------- # 스크립트: aws_imds_credential_harvest.sh # 목적: IMDSv2 / ECS 메타데이터를 통한 자격 증명 수집 시뮬레이션 # ------------------------------------------------- set -euo pipefail # 1. IMDSv2 토큰 요청 TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600" -s) if [[ -z "$TOKEN" ]]; then echo "[!] IMDSv2 토큰 획득 실패" exit 1 fi echo "[*] IMDSv2 토큰 획득" # 2. 인스턴스에 연결된 IAM 역할 이름 가져오기 ROLE_NAME=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -s http://169.254.169.254/latest/meta-data/iam/security-credentials/) if [[ -z "$ROLE_NAME" ]]; then echo "[!] IAM 역할 이름을 가져올 수 없습니다" exit 1 fi echo "[*] 인스턴스 IAM 역할: $ROLE_NAME" # 3. 역할의 임시 자격 증명 검색 CREDS_JSON=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -s http://169.254.169.254/latest/meta-data/iam/security-credentials/$ROLE_NAME) echo "[*] 자격 증명 확보:" echo "$CREDS_JSON" | jq . # 4. (선택 사항) 나중에 AWS CLI 사용을 위한 환경 변수로 내보내기 export AWS_ACCESS_KEY_ID=$(echo "$CREDS_JSON" | jq -r .AccessKeyId) export AWS_SECRET_ACCESS_KEY=$(echo "$CREDS_JSON" | jq -r .SecretAccessKey) export AWS_SESSION_TOKEN=$(echo "$CREDS_JSON" | jq -r .Token) echo "[*] 자격 증명이 환경에 내보내졌습니다 (데모 용도로만)." # ------------------------------------------------- # 스크립트 끝 # ------------------------------------------------- -
정리 명령:
# 임시 자격 증명을 포함하는 환경 변수 해제 unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN # 임시 파일 제거 (이 스크립트 내에서 생성되지 않음) echo "[*] 정리 완료."