SK쉴더스 로고
ADT캡스캡스홈
SK쉴더스

jscrambler npm 계정 탈취로 IronWorm 정보탈취 악성코드 유포

EQST Now | 2026.07.16

NOW Briefing

Brief 1 자바스크립트 코드 보호 상용 솔루션 jscrambler의 npm 배포 계정이 탈취돼, 2026년 7월 11일 악성 버전 5개가 npm 레지스트리에 올라갔습니다. 설치만 해도 preinstall 훅으로 네이티브 정보 탈취형 악성코드가 실행됩니다.
Brief 2 탈취 대상은 클라우드·CI 토큰, 암호화폐 지갑, Claude·Cursor 같은 AI 개발도구 설정까지 광범위합니다. 감염된 머신의 npm 토큰으로 다른 인기 패키지까지 자체 감염시키는 웜 기능도 확인됐습니다.
Brief 3 영향 버전을 제거하고 8.22.0 이상으로 업데이트해야 합니다. 해당 환경에서 접근 가능했던 모든 자격증명은 이미 유출된 것으로 간주하고 폐기·재발급해야 합니다.

jscrambler npm 계정 탈취로 IronWorm 정보탈취 악성코드 유포

■ 개요

jscrambler는 자바스크립트 코드를 난독화해 역분석을 막는 상용 코드 보호 솔루션입니다. 국내 금융·게임 앱 보호에도 실제 도입됐으며, 개발·빌드 과정에서 사용하는 CLI가 npm 패키지로도 배포됩니다. 주간 다운로드는 약 1만 5,800건 규모입니다. 이번 사건은 이 패키지의 npm 배포 계정이 탈취돼 벌어진 공급망 공격(신뢰된 배포 경로를 오염시켜 정상 사용자에게 악성코드를 전달하는 공격)입니다.

공격자는 정상 배포 자격을 손에 넣은 뒤 약 3시간에 걸쳐 8.14.0, 8.16.0, 8.17.0, 8.18.0, 8.20.0을 연달아 올렸습니다. 설치 과정에서 preinstall 훅(패키지 설치 시 자동 실행되는 스크립트)이 크로스플랫폼 정보 탈취형 악성코드를 내려받아 실행하므로, 패키지를 설치하는 것만으로 감염됩니다.

JFrog는 이 페이로드를 Rust 기반 악성코드 IronWorm으로 식별했습니다. 한 달 전 자사가 문서화한 악성코드로, Shai-Hulud 계열에 속합니다. 악성 버전은 배포 약 6분 만에 탐지돼 내려갔지만, 그사이 설치된 개발자·CI 환경의 자격증명은 이미 노출된 것으로 봐야 합니다. 특히 npm 생태계를 널리 쓰는 국내 개발·CI 파이프라인은 우선 점검 대상입니다.

■ 요약

항목 내용
캠페인·기법명 IronWorm(Shai-Hulud 계열 Rust 정보 탈취형 악성코드), npm 배포 계정 탈취 공급망 침해
위협 수준 높음 — 설치 즉시 자격증명 탈취·자가전파(공식 CVSS 없음)
공격 유형 정식 패키지 배포 계정 탈취 후 악성 버전 배포, preinstall 드롭퍼
영향/위험 • 클라우드·CI 자격증명 및 AI 개발도구 API 키 탈취
• 암호화폐 지갑·비밀번호 관리자·브라우저 세션 탈취
• npm 토큰 악용 자가전파로 2차 패키지 오염
영향 패키지·버전 • jscrambler 8.14.0
• 8.16.0
• 8.17.0
• 8.18.0
• 8.20.0
관측 기간·대응 • 2026-07-11 배포, 약 6분 만에 탐지
• 8.22.0 이상 안전(또는 8.13.0으로 고정)

■ 침해 경로와 페이로드

이 공급망 공격에서 악성 버전은 dist/ 아래에 두 파일을 추가했습니다. 하나는 작은 로더 setup.js이고, 다른 하나는 약 7.8MB 크기의 intro.js입니다. 이름과 달리 intro.js는 스크립트가 아니라 여러 OS용 바이너리를 하나로 묶은 자체 포맷(CSI 컨테이너)입니다. 내부에는 Linux·Windows·macOS용 네이티브 바이너리 3종이 gzip으로 압축돼 들어 있습니다.

setup.js는 실행 환경의 OS를 확인해 맞는 바이너리를 고르고, 시스템 임시 디렉터리에 무작위 이름의 숨김 파일로 기록한 뒤 출력을 숨긴 채 백그라운드로 실행합니다. 초기 버전(8.14.0~8.17.0)은 preinstall 훅으로 이 로더를 불렀습니다. 반면 이후 버전(8.18.0, 8.20.0)은 드롭퍼(악성 실행 파일을 심어 실행시키는 코드)를 패키지 본체 코드와 CLI에 직접 심어, 패키지를 불러오거나 실행할 때 동작하게 만들었습니다.

CSI 컨테이너는 매직바이트 1B 43 53 49 01 03 00으로 시작합니다. 또한 악성코드는 약 2,400개의 민감 문자열을 각각 ChaCha20-Poly1305로 암호화해 정적 분석을 어렵게 만들었습니다. 아래는 공개 분석에서 확인된 악성 산출물의 구조입니다.

