요약
내용: 악의적인 [email protected] 2026년 10월 8일 UTC 기준 01:12에 npm에 등록되었습니다. 이번에는 타이포스쿼트가 아닙니다. 유효한 Sigstore 출처 정보를 갖춘, 프로젝트 자체 워크플로우를 통해 빌드된 진짜 Tensorlake TypeScript SDK입니다. A preinstall hook은 Bun을 사용하여 856 KB 크기의 난독화된 ChainDrop/Shai-Hulud 페이로드를 실행합니다.
영향: Socket은 주간 다운로드 수가 약 12,000건에 달하며, Aikido는 누적 설치 건수가 100,000건을 넘습니다. 훅이 실행된 곳에서는 인증 정보, 브라우저 비밀번호, AI 도구 설정 정보를 탈취합니다. 탈취된 GitHub 토큰이 어떤 조직에도 소속되지 않은 계정의 것일 경우, 해당 토큰이 취소될 때 홈 디렉터리를 삭제하려고 시도하는 모니터링 프로그램을 심기도 합니다.
상태: Socket은 11분 만에 이를 신고했고, 해커 뉴스 보도에 따르면 npm이 이를 삭제했다고 합니다. Tensorlake는 해당 커밋을 롤백했습니다. 풀 리퀘스트 #1016. 이 글을 쓰는 시점에서 0.5.145 버전은 아직 출시되지 않았으며, 여섯 tensorlake-native-* 0.5.144 버전의 패키지가 여전히 활성화되어 있었습니다. 설치하셨나요? 먼저 백업하고, 모니터를 제거한 다음 회전하세요.
자세한 내용
여러분도 영향을 받고 계신가요?
두 가지 질문이 중요합니다. 0.5.144가 여러분이 중요하게 생각하는 곳에서 해결되었는지, 그리고 그곳에서 해당 설치 후크가 실행되었는지 여부입니다.
첫 번째는 설치 방법에 달려 있습니다. tensorlake 아직 0.x 계열에 있으므로, 다음과 같은 범위, 예를 들어 ^0.5.140 나중에 출시되는 0.5 패치라면 무엇이든 기꺼이 받아들입니다. 기존 락파일을 사용하여 설치하는 프로젝트는 npm ci 그 자리에 머물렀다. 위험은 결함이 있는 버전이 가동 중인 상태에서 새 버전을 적용하는 과정에서 발생했는데, npm update, 그날 아침 병합된 Dependabot 또는 Renovate PR, 첫 설치, 또는 다음을 복사하는 Dockerfile package.json lockfile 없이. 10월 7일부터 Tensorlake의 롤백이 이루어지기 전까지 리포지토리의 메인 브랜치를 가져와 다음 명령어를 실행한 사람은 누구나 npm install 에서 typescript/ 후크도 실행했는데, 레지스트리는 전혀 관련이 없었습니다.
두 번째 질문과 관련해, SDK를 별도로 가져올 필요는 없었습니다. 라이프사이클 스크립트가 활성화된 상태에서 설치하기만 하면 충분했으며, 1분 후에 빌드가 실패한 경우에도 마찬가지였습니다. ignore-scripts=true 에서 .npmrc, 훅이 실행되지 않았습니다. npm 12와 pnpm 10 이상 버전은 사용자가 승인할 때까지 종속성 스크립트를 보류하며(npm 11은 경고만 표시함), Bun은 신뢰 목록에 포함된 패키지에 대해서만 해당 스크립트를 실행합니다. 다만, 이를 전제로 삼기 전에 구성 설정을 먼저 확인하시기 바랍니다. StepSecurity 로더가 CI를 감지하면 종료된다는 사실을 확인했는데, 이로 인해 개발자의 노트북이 가장 먼저 공격 대상이 됩니다. Socket이 페이로드에서 CI 인증 정보 수집 기능을 여전히 발견했기 때문에, 이는 CI 위험을 완전히 배제하지는 않으면서도 위험을 낮추는 효과가 있습니다.
그리고 rg 이 단계는 대략적인 분류 단계이므로, 어떤 경우든 0.5.144 ~에서 tensorlake 줄을 리드로 사용합니다. 이 방법은 .gitignored 파일과 바이너리 파일을 건너뛰므로, 오래된 바이너리 파일은 bun.lockb 표시되지 않습니다:
npm ls tensorlake --all
npm ls --all | grep tensorlake-native
pnpm why tensorlake
yarn why tensorlake
rg -n 'tensorlake' -g '*lock*' -g 'npm-shrinkwrap.json' .
그런 다음 디스크와 사용자 프로필을 확인하십시오:
find "$HOME" -path '*/node_modules/tensorlake/lib/Math_Symbol.js' 2>/dev/null
ls -la ~/.config/gh-token-monitor ~/.local/bin/gh-token-monitor.sh 2>/dev/null
확대하기 find 캐시와 러너를 구축하거나, 관리 대상 플릿에서 EDR을 사용하려면. 다음 사항을 확인하십시오. Math_Symbol.js ‘Mitigation’의 해시 태그가 적용되었습니다. A gh-token-monitor 디렉터리가 있으면 트랩이 활성화된 것이므로, 바로 ‘완화’ 단계로 넘어가십시오. 디렉터리가 없는 경우 호스트가 정상으로 판정되지 않습니다. 모니터는 일부 계정에 대해서만 트랩을 활성화하기 때문입니다.
텐서레이크 공격이란 무엇인가
Tensorlake는 신뢰할 수 없는, 모델이 생성한 코드를 격리된 샌드박스 내에서 실행하며, npm SDK는 TypeScript 앱이 이를 구동하는 수단입니다. 팀은 에이전트가 작성한 모든 코드를 격리한 다음, 모든 리소스에 접근할 수 있는 노트북에 SDK를 설치합니다. 샌드박스는 단 한 번도 실패한 적이 없습니다. 악성코드는 샌드박스가 개입되기 전에 설치된 컴퓨터에서 이미 실행되고 있었습니다.
공격자는 소스 저장소를 통해 침입했습니다. StepSecurity에 따르면, 첫 번째 악성 커밋은, e90c47b, 10월 7일 01:20 UTC에 메인 랜딩 구역에 착륙했으며, 그 뒤를 이어 7대가 더 도착해 페이로드를 조정하고 preinstall 라인. 이 중 어느 것도 풀 리퀘스트 절차를 거치지 않았습니다. Tensorlake 측의 공식 설명에 따르면, 이 커밋들은 GitHub 웹 UI를 통해 리포지토리 관리자 계정에서 이루어진 것으로, 이것이 바로 Aikido가 해당 커밋들이 ‘검증됨’으로 표시된 것을 확인한 이유입니다. GitHub는 웹 UI를 통한 커밋에 대해 자체적으로 서명하기 때문에, 해당 배지는 단순히 로그인된 계정 정보만을 표시했을 뿐입니다. 해당 계정이 어떻게 해킹당했는지에 대해서는 아직 공개된 바가 없습니다.
약 하루 뒤, 같은 계정이 해당 리포지토리의 publish_npm.yaml 워크플로우. 0.5.144 버전을 빌드, 서명 및 배포했습니다. Socket의 스캐너가 UTC 기준 01:23:10에 이를 탐지했으며, StepSecurity는 이를 유지보수 담당자에게 보고했습니다. GitHub 이슈 #1014. 파일 이름은 8월의 ChainDrop 웨이브와 일치합니다. keyv, 그리고 합기도는 한 WORMTAG 재감염의 잔여 증상이 아니라 새로운 감염을 시사하는 징후.
인질 토큰의 작동 원리
페이로드가 조직 멤버십이 없는 계정에서 GitHub 토큰을 가져오면, 다음과 같은 서비스를 설치합니다. gh-token-monitor, 에 따르면 SafeDep의 디코딩. 트랩이 없더라도 특정 조직에 속한 계정의 토큰은 똑같이 도난당합니다. 이는 리눅스에서는 systemd 사용자 유닛, macOS에서는 LaunchAgent, 윈도우에서는 로그온 예약 작업에 해당합니다. 이 작업은 최대 24시간 동안 60초마다 api.github.com/user 도난당한 토큰을 사용하여. StepSecurity에 따르면, GitHub가 토큰을 거부하면 다음이 실행됩니다. rm -rf ~/ 리눅스와 macOS에서는 사용자 프로필을 삭제하거나, 윈도우에서는 PowerShell을 통해 사용자 프로필을 삭제합니다. 이 코드에는 심지어 다음과 같은 문자열이 포함되어 있습니다. IfYouRevokeThisTokenItWillWipeTheComputerOfTheOwner, 그리고 GMO 플랫 시큐리티 감염된 호스트에서 파일이 삭제되는 현상이 관찰되었다고 보고하고 있다.
거의 모든 자격 증명 도용 대응 매뉴얼을 살펴보면, 첫 번째 단계는 토큰을 취소하는 것입니다. 이 모니터가 여전히 실행 중인 호스트에서는, 취소 조치가 개발자, 관리자 또는 자동화된 플레이북 중 누구에 의해 이루어지든 간에 해당 단계로 인해 개발자의 홈 디렉터리가 함께 삭제될 수 있습니다. 자동화 시스템을 통해 표시된 호스트에 연결된 토큰을 취소할 경우, 모니터가 완전히 제거될 때까지 해당 호스트에 대해서는 토큰 취소를 보류해야 합니다.
네트워크 케이블을 뽑는다고 해서 문제가 반드시 해결되는 것은 아닙니다. 모니터가 연결 오류 상황을 어떻게 처리하는지에 대해 공개된 정보가 없기 때문입니다. 중요한 데이터를 백업하고, 사고 대응 팀에 상황을 알린 뒤 신속하게 대응하십시오. 공격자는 그 동안 해당 토큰을 계속 사용할 수 있기 때문입니다.
페이로드 내부
로더는 CI를 확인하고, CI가 발견되면 종료한 뒤 Bun을 다운로드한 다음, 다음 단계로 넘겨줍니다. Math_Symbol.js, 따라서 실제 작업은 다음과 같은 과정이 아닌 곳에서 이루어집니다. node.
이 코드는 신뢰할 수 있는 게시 기능에서 사용되는 OIDC 교환을 포함한 npm 토큰을 노리며, AWS 인스턴스 메타데이터, Secrets Manager 및 SSM Parameter Store에서 데이터를 추출하는데, GMO Flatt Security는 이 코드가 모든 리전에서 해당 데이터를 읽는 것을 확인했습니다. 또한 로컬 Vault를 탐색하여 127.0.0.1:8200 그리고 쿠버네티스 토큰, SSH 키 등을 수집하고, .env 파일, Docker 구성 파일, 암호화 지갑 등입니다. Aikido는 이 악성코드가 저장된 비밀번호와 쿠키를 담기 위해 ‘HackBrowserData’ 파일을 생성하는 것을 발견했습니다. 또한 Claude, Cursor, Kiro, Windsurf, Zed의 구성 파일과 MCP 파일을 표적으로 삼는데, 이러한 파일에는 API 키가 종종 일반 텍스트로 저장되어 있습니다.
도난당한 데이터는 암호화된 상태로 다음으로 전송됩니다. iseekaigogo.com, 페이로드에 하드코딩된 C2 도메인, 또는 피해자 본인의 GitHub 계정에 “Shai-Hulud: Here We Go Again”이라는 이름으로 생성된 새로운 공개 저장소로 연결됩니다. 대체 수단으로, Aikido는 이 악성코드가 공격자가 제어하는 이더리움 계약을 다음 주소에서 읽어오는 것을 발견했습니다. 0xb614155Fd88114d40549b259457Bcf921Df091B9 다른 도메인을 위해. 지갑에서 9월 21일에 이루어진 마지막 업데이트 0x779f83aE56309682beDb04816c19d358c4B21040, 같은 도메인을 가리킵니다. 사이트를 차단하는 것도 도움이 되지만, 단 한 번의 거래만으로도 해당 도메인이 다른 곳으로 리디렉션될 수 있습니다.
그런 다음 확산됩니다. npm 토큰을 이용해 피해자의 패키지에 스스로를 삽입하고, 버전을 올린 뒤 Sigstore 출처 정보를 생성하여 다시 게시합니다. GitHub 토큰을 이용하면 커밋을 수행합니다. .claude/settings.json 그리고 .vscode/tasks.json 작성자를 사용하여, 해당 리포지토리에 접근할 수 있는 리포지토리로 [email protected] 그리고 “chore: update dependencies”라는 메시지가 표시됩니다. Claude Code 후크는 쉘 명령을 실행할 수 있고, VS Code 작업은 폴더를 열 때 실행될 수 있으므로, 해당 파일들은 설정 방식과 다음 개발자의 신뢰 설정에 따라 다시 접근할 수 있는 방법이 될 수 있습니다.
입소 시 어떤 점이 바뀌어야 할까
0.5.144 버전의 출처 정보는 사실입니다. 이 패키지 출처가 tensorlakeai/tensorlake 프로젝트 고유의 워크플로를 통해 이루어지는데, 이것이 바로 출처 정보가 주장하는 전부입니다. 관리자 계정이 메인 브랜치에 직접 커밋하면, 실제 파이프라인이 악성코드를 빌드하고 서명합니다. 출처 정보를 확인하되 인증된 코드는 절대 검토하지 않는 정책이라면, 이 릴리스를 허용했을 것입니다.
Lockfiles는 관성 덕분에 겨우 도움이 되었을 뿐이며, CVE 스캐너에서는 일치하는 항목을 찾을 수 없었습니다. 한편, 0.5.143에서 0.5.144로 변경된 내용은 눈에 띄지 않을 수 없었는데, 새로운 preinstall 스크립트, 새로운 로더, 그리고 856KB 크기의 난독화된 파일이 패치 릴리스에 포함되었습니다. 패치 버전 증가를 확인하기 위해 타르볼 diff를 확인하는 팀은 거의 없지만, 최신 npm lockfile에서는 패키지의 hasInstallScript 이 종목은 주목할 만한 저가주입니다.
시간도 도움이 됩니다. Socket이 11분 만에 이 문제를 발견했으니, 24시간 릴리스 기간 제한(npm의 min-release-age, 또는 pnpm의 minimumReleaseAge(pnpm 11부터는 기본값이 24시간으로 설정됨)을 적용했다면 대부분의 빌드에서 해당 문제가 발생하지 않았을 것입니다. PR #1016에 명시된 Tensorlake의 대응 방안 역시 훌륭한 모범 사례로, 메인 브랜치에서 관리자 우회 기능을 제거하고, 서명된 커밋을 의무화하며, npm 게시 시 두 번째 검토자를 지정하고, 게시된 매니페스트에 설치 스크립트가 선언된 경우 CI 트리플와이어가 실패하도록 했습니다. 사용자 입장에서는 설치 스크립트를 추가하거나 변경하는 의존성 업데이트는 보류해야 합니다. 설치 스크립트가 없는 패키지는 import 시에도 코드를 실행할 수 있지만, 새로운 스크립트가 추가된 경우에는 업데이트를 중단할 가치가 있습니다.
완화
평소보다 순서가 더욱 중요합니다. 해당 후크를 실행한 모든 호스트를 침해된 것으로 간주하고, 사고 대응 절차를 차근차근 진행하십시오.
가장 중요한 데이터를 먼저 보존하십시오. 토큰, 서비스 또는 네트워크를 건드리기 전에, 툴링이 아닌 커밋되지 않은 작업 내용과 기타 대체 불가능한 데이터를 외부 저장 장치에 복사하십시오. 증거로 사용할 수 있도록 잠금 파일과 설치 로그를 보관하십시오.
아티팩트를 확인하십시오. 10월 7일 또는 8일에 생성된 워크스테이션, 빌드 호스트 및 이미지를 공개된 SHA-256 값과 대조하여 확인하십시오. lib/setup.mjs 는 25a0735d0db7dc40e5d45ce42d9c106067e6a66e184d967cfecfab17c3bcb5ef 그리고 lib/Math_Symbol.js 는 b50a00900399ba99fb6ce1fc151519cb99d44320ef2a631f2237e1aea0ad6fec. GMO Flatt Security는 다음과 같이 명명한 파일을 나열하고 있습니다. artifact.tar.gz ~처럼 33108f494dad71369a9aa7cd6daa5402335d1a718b78320b9b687c0b2174fa67, 그리고 SafeDep에 저장된 게시 로그에 따르면 npm 타르볼의 SHA-1 값은 다음과 같습니다. 843a898ab72793568d77c53ff9282e6ce7c66aea. 해시는 일치 여부를 확인해 주지만, 수정된 사본은 탐지하지 못합니다.
무언가를 취소하기 전에 모니터의 무장 해제부터 하십시오. 다음에 있는 파일: ~/.config/gh-token-monitor/ 감시 대상 토큰을 보관하고 있습니다. 이를 민감한 증거로 간주하고, 티켓이나 채팅에는 절대 포함하지 마십시오. StepSecurity는 아래의 Linux 및 macOS 명령어를 공개했으며, daemon-reload 여기에 추가되었습니다. 실행하기 전에 실제 시스템에서 이름과 경로를 확인하십시오:
# Linux
systemctl --user disable --now gh-token-monitor.service
rm -rf ~/.config/gh-token-monitor
rm -f ~/.local/bin/gh-token-monitor.sh
rm -f ~/.config/systemd/user/gh-token-monitor.service
systemctl --user daemon-reload
# macOS
plist=~/Library/LaunchAgents/com.user.gh-token-monitor.plist
launchctl bootout gui/(id-u)"plist"
rm -rf ~/.config/gh-token-monitor
rm -f ~/.local/bin/gh-token-monitor.sh
rm -f "$plist"
Windows에서 이 읽기 전용 PowerShell은 실행되는 예약된 작업을 나열합니다. monitor.ps1, 따라서 엔드포인트 관리 도구를 통해 이를 제거할 수 있습니다:
Get-ScheduledTask | Where-Object {
"(_.Actions.Execute) (_.Actions.Arguments)" -match 'monitor\.ps1'
}
다음 단계로 넘어가기 전에 파일이 완전히 삭제되었는지 확인하세요. 삭제 node_modules 손대지 않을 것이며, 이 모니터를 제거한다고 해서 다른 잔류물이 없다는 증거가 되는 것은 아닙니다.
청소된 기계에서 회전시키십시오. 감시 중인 GitHub 토큰을 취소하면, 해당 계정이 접근할 수 있었던 모든 항목(npm, 클라우드, SSH, Kubernetes, Vault 및 레지스트리 자격 증명 등)이, .env 비밀 정보, AI 도구 및 MCP API 키. 브라우저 비밀번호와 세션은 유출된 것으로 간주하고, 이 기회에 활성 세션도 모두 종료하십시오.
저장소를 정리하고 게시할 내용을 확인하세요. 다음의 커밋을 찾아보세요: [email protected] “chore: update dependencies”와 함께, stray .claude/settings.json 또는 .vscode/tasks.json 파일, 익숙하지 않은 워크플로우, 그리고 “Shai-Hulud: Here We Go Again”이라는 설명이 달린 새로운 공개 저장소들. 유지보수자의 npm 토큰이 유출된 경우, 팀원 중 누구도 배포하지 않은 릴리스가 있는지 확인해 보세요.
출구를 차단하고 점검하십시오. 차단 iseekaigogo.com 도메인별. 플랫 목록 172.67.207.33 그리고 104.21.22.217 주소로 사용되지만, 이는 공유되는 Cloudflare IP이므로 방화벽 규칙이 아닌 로그 검색 시에만 사용하십시오.
확신이 서지 않을 때는 고정하고, 적용하고, 이미지를 다시 생성하세요. 보류 tensorlake 0.5.143 버전으로, Tensorlake가 0.5.145 버전을 공개하고 확인할 때까지 네이티브 패키지도 0.5.143 버전으로 고정됩니다. 유지 tensorlake-native-* 0.5.144 버전을 제거하십시오. 깨끗한 호스트에 다시 설치하고, 잠금 파일을 커밋한 다음 다음을 사용하십시오. npm ci CI 환경에서. 모든 지속성 지점을 파악할 수 없다면, 정상 작동이 확인된 이미지에서 머신을 다시 구축하십시오.
탐지
프로세스 체인이 가장 확실한 지표입니다. 다음을 확인하세요. npm 또는 node 산란 node lib/setup.mjs, 그러면 해당 파일이 다운로드되어 실행됩니다 bun. 이전에 해당 패키지가 설치된 적이 없는 시스템에서 패키지 설치 과정에서 ‘Bun’이 나타나는 것 자체만으로도 의심스럽고, 다음 내용을 읽어들이는 설치 하위 항목들도 마찬가지로 의심스럽습니다. .npmrc, .aws, .kube, SSH 키 또는 브라우저 프로필.
지속성을 위해, Node 또는 Bun 프로세스 하에서 생성된 systemd 사용자 유닛, LaunchAgents 또는 ONLOGON 작업에 대해 알림을 설정하십시오. 브라우저가 아닌 프로세스가 폴링하는 경우 api.github.com/user 1분에 한 번 정도가 얻을 수 있는 가장 구체적인 특징입니다.
JavaScript용 SecureChain이 결과를 어떻게 바꾸는가
SecureChain for JavaScript는 패키지가 노트북에 도달하기 전, 상류 단계에서 신뢰 여부를 판단합니다. 이 솔루션은 강화되고 격리된 환경에서 소스 코드를 기반으로 패키지를 재컴파일하고, 알려진 악성코드, 의심스러운 코드 패턴, 공급망 위험 요소를 검사하여 검사에 통과하지 못한 모든 항목을 차단합니다. 재컴파일만으로는 이 문제를 해결할 수 없었을 것입니다. 왜냐하면 악성 코드가 상류 소스 코드에 이미 존재하고 있었기 때문입니다. 이러한 문제를 포착하는 것은 바로 이 검사 과정이며, 갑자기 추가된 패치 릴리스가 preinstall 후크를 통해 두 번째 런타임을 다운로드하고, 856KB 크기의 난독화된 자바스크립트를 실행하는 행위는 바로 이 시스템이 막기 위해 설계된 바로 그 유형의 변경 사항입니다.
JavaScript용 SecureChain 알아보기 →
이 제품은 JFrog Artifactory, Sonatype Nexus 및 GitHub Packages와 호환되는 즉시 사용 가능한 리포지토리 대체 솔루션이므로, npm 명령어는 그대로 유지되며, SLSA 레벨 3 출처 정보, SBOM 및 VEX 출력 결과를 제공합니다. JavaScript, Python, Java, Go, Rust 및 PHP를 지원합니다. 또한 이와 같은 사고로 인해 팀이 해당 종료를 지난 후까지 의존성을 동결해야 하는 상황에서도, TuxCare의 ‘Endless Lifecycle Support’를 통해 해당 버전을 계속 사용하는 한 보안 수정 사항을 지속적으로 제공받을 수 있습니다. 강제 업그레이드나 코드 재작성이 필요하지 않습니다.
이것이 단순한 하나의 패키지보다 더 중요한 이유
5월에는 TanStack을 통해 유효한 SLSA 출처 정보를 포함하는 Mini Shai-Hulud 공격이 발생했고, 6월에는 Mastra의 타이포스쿼트가 발생했습니다. 8월에는 ChainDrop을 통해 keyv 그리고 crates.io의 배열 참조(arrayref) 취약점. 이제 동일한 웜 계열이 AI 에이전트 인프라까지 침투했습니다. 반복적으로 나타나는 문제는 방어 측이 인증된 게시자나 유효한 검증 결과를 코드가 안전하다는 증거로 간주한다는 점입니다. 이번 사례에서 패키지 이름과 출처는 모두 실제였습니다. 다만 그들은 중요한 질문과는 다른 질문에 답했을 뿐입니다.
JavaScript용 SecureChain 알아보기 →
자주 묻는 질문
어떤 TensorLake 버전이 안전한가요?
0.5.143은 마지막 정상 릴리스이며, 당시에는 여전히 npm의 latest 이 글을 작성하는 시점 기준입니다. Tensorlake에서 0.5.145 버전을 공개하면 해당 버전으로 업데이트하고, 계속 tensorlake-native-* 0.5.144에서 제외.
도난당한 GitHub 토큰을 즉시 취소해도 안전한가요?
모니터가 아직 실행 중일 가능성이 있다면 그렇지 않습니다. 다음 조건이 충족되는 호스트에서는 gh-token-monitor 활성 상태인 경우, 토큰을 취소하면 홈 디렉터리나 사용자 프로필이 삭제될 수 있습니다. 데이터를 먼저 백업한 뒤 모니터를 제거하고, 토큰을 취소 및 교체하십시오. 이 모든 과정을 신속하게 진행해야 합니다.