flawopen.com/Incidents/tensorlake-npm-install-hook-compromise-october-2026
Tensorlake npm 0.5.144: 악성 설치 훅
Tensorlake AI SDK의 악성 릴리스에 preinstall 로더가 추가됐습니다. 유지관리자는 main에 대한 직접 변경을 확인하고 배포 절차를 강화했으며, GitHub 악성코드 권고는 실행된 호스트를 침해된 것으로 간주하라고 안내합니다. 연구자들은 로더 패턴을 ChainDrop/Shai-Hulud 계열과 연결하지만, GitHub 권고는 이 귀속을 확인하지 않습니다.[1], [2], [3], [4], [5]
이 패키지를 설치하는 것은 전원을 연결하자마자 작동하는 기기를 꽂는 것과 같았습니다. 버튼을 누르거나 직접 사용할 필요가 없었습니다. npm은 SDK를 import하기 전에 설치 프로세스의 권한으로 악성 preinstall 훅을 실행했습니다.[3], [6], [1]
핵심 개념 및 용어
preinstall 라이프사이클 훅- npm이 설치 중 실행할 수 있는 스크립트입니다. Tensorlake 0.5.144의 공개 manifest는 이 훅으로 로더를 실행했으므로 SDK import가 필요하지 않았습니다.[1], [6]
provenance attestation- 아티팩트의 출처와 빌드 과정을 보여주는 증거입니다. 유지관리자는 악성 릴리스에 npm provenance가 있었다고 밝혔지만, 이것이 소스 코드의 안전성을 증명하지는 않습니다.[2], [3]
설치 스크립트 tripwire- 공개 manifest에 설치 라이프사이클 스크립트가 선언되면 CI를 실패시키는 검사입니다. Tensorlake는 사건 후 npm ci --ignore-scripts와 함께 이를 추가했습니다.[3]
프레임워크 매핑
- 이 가이드에서 설명하는 약점의 CWE 참조: CWE-506
사고 타임라인
단계별 공격 실행 흐름
소스 코드 비교: 취약한 구현 vs 보안 패치
이 CI 비교는 유지관리자가 병합한 PR #1016을 따르며 악성 패키지나 exploit은 포함하지 않습니다. tripwire는 설치 전에 실행되어 공개 manifest의 설치 훅을 거부하고, ignore-scripts는 npm ci가 의존성 라이프사이클 스크립트를 실행하지 못하게 합니다. 유지관리자는 이 설정으로 테스트와 SDK 빌드가 통과했다고 밝혔습니다. 훅이 필요한 패키지에는 영향이 있을 수 있으며 npm test처럼 명시적으로 실행한 명령은 해당 스크립트를 계속 실행합니다. 후속 빌드 단계를 격리하고 provenance를 소스 코드 검토로 간주하지 마세요. 이 코드는 일부만 보여줍니다. 유지관리자의 tripwire는 선언된 설치 훅을 확인하는 것 외에 typescript/lib/의 예상치 못한 파일도 거부합니다.[3], [6]
steps:
- run: npm cisteps:
- run: node scripts/check-no-install-scripts.mjs
- run: npm ci --ignore-scripts엔지니어링 및 시스템 보안 강화 체크리스트
- ✓manifest, lockfile, 캐시, 빌드 기록에서 tensorlake@0.5.144를 찾으세요. 권고는 이 특정 npm 버전을 지목합니다. 패키지 이름만으로 노출을 추정하지 마세요.[1]
- ✓설치가 실행됐다면 호스트를 네트워크에서 격리하고 증거를 보존하세요. 의존성을 제거해도 지속성이나 다른 변경이 사라졌다는 증거가 되지 않습니다. 무결성을 확인할 수 없다면 신뢰할 수 있는 미디어에서 재구성하세요.[1], [4], [5]
- ✓호스트를 격리한 상태로 토큰 폐기나 교체 전에 연구자들이 보고한 토큰 폐기 시 작동할 수 있는 지속성을 식별하고 제거하도록 사고 대응 담당자와 조율하세요. 최신 대응 지침을 따르고 깨끗한 시스템에서 조치하세요.[4], [5]
- ✓대응 담당자가 보고된 지속성을 처리한 뒤 깨끗한 시스템에서 설치 프로세스가 접근할 수 있던 자격 증명을 폐기하고 교체하세요. 접근 가능한 저장소와 패키지 배포를 검토하고 CI 아티팩트와 감사 로그에서 무단 변경을 확인하세요.[4], [5], [3]
- ✓CI에서는 검토된 설치 스크립트 검사를 의존성 설치 전에 실행하고 호환된다면 npm ci --ignore-scripts를 사용하세요. 필요한 빌드 스크립트는 격리하고 관리자/direct-push 우회는 제거하며 패키지 배포에는 독립 승인을 요구하세요.[3], [6]
- ✓2026-10-12 기준으로 다음
tensorlake-native-*관련 패키지 6개(0.5.144) 중 하나라도 환경에 설치되었는지 확인하세요:tensorlake-native-linux-x64-gnu,tensorlake-native-linux-x64-musl,tensorlake-native-linux-arm64-gnu,tensorlake-native-linux-arm64-musl,tensorlake-native-darwin-arm64,tensorlake-native-win32-x64. 해당 날짜에 npm registry가 각 패키지의 버전 메타데이터를 반환했으므로 아직 게시된 것으로 보고 노출 목록에 포함하세요. 이는 registry에서 사용할 수 있었다는 사실만 확인하며, 관련 패키지에 사고 페이로드가 포함되었다는 뜻은 아닙니다. 병합된 PR #1016에서 관리자는 당시 이 버전들을 아직 게시 중단해야 한다고 밝혔습니다.[3], [8], [9], [10], [11], [12], [13]
출처
- GitHub Advisory Database — GHSA-rqxj-g25x-4v9v
- Tensorlake — 사고 issue #1014
- Tensorlake — 대응 PR #1016
- StepSecurity — 기술 분석
- Socket — 기술 분석
- npm v10 — npm ci 및 ignore-scripts
- Tensorlake — 정상 릴리스 0.5.145
- npm registry — tensorlake-native-linux-x64-gnu@0.5.144
- npm registry — tensorlake-native-linux-x64-musl@0.5.144
- npm registry — tensorlake-native-linux-arm64-gnu@0.5.144
- npm registry — tensorlake-native-linux-arm64-musl@0.5.144
- npm registry — tensorlake-native-darwin-arm64@0.5.144
- npm registry — tensorlake-native-win32-x64@0.5.144