오픈소스 인사이트
home
오픈소스 기술 동향
home

탈취된 TensorLake npm 릴리스, 설치만으로 자격 증명 노출 위험

이 글은 Sonatype 공식 블로그의 A Hijacked TensorLake npm Release Turned Installation Into Credential Risk을 에스코어가 공식 파트너로서 한국어로 번역한 콘텐츠입니다.

에스코어 인사이트

원문에 앞서 국내 개발·보안·플랫폼 조직이 함께 점검할 만한 사항을 간단히 정리했습니다.
•
설치 스크립트도 실행 코드로 관리: 패키지의 preinstall·postinstall 훅은 의존성 설치 단계에서 곧바로 실행될 수 있으므로, 애플리케이션 코드와 동일한 수준으로 행위 검증과 통제가 필요합니다.
•
개발자 자격 증명의 노출 범위를 최소화: 개발자 PC나 빌드 환경에 장기 수명·광범위 권한의 GitHub, Vault, 클라우드 토큰을 두면 단일 패키지 침해가 여러 저장소와 서비스로 이어질 수 있습니다. 최소 권한과 짧은 수명의 자격 증명 운영이 중요합니다.
•
패키지 제거 이후까지 사고 대응 범위를 확장: 악성 버전을 삭제하는 것만으로는 충분하지 않습니다. 설치 훅 실행 여부, 접근 가능한 자격 증명, 저장소 변경, 후속 페이로드와 지속성 여부까지 확인해야 합니다.

Sonatype 원문 번역

요약

•
TensorLake TypeScript SDK의 악성 릴리스 tensorlake@0.5.144는 설치 훅을 이용해 개발자 자격 증명을 찾고 원격 명령을 받아 실행했습니다.
•
Sonatype의 코드 검토 결과, GitHub 대체 경로는 공개 저장소를 생성하고 수집한 데이터를 커밋할 수 있었습니다. 특정 경로에서는 탈취한 GitHub 토큰까지 포함될 수 있었고, 악성 코드는 접근 가능한 저장소에 .claude와 .vscode 파일을 커밋해 수정할 수도 있었습니다.
•
로더는 여러 일반적인 CI 환경 표식이 존재하면 종료되므로, 페이로드에 별도의 GitHub Actions 관련 로직이 있다는 사실만으로 광범위한 CI 감염이 입증되는 것은 아닙니다.
•
Sonatype은 탈취한 데이터가 실제로 공개됐거나, 저장소가 수정됐거나, 후속 시스템이 영향을 받았다는 사실을 확인하지 못했습니다. 해당 버전을 설치한 조직은 설치 훅 실행 여부를 확인하고, 호스트와 접근 가능한 GitHub 저장소를 조사하며, 해당 프로세스가 접근할 수 있었던 자격 증명을 검토해야 합니다.

악성 설치 훅이 페이로드를 실행한다

영향을 받은 npm 릴리스에는 Bun을 이용해 난독화된 JavaScript 페이로드를 시작하는 preinstall 훅이 포함돼 있었습니다. Bun이 설치돼 있지 않으면 패키지가 Bun 1.3.13을 내려받을 수도 있습니다.
TensorLake TypeScript SDK는 샌드박스, 저장소, 클라우드 서비스와 연동하기 위한 도구입니다. 자격 증명 수집과 원격 명령 실행은 이 SDK의 정상 기능과 관련이 없습니다.
페이로드는 GitHub 토큰과 HashiCorp Vault 자격 증명을 포함한 로컬 시크릿을 찾고, 수집한 데이터를 원격 인프라로 전송합니다. 수집 대상에는 Claude, Cursor, Kiro MCP 설정, Codex 인증 정보, Gemini OAuth 자격 증명, Windsurf 인증 및 설정처럼 AI 개발 도구와 관련된 파일도 포함돼 있습니다.
또한 명령 채널을 주기적으로 확인해 운영자가 전달한 JavaScript를 실행합니다. Sonatype Research Labs는 코드에서 GitHub를 이용한 대체 경로도 확인했으며, 이 경로를 통해 수집 데이터를 공개할 수도 있었습니다.

