FlawOpen

flawopen.com/Incidents/tensorlake-npm-install-hook-compromise-october-2026

● Tensorlake · CWE-506 · October 8, 2026 · 심각
보안 연구 · FlawOpen

Tensorlake npm 0.5.144: 악성 설치 훅

Tensorlake AI SDK의 악성 릴리스에 preinstall 로더가 추가됐습니다. 유지관리자는 main에 대한 직접 변경을 확인하고 배포 절차를 강화했으며, GitHub 악성코드 권고는 실행된 호스트를 침해된 것으로 간주하라고 안내합니다. 연구자들은 로더 패턴을 ChainDrop/Shai-Hulud 계열과 연결하지만, GitHub 권고는 이 귀속을 확인하지 않습니다.[1], [2], [3], [4], [5]

💡 알기 쉬운 설명 (ELI5)

이 패키지를 설치하는 것은 전원을 연결하자마자 작동하는 기기를 꽂는 것과 같았습니다. 버튼을 누르거나 직접 사용할 필요가 없었습니다. 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]
악성코드 계열 귀속
StepSecurity와 Socket은 로더 패턴을 ChainDrop/Shai-Hulud와 연결합니다. GitHub 악성코드 권고는 캠페인 계열을 명시하지 않으므로 이 연결은 연구자들의 귀속으로 다뤄야 합니다.[4], [5], [1]

프레임워크 매핑

  • 이 가이드에서 설명하는 약점의 CWE 참조: CWE-506

사고 타임라인

2026년 10월 7일

유지관리자의 사고 대응에 따르면 저장소 관리자 계정이 main에 직접 commit을 푸시했습니다.[2], [3]

2026년 10월 8일

릴리스 워크플로가 악성 tensorlake@0.5.144를 배포했고, 유지관리자는 npm이 이후 이를 제거했다고 밝혔습니다.[1], [2]

2026년 10월 8일

유지관리자는 PR #1016을 병합하고 마지막 정상 commit으로 복구했으며 설치 스크립트 제어를 추가하고 정상 릴리스를 0.5.145로 올렸습니다.[3], [7]

단계별 공격 실행 흐름

단계 1

저장소 신뢰 경계 우회

사고 대응 PR은 관리자 계정이 일반적인 pull request 검토를 거치지 않고 main에 직접 commit했다고 보고합니다. 이후 같은 저장소에서 수동으로 릴리스를 시작했습니다.[2], [3]

단계 2

설치 중 패키지 코드 실행

연구자들은 tensorlake@0.5.144에 로더를 실행하는 preinstall 훅이 있음을 확인했습니다. 코드는 설치 프로세스의 권한을 상속했으며 SDK를 먼저 import할 필요가 없었습니다.[1], [4], [5], [6]

단계 3

호스트 자격 증명과 지속성이 위험에 노출

GitHub 악성코드 권고는 영향을 받은 호스트를 완전히 침해된 것으로 간주하라고 안내합니다. StepSecurity와 Socket은 자격 증명 탈취와 지속성을 보고했으며 토큰 폐기에 파괴적으로 반응할 수 있는 monitor도 언급했습니다. 이 세부 사항은 연구자 보고로 귀속하고 모든 기능이 모든 호스트에서 동작했다고 단정하지 마세요.[1], [4], [5]

단계 4

유지관리자가 배포 통제 복구

대응 과정에서 악성 commit을 revert하고 npm ci --ignore-scripts와 manifest tripwire를 추가했으며 저장소 및 배포 보호를 강화하고 0.5.145로 패키지를 대체했습니다. GHSA는 일반 취약 코드 범위가 아닌 악성코드를 추적하므로 수정 버전을 나열하지 않습니다.[3], [7]

소스 코드 비교: 취약한 구현 vs 보안 패치

이 CI 비교는 유지관리자가 병합한 PR #1016을 따르며 악성 패키지나 exploit은 포함하지 않습니다. tripwire는 설치 전에 실행되어 공개 manifest의 설치 훅을 거부하고, ignore-scripts는 npm ci가 의존성 라이프사이클 스크립트를 실행하지 못하게 합니다. 유지관리자는 이 설정으로 테스트와 SDK 빌드가 통과했다고 밝혔습니다. 훅이 필요한 패키지에는 영향이 있을 수 있으며 npm test처럼 명시적으로 실행한 명령은 해당 스크립트를 계속 실행합니다. 후속 빌드 단계를 격리하고 provenance를 소스 코드 검토로 간주하지 마세요. 이 코드는 일부만 보여줍니다. 유지관리자의 tripwire는 선언된 설치 훅을 확인하는 것 외에 typescript/lib/의 예상치 못한 파일도 거부합니다.[3], [6]

취약한 구현
steps:
  - run: npm ci
보안 강화 패치
steps:
  - run: node scripts/check-no-install-scripts.mjs
  - run: npm ci --ignore-scripts

엔지니어링 및 시스템 보안 강화 체크리스트

출처