
StepSecurity 원문 분석과 npm 패키지 메타데이터에 따르면 2026년 7월 11일 공개된 jscrambler 8.14.0에 악성으로 의심되는 preinstall 훅과 네이티브 바이너리 컨테이너가 포함됐다. jscrambler는 Jscrambler Code Integrity API를 사용하는 공식 CLI 패키지로, JavaScript 난독화와 웹 애플리케이션 보호 워크플로에서 쓰인다.
이번 사안은 npm 설치 단계가 곧바로 공격 표면이 될 수 있음을 보여준다. StepSecurity는 jscrambler 8.14.0을 내려받아 직전 버전인 8.13.0과 비교했고, 새 preinstall 스크립트가 `dist/setup.js`를 실행하도록 추가됐다고 밝혔다. npm registry 메타데이터에서도 8.13.0에는 preinstall이 없지만, 8.14.0에는 `node dist/setup.js`가 preinstall로 등록된 사실이 확인된다.
패키지 크기 변화도 이례적이다. npm 메타데이터 기준 8.13.0의 unpacked size는 약 153KB였지만, 8.14.0은 약 7.99MB로 커졌다. StepSecurity는 8.14.0에 포함된 `dist/intro.js`가 실제 JavaScript 파일이 아니라 Linux, Windows, macOS용 gzip 압축 네이티브 실행 파일을 담은 컨테이너라고 분석했다.
StepSecurity 분석에 따르면 설치 시 로더는 운영체제에 맞는 실행 파일을 임시 디렉터리에 풀고, npm install 프로세스와 분리된 상태로 실행한다. 연구진은 정적 분석 결과 브라우저 자격증명 저장소, 쿠키, 로컬 스토리지, IndexedDB, 암호화폐 지갑 확장 프로그램 데이터와 관련된 흔적을 확인했다고 설명했다. 이에 따라 8.14.0을 설치한 사용자는 해당 호스트를 침해된 것으로 보고 자격증명 교체와 환경 점검을 해야 한다고 권고했다.
네트워크 지표도 공개됐다. StepSecurity는 Harden-Runner 관측에서 드롭된 바이너리가 Tor Project 관련 도메인과 두 개의 직접 IP 주소로 아웃바운드 연결을 시도했다고 밝혔다. 다만 네이티브 페이로드의 세부 동작과 명령제어 인프라 복구 분석은 계속 진행 중이라고 덧붙였다.
현재 npm registry 기준 latest는 8.22.0으로 표시된다. npm 메타데이터 확인 결과 8.22.0의 scripts에는 preinstall 항목이 보이지 않는다. 다만 7월 11일 8.14.0 이후 여러 버전이 짧은 시간 안에 연속 배포됐기 때문에, 실제 영향 범위와 각 버전의 안전성은 Jscrambler 또는 npm 측 공식 공지가 나올 때까지 추가 확인이 필요하다.
개발팀은 package-lock.json, pnpm-lock.yaml, yarn.lock과 CI 캐시에서 jscrambler 8.14.0 설치 흔적을 먼저 확인해야 한다. 해당 버전이 설치된 빌드 머신이나 개발자 장비에서는 브라우저에 로그인돼 있던 클라우드 계정, GitHub·npm 토큰, SSO 세션, 암호화폐 지갑 확장 프로그램을 우선 점검하는 것이 안전하다. 공급망 공격은 소스 코드 저장소뿐 아니라 패키지 설치 스크립트와 빌드 환경 권한을 함께 노리기 때문이다.
이번 사례는 보안 도구 공급망도 예외가 아니라는 점에서 파장이 크다. 특히 난독화와 코드 무결성 보호 도구는 배포 파이프라인 안에서 실행되는 경우가 많아, 설치 스크립트에 악성 바이너리가 들어가면 개발자 PC와 CI 환경 모두가 영향을 받을 수 있다. 조직은 npm 설치 스크립트 실행 정책, 새 버전 자동 업데이트 제한, 패키지 변경 감시, 빌드 환경의 네트워크 접근 통제를 함께 점검할 필요가 있다.
출처: StepSecurity https://www.stepsecurity.io/blog/jscrambler-npm-package-publishes-malicious-preinstall-binary
출처: npm jscrambler 8.14.0 https://www.npmjs.com/package/jscrambler/v/8.14.0
출처: npm registry https://registry.npmjs.org/jscrambler