GitHub 기반 대체 경로가 수집 데이터를 노출할 수 있다

Socket의 초기 분석에 따르면 GitHub는 명령·제어를 위한 대체 경로로 사용될 수 있습니다.
Sonatype Research Labs도 코드에서 같은 동작을 확인했고, 이 대체 경로에 또 다른 기능이 있다는 점을 발견했습니다. 해당 로직이 활성화되면 코드는 private: false로 설정한 공개 GitHub 저장소를 만들고 results/ 아래에 수집 데이터를 커밋할 수 있습니다.
GitHub 대체 경로에서 수집된 GitHub 토큰에 저장소 권한이 있고 Gists API 요청이 빈 목록을 반환하면, 코드는 업로드 데이터와 커밋 메시지에 해당 토큰을 포함합니다. 저장소 생성과 커밋이 모두 성공할 경우 토큰이 외부에 공개될 가능성이 있습니다.

토큰 접근 권한으로 저장소까지 수정할 수 있다

웜 형태의 악성코드는 한 개발 환경에서 발생한 침해를 다른 환경으로 확산시킬 수 있습니다. 자기 복제형 악성 코드가 개발자의 자격 증명을 확보하면 공통 플랫폼과 도구를 통해 다른 팀으로 접근 범위를 넓힐 수 있기 때문입니다.
이번 사건에서도 저장소 수정 로직이 존재한다는 점은 중요한 조사 대상입니다. 다만 Sonatype은 후속 확산이 실제로 발생했다고 확인하지는 못했습니다.
코드에는 실행 중인 환경과 연결된 저장소를 직접 수정하는 로직도 포함돼 있습니다. 조건에 맞는 브랜치에 .claude와 .vscode 설정 파일을 커밋할 수 있으며, 해당 파일이 도구에서 어떻게 읽히고 실행되는지에 따라 그 저장소를 사용하는 다른 개발자가 페이로드에 노출될 가능성도 있습니다.
원문에는 GitHub 저장소를 공개 상태로 만드는 설정을 포함한 관련 코드가 제시돼 있습니다.

설치 훅은 페이로드 실행 전에 CI 환경을 확인한다

패키지의 setup.mjs는 페이로드 실행 전에 여러 환경 변수를 확인합니다. CI가 정확히 true 또는 1이거나, GITHUB_ACTIONS 또는 GITLAB_CI가 true이거나, RUNNER_ENVIRONMENT가 github-hosted이면 실행을 종료합니다.
따라서 해당 표식이 존재하는 특정 환경에서는 설치 훅이 동작하지 않는다는 점은 확인할 수 있습니다. 다만 코드가 왜 이런 검사를 하는지, 또는 CI 시스템이 캠페인의 표적에서 제외됐는지는 이 동작만으로 판단할 수 없습니다.
한 가지 가능성은 공격자가 개발자 워크스테이션을 더 중요한 표적으로 봤다는 것입니다. 개발자 환경에는 자격 증명과 AI 도구 설정이 있고, 공격자가 지속성을 확보할 여지도 있기 때문입니다. 다만 공격자가 개발자 워크스테이션을 우선적으로 노렸다는 해석은 가능성에 불과하며, 코드의 동작만으로 공격자의 의도를 확정할 수는 없습니다.
페이로드에는 GitHub Actions와 저장소 수정 로직도 있습니다. 이 로직이 setup.mjs를 우회하는 별도 실행 경로를 제공했을 가능성도 있지만, Sonatype은 두 동작의 연결 관계를 확인하지 못했습니다. 다른 변종에서 물려받았거나 서로 일관되지 않은 코드일 가능성도 있습니다.
확실하게 확인된 사실은 로더가 특정 CI 표식을 검사한다는 점까지입니다. 광범위한 CI 감염은 확인되지 않았으며, 반대로 이 회피 동작만으로 CI가 캠페인의 표적이 아니었다고 단정할 수도 없습니다.

