
npm 패키지 저장소에서 'indexed-btree'라는 악성 패키지가 발견됐습니다. 이 패키지는 정상적인 오픈소스 라이브러리처럼 위장해 주간 200만 건 이상 다운로드됐습니다. 공격자는 설치 시점이 아닌 프로그램 실행 중에 악성 코드가 동작하도록 숨겨, npm이 올해 도입한 최신 보안 조치를 완전히 우회했습니다. 악성 코드는 감염된 시스템 정보를 수집해 Slack·Telegram으로 유출하고, 이더리움 스마트 계약을 통해 추가 명령을 받습니다. 해당 패키지 또는 연관된 9개 패키지를 설치한 개발자는 즉시 모든 비밀 키를 교체하고 개발 환경을 안전한 백업으로 복원해야 합니다.
Checkmarx 연구팀이 'indexed-btree' 외 9개 악성 npm 패키지로 구성된 공급망 공격 캠페인을 발견했다. 패키지들은 합법적인 라이브러리로 위장해 총 수백만 건 다운로드됐다.
감염된 개발 환경에서 시스템 정보(호스트명·CPU·메모리 등)가 외부로 유출되고, C2(명령·제어) 서버로부터 추가 악성 페이로드를 수신할 수 있다. 개발자 시크릿·API 키 탈취 가능성이 높다.
악성 코드를 설치 스크립트가 아닌 라이브러리의 핵심 함수(BTree.prototype.set) 내부에 숨겨, npm v12의 라이프사이클 스크립트 차단 및 정적 분석 도구를 모두 우회했다.
npm은 해당 10개 패키지를 모두 삭제했다. 영향받은 개발자는 모든 비밀 키·토큰을 교체하고 개발 환경을 안전한 백업 시점으로 복구해야 한다.
설치 시점 스캔만으로는 이런 런타임 악성 코드를 탐지할 수 없다. npm 패키지 도입 시 런타임 행위 분석을 병행하고, 의존성 패키지의 다운로드 수·커밋 이력이 부풀려진 것은 아닌지 확인해야 한다.
본문
'indexed-btree' 패키지와 관련된 현재 진행 중인 npm 악성코드 캠페인은, 위협 행위자들이 설치 스크립트가 아닌 패키지의 일반적인 런타임 동작 속에 악성 코드를 숨겨 공급망 방어를 우회하는 방법을 보여줍니다.
Checkmarx 연구팀이 발견한 이 패키지는 정상 라이브러리 'sorted-btree'를 사칭하며, 이미 주간 200만 건의 다운로드를 기록했습니다.
이 캠페인은 공격자들에게 상당한 수익을 안겼을 수 있습니다. Checkmarx에 따르면 공격자들은 109 ETH를 보유한 지갑을 사용하고 있으나, 해당 보고서는 그 자금이 암호화폐 탈취에서 비롯됐다고 단정 짓지는 않습니다.
최신 보안 조치 우회
2026년 6월, GitHub는 2025년 말부터 반복적으로 오픈소스 생태계를 뒤흔든 공급망 공격을 방지하기 위한 npm 보안 조치들을 발표했습니다.
핵심 보안 조치 중 하나는 명시적으로 승인되지 않는 한 'preinstall', 'install', 'postinstall' 같은 의존성 라이프사이클 스크립트를 차단하는 것입니다.
다른 조치들은 허가 없이 Git 저장소나 원격 URL에서 의존성을 자동으로 가져오는 것을 막습니다.
악성 indexed-btree 패키지는 설치 스크립트를 사용하는 대신, 애플리케이션이 특정 키 값으로 호출할 때 런타임에 실행되는 패키지의 BTree.prototype.set() 메서드 안에 로더를 숨겨 이러한 보호 조치를 회피합니다.
결과적으로 설치 과정은 깨끗하게 보이며, npm v12의 승인 메커니즘 중 어느 것도 작동하지 않습니다.
"악성코드 로더는 라이브러리 자체의 BTree.prototype.set 메서드 안에 숨겨져 있습니다. 이 메서드는 모든 사용자가 수시로 호출하는 핵심 함수입니다"라고 Checkmarx는 설명합니다.
"이것이 obfuscate(난독화)된 악성코드 1단계를 담은 sharedLoad.min.js를 트리거합니다. 이는 표준 오염 분석(taint-analysis) 도구와 대부분의 정적 스캐너를 교묘히 피해가는 잘 구성된 방법입니다."
악성 런타임 트리거
출처: Checkmarx
악성코드가 실행되면 아키텍처, 호스트명, CPU, 메모리, 업타임 등 시스템 세부 정보를 수집하고, 하드코딩된 Slack 및 Telegram 채널을 통해 해당 정보를 외부로 유출합니다.
또한 악성코드는 Sepolia 테스트 네트워크의 이더리움 스마트 계약을 폴링하여 C2(명령·제어) 정보를 가져옵니다. X25519 키 교환 방식을 사용해 AES 키를 도출하고, 계약에 저장된 2단계 페이로드를 복호화합니다.
공격자가 공격 종료를 선택할 경우, 악성코드는 자신의 파일을 삭제하고 패키지 코드에서 악성 트리거를 제거해 흔적을 지울 수 있습니다.
연구팀은 위협 행위자들이 프로젝트를 합법적으로 보이게 하기 위해 상당한 공을 들였다고 지적합니다. 여기에는 그럴듯한 GitHub 저장소 구축, 커밋 이력 채우기, 개발자 계정 정교하게 꾸미기 등이 포함됩니다.
조작된 커밋 이력
출처: Checkmarx
Checkmarx는 동일한 캠페인과 연관된 9개의 추가 npm 패키지도 발견했으며, 현재 이들은 npm에서 모두 삭제됐습니다. 해당 패키지들도 아래와 같이 상당한 다운로드 수를 기록했습니다:
- ordered-kv-index (다운로드 448,184건)
- btree-leaderboard (다운로드 493,685건)
- priority-slot-queue (다운로드 402,860건)
- btree-range-store (다운로드 468,092건)
- btree-core (다운로드 1,951,274건)
- btree-time-index (다운로드 425,312건)
- btree-lru-cache (다운로드 372,185건)
- neighbor-key-map (다운로드 366,019건)
- sliding-score-window (다운로드 448,024건)
개발자들은 설치 시점 스캔에만 의존하지 말고, 런타임 행위 분석도 함께 활용할 것을 권고받고 있습니다.
indexed-btree 또는 위에 나열된 패키지 중 하나라도 설치한 사용자는 모든 시크릿을 교체하고 안전한 백업에서 개발 환경을 복원해야 합니다.
관련 투런 솔루션
이 뉴스의 취약점·위협, 투런 솔루션으로 대응하세요.






