TL; DR
한 명의 npm 운영자가 6주 동안 가짜 TypeScript "유틸리티" 패키지를 게시했습니다. ts-form-utils, ts-project-lint예산 및 ts-enum-helper.
해당 패키지들은 겉보기에는 합법적인 유효성 검사 도우미처럼 보이지만, 실제 페이로드는 설치 또는 최초 require 시 실행되어 호스트 지문 인식, GitHub 조직 검색, 저장소 복제 및 소스 코드 유출을 수행합니다.
이 악성 소프트웨어는 특히 여러 GitHub 조직을 포함하여 가치가 높은 GitHub 조직을 표적으로 삼습니다. Shopify 저장소를 관리한 다음, 접근 가능한 소스 트리를 중앙 집중식 수집 엔드포인트로 아카이브하고 유출합니다.
침해 워크플로의 일부로, 페이로드 commit구글의 자율 코딩 계정을 사칭하여 sa 파일을 피해자 저장소에 다시 삽입했습니다. google-labs-jules[bot].
우리는 그 캠페인을 추적했습니다. 줄스잭커 — 암호화 및 샌드박스 인식 변종을 포함하여 여러 게시자 범위와 최소 5세대의 페이로드에 걸쳐 적용됩니다.
최신 변종은 특히 악성코드 분석 인프라를 표적으로 삼습니다. 분석 환경 내부에서만 활성화되어 클라우드 메타데이터 서비스 계정 토큰을 탈취하고 쿠버네티스 제어 플레인과 클라우드 스토리지 버킷을 탐색합니다.
모든 페이로드 세대에서 공통적으로 사용되는 주요 IOC는 수집 엔드포인트입니다. aaronstack[.]com/jules-collect.
심각도: 매우 심각함.
공격 방식: 작동 원리
모든 JulesJacker 패키지는 동일한 템플릿을 따릅니다. package.json MIT 라이선스가 적용되고 소스 저장소 링크가 없는 무해한 TypeScript 헬퍼를 광고합니다. index.js 이 패키지는 이메일 정규 표현식, 열거형 맵, 린트 규칙 테이블과 같은 몇 가지 실제 작동하는 기능을 내보내므로, 실제로 패키지를 가져오는 개발자는 그럴듯한 동작을 볼 수 있습니다. 하지만 악의적인 의도는 다른 곳에 숨어 있습니다. 설치 후 갈고리 또는 바닥 블록에 index.js 해당 모듈이 필요해지는 순간 실행됩니다.
탑재체는 명확하게 번호가 매겨진 내부 단계를 거쳐 발전해 왔습니다(운영자는 자체 원격 측정 이벤트에 레이블을 지정합니다). sc1-, sc3-, sc4-(등등) 이러한 변화 과정을 지켜보는 것이 캠페인을 이해하는 가장 명확한 방법입니다.
1~2세대: 정찰 및 git-config 탈취
초창기 패키지들은 단순한 정보 탈취 도구였습니다. 설치 시 환경 변수, GitHub CLI 호스트 파일, 그리고 전역 Git 설정 파일을 수집했습니다.git config –global –list, 자식 원격 -v그런 다음 해당 번들을 컬렉션 엔드포인트로 POST했습니다. 이를 통해 운영자의 특징이 드러났습니다. 즉, "TypeScript 폼 유효성 검사 유틸리티"라는 위장 문구, 단일 도메인으로의 아웃바운드 비콘, 그리고 소비자 데이터보다는 개발자 자격 증명을 선호하는 경향입니다.
3세대: 하이퍼바이저 및 커널 탈출 탐지
캠페인 중간에 나온 한 버전은 인프라 공격으로 방향을 완전히 전환했습니다. 설정 파일을 훔치는 대신, 정찰용 도구를 실행하여 정보를 탐색했습니다. AF_VSOCK 소켓, virtio MMIO 영역, / dev / mem그리고 커널 강화 플래그, 심지어 sysrq로 인해 발생하는 커널 충돌 시도까지 포함됩니다. 이러한 동작은 가상 머신이나 컨테이너에서 탈출하려는 시도와 관련이 있습니다. 텔레메트리 태그(s0-vmm-recon, s1-vmm-vsock-fuzz, s2-vmm-mmio, s3-커널-프로브) 의도를 명확히 드러냈습니다. 이 변형은 분명히 겨냥한 것이었습니다. 클라우드 샌드박스 및 서버리스 러너 환경 — 신뢰할 수 없는 코드를 빌드하고 테스트하는 데 사용되는 임시 가상 머신입니다.
3세대(SC3): 크로스 리포지토리 쓰기 웜
이 캠페인의 핵심은 자체적으로 확산되는 저장소 탈취 악성코드가 되었습니다. 설치 시, 해당 악성코드는 5단계의 시간 순서대로 실행됩니다.
- 무대 0 (~100ms): 호스트의 지문을 추출합니다. - 호스트 이름, 사용자 정보, Git ID.
- 무대 1 (~3초): 피해자가 소속된 조직을 확인하기 위해 다음을 검사합니다. 자식 원격 -v그런 다음 하드코딩된 값을 찾아보세요. 조직 구성 테이블 및 테스트 저장소 액세스 권한 git ls-remote — 공격자가 제어하는 SSRF 프록시를 통해 라우팅됨 http://git@192.168.0.1:8080.
- 무대 2 (~10초): 자식 복제 대상 목록에 있는 접근 가능한 모든 저장소를 tarball 및 gzip으로 압축하고, base64로 인코딩한 다음, 청크 단위로 유출합니다.
- 무대 3 (~45초): "접근 증명" - 쓰기 가능한 저장소를 복제하고, SECURITY-POC.md라는 파일을 드롭합니다. commit 작성자가 google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>으로 설정되고 메시지 내용은 다음과 같습니다. 작업: 종속성 캐시를 업데이트한 다음 피해자의 메인라인 브랜치에 푸시합니다.
하드코딩된 대상 목록은 일반적이지 않습니다. 30개 이상의 대상을 열거하고 있습니다. Shopify 저장소 이름별 검색 — 쇼피파이/쇼피파이, 쇼피파이/아이덴티티, 쇼피파이/청구, 쇼피파이/볼트, Shopify/비밀, 쇼피파이/인프라, Shopify/.github그리고 시험 기관을 비롯한 더 많은 기관들이 있습니다. 아론스택반스운영자가 제어하는 것처럼 보이고 쓰기 대상으로 사용하는 것입니다.
4세대(SC4): 암호화 및 게이트 방식
최신 개발자용 변종은 SC3 웜에 두 겹의 회피 기능을 추가했습니다.
첫째, 페이로드는 더 이상 평문으로 전송되지 않습니다. 실제 로직은 AES-256-CBC로 암호화된 데이터 덩어리에 담겨 있습니다. lib/.perf.datIV가 처음 16바이트에 포함되어 있습니다. 로더는 index.js 연결된 문자열 조각들로부터 복호화 키를 재구성하고, 블롭을 복호화한 후 실행합니다. 새로운 함수()심지어 모듈 이름까지 분할하여 정적 스캐너를 피하도록 했습니다. require('crypt' + 'o'), require('f' + 's').
둘째, 호스트 게이트 방식입니다. 특정 변종은 특정 조건이 충족될 때만 복호화 및 실행됩니다. os.hostname() 같음 개발 상자 or 우분투-fc-uvm (Firecracker microVM 기본값)이거나 부분 문자열을 포함합니다. 개발 상자또 다른 문은 ~의 존재에 따라 열립니다. .줄스/ 작업 디렉토리:
즉, SC4 페이로드는 일반 개발자의 노트북에서는 비활성 상태로 유지되다가 자동화된 AI 에이전트 내부에서만 활성화되도록 설계되었습니다. 샌드박스 환경 운영자는 실제로 타협하기를 원합니다.
연구실 활성화: 분석 인프라 변형
이번 캠페인에서 가장 참신한 패키지입니다. ts-enum-helper개발자나 쇼피파이를 전혀 공격하지 않습니다. postinstall.sh 게임의 비밀을 드러내는 문으로 시작됩니다:
이 스크립트는 악성코드 분석 플랫폼에 특정한 환경 변수가 설정되어 있지 않으면 아무런 동작도 하지 않습니다. 하지만 해당 변수가 설정되면, 페이로드는 자신이 바로 이러한 유형의 패키지를 실행하고 연구하기 위해 존재하는 샌드박스 내에서 실행되고 있음을 인식하고 반격에 나섭니다.
먼저 인스턴스 메타데이터 서버에서 GCP 서비스 계정 OAuth 토큰을 가져와 유출합니다. 그런 다음 해당 토큰을 사용하여 데이터를 스캔합니다. Kubernetes 제어 평면 도달 가능한 쿠버네티스.기본.svc:
- ClusterRoleBindings, ClusterRoles 및 Nodes 목록을 표시합니다.
- 프로브는 Pod, Secret 및 ConfigMap을 여러 위치에 걸쳐 탐색합니다. 쿠베 시스템, 디폴트 값, kube-public, kube-node-lease그리고 분석 네임스페이스;
- SelfSubjectAccessReview 호출은 도난당한 신원이 정확히 무엇을 할 수 있는지를 매핑합니다.
마지막으로, 하드코딩된 GCP 프로젝트 ID를 기반으로 Google Cloud Storage 버킷 이름을 무차별 대입합니다.희귀 서명자-437603-p9) 및 프로젝트 번호, 추측 조합(예: ...) *-빌드, *-인공물, 그리고 여러 말리시스- 접두사(분석 결과, 말리시스 패키지, 말리시스 스캔모든 응답 코드와 본문은 로그에 기록되고 동일한 주소로 POST 방식으로 다시 전송됩니다. 줄스-컬렉트 엔드 포인트.
이는 방어자 자신의 인프라를 공격하기 위해 특별히 제작된 공급망 페이로드라는 드문 사례입니다. 전체 캠페인에 걸쳐 사용된 위장 스토리는 동일하며, 페이로드 내부에 "보안 연구 PoC... 범위가 과도하게 지정된 Git 프록시 토큰을 통한 교차 저장소 쓰기"와 같은 주석 형태로 나타나는데, 런타임 목표가 Shopify 모노레포이든 분석 클러스터의 메타데이터 서버이든 관계없이 동일한 자기 정당화 논리를 따릅니다.
마이그레이션 일정 및 범위
JulesJacker는 일회성 계정이 아닙니다. 레지스트리 삭제 시도에도 불구하고 단순히 이름을 바꾸는 것만으로 살아남은 지속적인 운영 방식입니다.
| 인셀덤 공식 판매점인 | 이벤트 |
|---|---|
| 2026년 XNUMX월 중순 | 최초 패키지들은 원래 게시자의 범위 내에 나타납니다: TS-utility façade, environment 및 git-config exfiltration. |
| 2026년 XNUMX월 초 | 하이퍼바이저 및 커널 탈출 정찰 변종이 공개되었습니다. |
| 2026년 5월 중순~하순 | SC3 크로스 리포지토리 쓰기 웜이 Shopify를 대상으로 하는 페이로드와 함께 나타났습니다. google-labs-jules[bot] 가장. SC4는 AES 암호화 및 호스트 게이트 로더를 도입합니다. |
| 2026년 XNUMX월 말 | npm은 원래 게시자 범위를 제거합니다. 패키지 이름은 보안을 위한 빈 자리 표시자로 해석됩니다. |
| 같은 주 | 운영자는 거의 동일한 형태의 스코프로 이동하여 분석 인프라 변종을 포함한 웜을 다시 배포합니다. |
마이그레이션은 수비측이 집중해야 할 부분입니다. 첫 번째 스코프를 제거했다고 해서 캠페인이 끝나거나 속도가 느려진 것은 아닙니다. 공격자는 이미 원래 스코프와 이름이 한 글자만 다른 새로운 스코프를 만들어 같은 주 내에 계속해서 콘텐츠를 게시했습니다. 이 글을 쓰는 시점에서 새로운 스코프는 다음과 같습니다. ts-form-utils (버전 1.0.0부터 1.1.0까지) ts-project-lint (1.0.0 및 1.1.0) 및 독립 실행형 ts-enum-helper (1.0.0) 설치 가능.
타협의 지표
아래의 모든 지표는 패키지 소스를 기준으로 확인되었습니다.
| 타입 | 지시자 | 노트 |
|---|---|---|
| 네트워크(C2) | aaronstack[.]com/jules-collect | 모든 세대에 걸쳐 단일 데이터 수집 엔드포인트를 사용하며, JSON 원격 측정 데이터와 base64-gzip으로 압축된 저장소 tarball 청크를 수신합니다. |
| 네트워크(SSRF 프록시) | http://git@192.168.0.1:8080 | 대상 조직의 저장소에 접근하기 위해 사용되는 범위가 넓은 Git 프록시 토큰의 프런트엔드입니다. |
| 네트워크(클라우드) | metadata.google.internal/computeMetadata/v1kubernetes.default.svcstorage.googleapis.com/storage/v1/b | 토큰 탈취 및 Kubernetes 제어 평면 정찰을 위한 분석 인프라 변형에서만 사용됩니다. |
| 통합 인증 | google-labs-jules[bot]161369871+google-labs-jules[bot]@users.noreply.github.com | 위조하는 commit 저자의 신원이 피해자의 주요 분기점에 주입되었습니다. |
| 입양 부모로서의 귀하의 적합성을 결정하기 위해 미국 이민국에 | lib/.perf.dat | AES-256-CBC로 암호화된 페이로드 블롭; IV는 처음 16바이트에 저장되고 키는 동적으로 재구성됩니다. index.js. |
| 입양 부모로서의 귀하의 적합성을 결정하기 위해 미국 이민국에 | SECURITY-POC.md | 떨어뜨렸고 commit피해자 저장소로 다시 테드를 보내 메시지를 전달했습니다. chore: update dependency cache. |
| 입양 부모로서의 귀하의 적합성을 결정하기 위해 미국 이민국에 | scripts/postinstall.sh | 게이트가 설치되어 있음 $MALYSIS_ANALYSIS_ID분석 인프라를 대상으로 하는 변이체를 식별합니다. |
| 행동의 | os.hostname() 확인 devbox / ubuntu-fc-uvm | 페이로드 복호화 및 실행 전에 샌드박스 및 AI 에이전트 환경에 대한 접근 제한이 적용됩니다. |
| 행동의 | .jules/ /app/.jules 디렉토리 읽기 | AI 에이전트 작업 공간에 대한 명시적 타겟팅. |
| 행동의 | sc1-, sc3-, sc4-, s0-vmm-recon | 탐지 및 추적에 유용한 운영자 정의 원격 측정 단계 레이블. |
| 클라우드 타겟 | rare-signer-437603-p9malysis-* 버킷 추측 | 분석 인프라 변형에 하드코딩된 GCP 프로젝트 식별자 및 스토리지 버킷 열거 패턴. |
| 패키지 형태 | 저장소 필드가 없는 TS 유틸리티 패키지 파사드 | 일관된 캠페인 템플릿: 악성 페이로드가 포함된 가짜 TypeScript 유틸리티 패키지 postinstall hooks 또는 추가된 index.js. |