관련 샘플을 찾는 패키지 고유 단서

페이로드는 globalThis.WORMTAG 값을 "tensrlake"로 설정합니다. 연구자는 이 문자열을 이용해 관련 샘플이나 활동을 검색할 수 있습니다.
다만 이 문자열이 일치한다는 사실만으로 다른 사건이 동일한 공격과 관련됐다고 확정할 수는 없습니다.

영향을 받은 팀이 먼저 해야 할 일

tensorlake@0.5.144를 설치한 조직은 조사가 끝날 때까지 해당 환경에서 접근할 수 있었던 자격 증명이 노출됐을 가능성을 염두에 둬야 합니다. 먼저 manifest, lockfile, 패키지 캐시, 빌드 기록에서 해당 버전 사용 여부를 확인하고 preinstall 훅이 실제로 실행됐는지 판단해야 합니다. 실행됐다면 해당 호스트와 관련 개발·빌드 환경을 조사해야 합니다.
자격 증명을 교체하기 전에 보고된 토큰 모니터 구성요소가 존재하는지도 확인해야 합니다. 공개 분석에서는 이 모니터가 활성화된 상태에서 탈취된 GitHub 토큰을 폐기하면 파괴적 동작이 유발될 수 있다고 경고합니다. 해당 구성요소가 있다면 먼저 지속성 메커니즘을 제거하거나 비활성화한 뒤 토큰을 폐기하고, 프로세스가 접근할 수 있었던 자격 증명을 교체해야 합니다.
GitHub 감사 기록에서 예상하지 못한 접근, 저장소 생성, 여러 브랜치에 대한 커밋을 확인해야 합니다. .claude, .vscode, results/ 경로를 점검하고 관련 기간에 생성된 공개 저장소가 있는지도 확인해야 합니다. HashiCorp Vault 감사 로그에서도 비정상적인 자격 증명 접근을 검토해야 합니다. 조사가 끝난 뒤에는 신뢰할 수 있는 깨끗한 환경에서 다시 빌드하는 것이 좋습니다.
패키지를 삭제했다고 해서 이미 읽힌 자격 증명이 무효화되는 것은 아닙니다. npm에서 해당 릴리스를 제거해도 이미 설치된 사본은 그대로 남을 수 있으며, 페이로드가 실제로 실행됐는지도 별도로 확인해야 합니다.

동작을 조사하고 실제 영향을 확인해야 한다

TensorLake의 이번 릴리스는 패키지가 내세우는 기능뿐 아니라 설치 과정에서 실제로 어떤 동작을 하는지도 면밀히 살펴야 한다는 점을 확인시켜 줍니다. 확인된 코드에는 자격 증명 수집, 원격 명령 수신, 공개 GitHub 저장소를 통한 수집 데이터 게시, 탈취한 토큰으로 접근 가능한 저장소 수정 기능이 포함돼 있습니다.
이런 기능이 포함된 만큼 해당 릴리스의 보안 위험은 심각합니다. 다만 실제 데이터가 공개됐거나 후속 저장소가 침해됐다는 사실까지 입증된 것은 아닙니다.
tensorlake@0.5.144를 설치한 팀은 훅 실행 여부를 확인하고 관련 호스트와 GitHub 활동을 조사해야 합니다. 자격 증명 노출 가능성이 확인되면 조사 결과에 따라 필요한 조치를 취해야 합니다.
Sonatype Research Labs는 TensorLake 침해를 계속 조사하고 있으며, 추가 구성요소와 침해 지표, 실제 영향이 확인되는 대로 sonatype-2026-009038을 업데이트할 예정입니다.
에스코어는 Sonatype 공식 파트너로서 소프트웨어 공급망 보안 및 오픈소스 거버넌스 구축을 지원합니다. 도입이나 구축이 필요하시면 언제든 문의해 주세요. 지원 솔루션: Nexus Repository · Repository Firewall · Lifecycle · Sonatype Guide