무슨 일이 있었나
2026년 10월 8일 01:12 UTC, AI 에이전트용 서버리스 샌드박스 플랫폼의 SDK인 npm 패키지 tensorlake의 0.5.144 버전이 자격 증명을 훔치는 Shai-Hulud 계열 웜을 담은 채 배포됐습니다. 이 패키지의 주간 다운로드는 약 1만 2천~1만 8천 회입니다. 메인테이너 권고문에 따르면 해당 버전은 약 1시간 40분 동안 공개됐고 텔레메트리상 사용 흔적은 없었습니다. Socket은 배포 11분 뒤 악성 버전을 탐지했습니다.
공개된 분석에 따르면 Tensorlake의 PyPI와 Cargo 패키지는 영향을 받지 않았습니다.
침투 경로
공격은 npm이 아니라 GitHub에서 시작됐습니다.
- 10월 7일, 공격자는 메인테이너의 관리자 계정으로 웹 UI를 통해 tensorlakeai/tensorlake의 main 브랜치에 직접 커밋했습니다. 풀 리퀘스트는 없었습니다.
- 커밋 8개로 페이로드를 다듬고 package.json에 preinstall 훅을 추가했습니다.
- 약 20시간 뒤 같은 계정이 공식 배포 워크플로를 수동 실행했습니다.
결과적으로 패키지는 **유효한 출처 증명(provenance)**을 달고 배포됐습니다. StepSecurity가 지적했듯 출처 증명은 패키지가 어디서 빌드됐는지를 말할 뿐 코드가 안전하다는 뜻은 아닙니다.
악성코드의 동작
- preinstall 훅이 난독화된 로더를 실행해 Bun 런타임을 내려받고 856KB 페이로드를 실행합니다.
- npm·GitHub 토큰, 클라우드·Kubernetes·Vault 자격 증명, AI 코딩 도구 설정 파일을 훔칩니다.
- 확산을 시도합니다. 사용자의 다른 패키지를 재배포하고, 가짜 작성자 "claude@users.noreply.github.com"과 메시지 "chore: update dependencies"로 저장소에 .claude와 .vscode 파일을 커밋합니다.
- 인질 토큰: 훔친 GitHub 토큰을 최대 24시간 동안 60초마다 확인하는 모니터를 설치합니다. 토큰이 폐기되면 홈 디렉터리를 삭제합니다(Linux·macOS에서 rm -rf ~/). 함정이 작동하는 조건에 대해서는 연구자마다 의견이 다릅니다.
두 파일 구조(setup.mjs와 Math_Symbol.js)는 TeamPCP가 공개한 "mini Shai-Hulud" 코드를 기반으로 한 8월의 keyv·cacheable 공격과 같습니다. 같은 그룹이라는 증거는 없습니다.
설치했다면
- 토큰을 폐기하기 전에 머신을 격리하고 모니터링 프로세스를 종료하세요. 홈 디렉터리를 잃지 않기 위해서입니다.
- 머신의 모든 자격 증명을 유출된 것으로 간주하세요: npm, GitHub, 클라우드, AI 에이전트 설정. 그런 다음 모두 교체하세요.
- 낯선 작성자의 "chore: update dependencies" 커밋과 새 워크플로가 저장소에 있는지 확인하세요.
- 자신의 패키지가 최근 배포된 버전도 점검하세요.
교훈
- 관리자를 포함해 main에 대한 모든 푸시에 리뷰를 의무화하세요.
- 메인테이너 계정에는 **하드웨어 키(FIDO2)**를 쓰세요.
- 갓 배포된 버전 설치 전 **대기 기간(쿨다운)**을 두고, 가능하면 설치 스크립트를 비활성화하세요.
- AI 코딩 도구는 이제 표적입니다. 그 설정에는 값비싼 키가 들어 있습니다.
출처
- Tensorlake 보안 권고(GHSA-8g63-53c9-65j2): https://github.com/tensorlakeai/tensorlake/security/advisories/GHSA-8g63-53c9-65j2
- Socket: https://www.socket.dev/blog/tensorlake-compromise
- StepSecurity: https://www.stepsecurity.io/blog/tensorlake-npm-compromised-hostage-token-worm
- Aikido: https://www.aikido.dev/blog/tensorlake-npm-package-compromised
소프트웨어 공급망과 파이프라인을 보호하고 싶으신가요? KGA IT가 무료 상담을 제공합니다: kga-it.com