{
  "name": "jscrambler",
  "version": "8.14.0",
  "scripts": {
    "preinstall": "node dist/setup.js"
  }
}
// [악성 주입] dist/setup.js = 로더, dist/intro.js = CSI 컨테이너(약 7.8MB)
//   CSI 매직바이트: 1B 43 53 49 01 03 00
//   내부: Linux/Windows/macOS 네이티브 바이너리 3종(gzip 압축)
// 8.18.0+ : 드롭퍼를 dist/index.js·CLI 본체에 이식 → --ignore-scripts 우회

⚠️ WARN

npm install --ignore-scripts는 8.18.0 이후 버전에는 통하지 않습니다.
드롭퍼가 preinstall 훅이 아니라 패키지 본체 코드로 옮겨졌기 때문입니다.
설치 스크립트 차단만으로는 안전하지 않습니다.

■ 자가전파와 탈취 대상

IronWorm은 감염된 머신에서 npm 토큰(패키지 배포 권한을 담은 인증 토큰)을 환경 변수와 .npmrc 같은 파일에서 수집합니다. 이후 토큰 유효성을 확인하고 다운로드 수가 많은 패키지를 골라, 악성 preinstall 스크립트를 심어 레지스트리에 직접 재배포합니다. npm 클라이언트를 거치지 않고 원시 HTTP 요청으로 곧장 올려 표준 게시 방어를 우회하는 방식입니다. 이 자가전파 기능이 피해를 단일 패키지 너머로 확산시킵니다.

이렇게 확보한 전파 경로와 별개로, 탈취 대상은 광범위합니다. AWS·GCP·Azure의 메타데이터 엔드포인트와 비밀 관리 서비스, CI/CD(빌드·배포 자동화 파이프라인) 토큰이 핵심 표적입니다. 여기에 MetaMask·Phantom·Exodus 등 암호화폐 지갑, 1Password·Bitwarden 등 비밀번호 관리자, 브라우저 세션까지 포함됩니다. Claude Desktop·Cursor·Windsurf 같은 AI 개발도구의 API 키와 MCP(모델 컨텍스트 프로토콜, AI 도구를 외부 데이터·기능에 연결하는 규격) 자격증명도 노립니다.

수집한 데이터는 자체 Tor 클라이언트로 C2 서버(명령·제어 서버)와 통신하면서 유출합니다. 다만 대량 반출 단계에서는 Tor를 우회해 파일 공유 서비스 temp.sh로 TLS 전송한 것으로 확인됐습니다. 이 과정에서 피해자의 실제 IP가 노출되는 운영 보안 결함도 관측됐습니다. 방어자 입장에서는 이 비정상 아웃바운드가 탐지 단서가 됩니다.

■ 탐지 및 점검

• 우선 lockfile(의존성 버전을 고정한 파일)과 npm ls jscrambler로 8.14.0·8.16.0·8.17.0·8.18.0·8.20.0 설치 이력이 있는지 확인합니다.

node_modules/jscrambler/dist/setup.js·intro.js가 있는지, 공개된 SHA-256 해시와 일치하는지 대조합니다.

• 시스템 임시 디렉터리의 숨김 실행 파일과 출력이 숨겨진 백그라운드 프로세스를 점검합니다.

• 재부팅 후에도 실행을 유지하는 지속성 아티팩트를 살핍니다. Linux는 systemd 사용자 서비스·cron, macOS는 ~/Library/LaunchAgents, Windows는 스케줄 작업·시작 폴더를 봅니다.

• C2 IP 37.27.122.124·57.128.246.79, temp.sh 업로드, archive.torproject.org 다운로드 등 비정상 아웃바운드를 방화벽·프록시 로그에서 조사합니다.

✅ CHECK

악성 버전을 한 번이라도 설치한 CI 러너·개발 머신은 "정리했으니 안전"이 아니라 "자격증명이 유출됐다"를 기준으로 판단해야 합니다.
로그에 유출 흔적이 보이지 않더라도 자격증명은 노출된 것으로 간주합니다.

■ 대응 방안

• 점검 결과 영향 버전이 확인되면 8.14.0·8.16.0·8.17.0·8.18.0·8.20.0을 즉시 제거하고 8.22.0 이상으로 올리거나 8.13.0으로 고정합니다.

• 감염 의심 환경에서 접근 가능했던 모든 클라우드 키·npm 토큰·GitHub 자격증명·AI 도구 API 키를 폐기하고 재발급합니다.

• 암호화폐 지갑은 자금을 새 지갑으로 옮기고, 브라우저·협업 도구 세션을 전부 무효화합니다.

• systemd 유닛·LaunchAgent·스케줄 작업 등 지속성 메커니즘을 찾아 제거합니다.

• CI 파이프라인은 lockfile 무결성 검증과 알려진 악성 해시 스캔을 배포 게이트에 넣어 재감염을 차단합니다.

💡 TIP

npm 토큰은 이번 웜의 자가전파 연료입니다.
조직 계정의 배포 토큰을 폐기·재발급하고, 가능하면 게시 권한을 짧은 수명의 자동화 토큰과 2단계 인증으로 제한하는 것이 확산을 끊는 핵심입니다.

[참고 자료]

jscrambler npm Supply Chain Attack (Socket)

IronWorm Returns as jscrambler, Rustier Than Ever (JFrog)

Compromised jscrambler 8.14.0 npm Release Drops Rust Infostealer (The Hacker News)

  • #EQST_NOW
  • #취약점

관련 서비스

더 많은 보안 인사이트

SK쉴더스 유튜브 채널에서 확인하세요.

SK쉴더스 유튜브 채널에서 확인하세요.
보안 트렌드와 대응방법

매월 뉴스레터로 확인하세요.

매월 뉴스레터로 확인하세요.