TL;DR

  • SubQuery의 @subql/common@5.8.3에 postinstall 자격 증명 탈취 악성 코드가 포함돼 있으며, 설치하거나 패키지를 불러온 시스템과 CI 러너를 침해된 것으로 간주해야 함.
  • 악성 릴리스는 2026년 10월 5일 11:56 UTC에 npm 신뢰 게시자(GitHub Actions OIDC)를 통해 배포됐으며, 5.8.2에는 없는 페이로드가 포함됨.
  • 페이로드는 환경 변수와 GitHub·SSH·클라우드·쿠버네티스·Vault·암호화폐 지갑·AI 에이전트 자격 증명을 수집해 https://ci-artifacts.dev/router로 전송함.
  • 탈취한 GitHub 토큰으로 비밀 정보를 아티팩트에 덤프하는 워크플로를 포함한 브랜치를 푸시하고, 같은 호스트에 연결하는 원격 셸·명령 임플란트도 설치함.
  • 5.8.3 폐기와 latest 태그의 5.8.2 복구, 게시 파이프라인 조사, 저장소 및 조직의 자격 증명 교체와 침해 점검이 권고됨.

요약

  • 2026년 10월 5일 게시된 @subql/common@5.8.3에 자격 증명을 탈취하고 원격 명령 임플란트를 설치하는 악성 코드가 포함돼 있어, 패키지를 설치한 사용자는 시스템을 침해된 것으로 간주하고 자격 증명을 교체해야 함.
  • 이 버전은 현재 latest 태그이며, 5.8.2에는 해당 페이로드가 없음.
  • 배포는 프로젝트의 npm 신뢰 게시자(GitHub Actions OIDC)를 통해 Git 커밋 506863d6fb82bd2714970cf8c6f1bf364374b009에서 이뤄져, 릴리스 파이프라인이나 해당 릴리스에 반영된 커밋의 침해 가능성이 제기됨.
  • 참고 링크: https://app.stepsecurity.io/oss-security-feed/@subql/common?version=5.8.3

확인된 악성 동작

  • 5.8.2와 비교해 5.8.3에 다음 변경 사항이 추가됨.
  • package.json에 "postinstall": "node ./dist/project/readers/manifest-cache.js" 설정
  • 크기 62,124바이트인 dist/project/readers/manifest-cache.js 파일
  • dist/project/readers/index.js에 __exportStar(require("./manifest-cache"), exports);가 추가돼 require('@subql/common')만 실행해도 악성 코드가 작동함.
  • 새 파일에는 Base64 문자열 459개로 이뤄진 MANIFEST_CACHE_SEED 배열이 포함됨. 문자열은 시작 키 0x5a를 사용하는 롤링 XOR 방식으로 디코딩한 뒤 gunzip으로 압축 해제되며, 분리된 프로세스에서 new Function(...)으로 실행됨.
  • 디코딩된 83KB 번들은 다음 동작을 수행함.
  • 환경 변수, gh auth 토큰 출력, SSH 키, .npmrc, AWS·GCP·Azure 클라우드 자격 증명, Kubernetes 및 Vault 비밀 정보, 암호화폐 지갑, AI 에이전트 설정 수집
  • 수집한 정보를 RSA-OAEP와 AES-256-GCM으로 암호화해 https://ci-artifacts.dev/router로 전송
  • 탈취한 GitHub 토큰으로 dependabot/github_actions/format/setup-formatter 브랜치를 푸시하고, .github/workflows/codeql_analysis.yml에서 toJSON(secrets)를 아티팩트로 내보내도록 구성
  • 해당 커밋의 작성자를 github-advanced-security[bot]으로 위조
  • 같은 호스트에 비컨을 보내는 원격 셸·명령 임플란트 설치

침해 지표

  • 도메인: ci-artifacts.dev
  • 패키지 타르볼 SHA-256: 031267ee37c5a84c25cb0542cbfeb49f30d5604305b0bdccdeafbedcbbe6849b
  • manifest-cache.js SHA-256: f0c8b0cde86b98a2869a22fd43ffcf61f1dcca252729e2be291e590e3dc5f49a
  • 잠금 파일: $TMPDIR/tmp.ts018051808.lock
  • 브랜치 이름: dependabot/github_actions/format/setup-formatter

관련 버전

  • 5.8.3-onf-rt1은 redteam 배포 태그로 2026년 10월 5일 11:24 UTC에 게시됐으며, 32분 뒤 게시된 5.8.3과 달리 페이로드가 없음.
  • 해당 버전이 승인된 테스트 게시인지 확인이 필요함.

권고 조치

  • @subql/common@5.8.3을 폐기하거나 게시 취소하고 latest 태그를 5.8.2로 되돌림.
  • 커밋 506863d와 5.8.3을 게시한 릴리스 워크플로 실행에서 승인되지 않은 변경 사항이 있는지 검토함.
  • 저장소와 조직의 npm 신뢰 게시자 설정, GitHub 토큰, CI 및 Actions 비밀 정보를 교체함.
  • 저장소와 조직에서 위 브랜치명이나 워크플로가 있는지, 예상하지 못한 실행이 있었는지 점검함.
  • 5.8.3을 설치한 사용자가 자격 증명을 교체하도록 보안 권고문을 게시함.

`5.8.3` 설치자를 위한 안내

  • 해당 시스템이나 CI 러너를 침해된 것으로 간주함.
  • GitHub, npm, 클라우드, Kubernetes, Vault 자격 증명을 교체하고 저장소에서 위 브랜치와 워크플로가 있는지 확인함.