JulesJacker: Фалшив npm червей се представя за Jules AI

JulesJacker: Фалшив PoC npm червей, който се представя за Jules Agent на Google и включва пясъчник, анализирайки го

TL; DR

Един-единствен npm оператор прекара шест седмици в публикуване на фалшиви TypeScript „помощни“ пакети, като например ts-form-utils, ts-project-lint, и ts-enum-helper.

Докато пакетите предоставят малки, изглеждащи легитимни помощни програми за валидиране, истинският полезен товар се изпълнява при инсталиране или първо изискване и извършва снемане на пръстови отпечатъци на хоста, откриване на организация в GitHub, клониране на хранилища и извличане на изходния код.

Зловредният софтуер е насочен специално към високо ценени организации в GitHub, включително множество Shopify хранилища, след което архивира и извлича достъпни дървета на източника до централизирана крайна точка за колекция.

Като част от работния процес за компромис, полезният товар commitsa файл обратно в хранилищата на жертвата, като същевременно се представя за автономната кодираща идентичност на Google google-labs-jules[bot].

Проследихме кампанията — наречена Джулс Джакър — в множество обхвати на издатели и поне пет поколения полезен товар, включително криптирани и sandbox-съвместими варианти.

Най-новият вариант е насочен специално към инфраструктурата за анализ на зловреден софтуер: той се активира само в аналитични среди, краде токени за акаунти на услуги за облачни метаданни и сондира контролните равнини на Kubernetes и контейнерите за съхранение в облака.

Основният IOC, споделен между всички поколения полезни товари, е крайната точка за събиране. aaronstack[.]com/jules-collect.

Тежест: критична.

Атаката: Как работи

Всеки пакет на JulesJacker следва един и същ шаблон. package.json рекламира безобиден помощник на TypeScript с лиценз на MIT и без свързано хранилище с изходен код. index.js експортира няколко реални, работещи функции — регулярни изрази за имейл, карти на изброявания, таблици с правила за lint — така че разработчикът, който действително импортира пакета, да вижда правдоподобно поведение. Злобата се крие другаде: в след инсталиране кука или в блок в долната част на index.js който се изпълнява в момента, в който модулът е необходим.

Полезните товари са еволюирали през ясно номерирани вътрешни етапи (операторът сам обозначава своите телеметрични събития) sc1-, sc3-, sc4-и т.н.), а наблюдението на тази еволюция е най-ясният начин да се разбере кампанията.

 Поколение 1–2: разузнаване и кражба на git-config

Най-ранните пакети бяха ясни крадци на информация. При инсталиране те събираха променливи на средата, файла hosts на GitHub CLI и глобалната git конфигурация (git config –global –list, git отдалечено -v), след което изпрати пакета до крайната точка на колекцията. Това установи подписа на оператора: история за прикритие „помощни програми за валидиране на формуляри в TypeScript“, изходящ маяк към един домейн и предпочитание към идентификационните данни на разработчиците, а не към потребителските данни.

Поколение 3: хипервизор и сонди за излизане от ядрото

Една версия в средата на кампанията се насочи рязко към атаки върху инфраструктурата. Вместо да краде конфигурация, тя проведе разузнавателно сондиране на хардуера. AF_VSOCK сокети, virtio MMIO региони, / dev / mem, както и флагове за втвърдяване на ядрото, и дори опити за сривове на ядрото, предизвикани от sysrq — поведение, свързано с опити за излизане от виртуална машина или контейнер. Таговете за телеметрия (s0-vmm-recon, s1-vmm-vsock-fuzz, s2-vmm-mmio, s3-ядро-сонда) изрично е посочил намерението. Този вариант е бил явно насочен към облачни пясъчник и безсървърни среди — вид ефимерна виртуална машина, която изгражда и тества ненадежден код.

Поколение 3 (SC3): червей за запис с кръстосано хранилище

Центърът на тежестта на кампанията се превърна в саморазпространяващ се крадец на хранилища. При инсталиране, полезният товар изпълнява пететапна времева последователност:

  • Етап 0 (~100 мс): пръстов отпечатък на хоста — име на хост, информация за потребителя, git идентичност.
  • Етап 1 (~3 сек): определете към коя организация принадлежи жертвата чрез проверка git отдалечено -v, след което потърсете твърдо кодиран ORG_CONFIG достъп до таблица и тестово хранилище с git ls-remote — маршрутизиран през контролиран от хакер SSRF прокси на адрес http://git@192.168.0.1:8080.
  • Етап 2 (~10 сек): git клонинг всяко достижимо хранилище в целевия списък, архивирайте дървото с tarball и gzip, кодирайте го в base64 и го извлечете чрез chunk.
  • Етап 3 (~45 сек): „доказателството за достъп“ — клониране на хранилище с възможност за запис, премахване на файл с име SECURITY-POC.md и commit с автор, зададен на google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> и задачата за съобщението: актуализиране на кеша на зависимостите, след което изпращане към главния клон на жертвата.

Твърдо кодираният списък с цели не е обобщен. Той изброява повече от тридесет Shopify хранилища по име — Shopify/shopify, Shopify/идентичност, Shopify/фактуриране, Shopify/трезор, Shopify/тайни, Shopify/инфраструктура, Shopify/.githubи много други — наред с организация за тестване, АаронСтакБарнс, който операторът изглежда контролира и използва като цел за запис.

Поколение 4 (SC4): криптирано и защитено

Най-новият вариант, насочен към разработчиците, добавя два слоя за избягване на вируса върху червея SC3.

Първо, полезният товар вече не се доставя като открит текст. Истинската логика се намира в блоб, криптиран с AES-256-CBC, lib/.perf.dat, с IV в първите си шестнадесет байта. Зареждащият механизъм в index.js реконструира ключа за декриптиране от конкатенирани фрагменти от низове, декриптира блоба и го изпълнява с нова функция()Дори имената на модулите са разделени, за да се избегнат статичните сканери — изискване('крипта' + 'о'), изискване('f' + 's').

Второ, той е ограничен от хоста. Един вариант декриптира и работи само когато os.hostname() равно на кутия за разработчици or ubuntu-fc-uvm (по подразбиране за Firecracker microVM) или съдържа подниз кутия за разработчициДруги порти за наличието на .jules/ работна директория:

С други думи, полезният товар на SC4 е проектиран да остане спящ на обикновен лаптоп на разработчик и да се събуди само в рамките на автоматизирания AI-агент. пясъчни среди операторът всъщност иска да направи компромис.

Включване на лабораторията: вариантът за анализ и инфраструктура

Най-новият пакет в кампанията, ts-enum-helper, изобщо не атакува разработчиците или Shopify. Неговите postinstall.sh отваря се с порта, която издава играта:

Скриптът не прави нищо, освен ако не е зададена променлива на средата, специфична за платформа за анализ на зловреден софтуер. Когато е зададена, полезният товар знае, че се изпълнява в пясъчника, който съществува, за да взривява и изучава пакети точно като този - и контраатакува.

Първо извлича OAuth токена на сервизния акаунт на GCP от сървъра с метаданни на екземпляра и го извлича. След това, използвайки този токен, преглежда Контролна равнина на Kubernetes достъпен на kubernetes.default.svc:

  • изброява ClusterRoleBindings, ClusterRoles и Nodes;
  • сондира pod-ове, secrets и configmaps в kube-система, подразбиране, kube-public, лизинг на kube-възели пространството от имена за анализ;
  • издава извиквания на SelfSubjectAccessReview, за да картографира точно какво е позволено на откраднатата самоличност.

Накрая, той извършва груба сила на имената на контейнерите в Google Cloud Storage, изградени от твърдо кодиран GCP проект ID (rare-signer-437603-p9) и номер на проекта, като се гадаят комбинации като например *-изгражда, *-артефакти, и няколко малyзис- префикси (резултати от мализация, пакети за мализация, мализиращи сканирания). Всеки код и тяло на отговора се записват в регистрационен файл и се изпращат обратно към същия сървър. jules-collect крайна точка.

Това е рядък случай на полезен товар от веригата за доставки, създаден специално за атака на собствената инфраструктура на защитниците. Прикриващата история в цялата кампания – фрагменти от която се появяват вътре в полезните товари като коментари, рамкиращи поведението като „Security Research PoC ... запис в кръстосано хранилище чрез overscoped git proxy token“ – е едно и също самооправдание, независимо дали целта по време на изпълнение е монохранилище на Shopify или сървърът за метаданни на аналитичния клъстер.

Хронология и миграция на обхвата

JulesJacker не е еднократно решение. Това е устойчива операция, която оцеля след премахване в системния регистър, просто като промени името си.

Кога събитие
Средата на април 2026 г. Първите пакети се появяват в оригиналния обхват на издателя: TS-utility facade, environment и git-config exfiltration.
Началото на май 2026 г Публикуван е хипервизор и вариант за разузнаване с избегване на ядрото.
Средата до края на май 2026 г. Червеят за писане SC3, който се свързва с различни хранилища, се появява заедно с полезни товари, насочени към Shopify. google-labs-jules[bot] представяне за друг. SC4 въвежда AES-криптирани и хост-гейтирани зареждащи програми.
В края на май 2026 г 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/v1
kubernetes.default.svc
storage.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-p9
malysis-* кофа предположения
Твърдо кодирани идентификатори на GCP проекти и модели за изброяване на контейнери за съхранение, вградени във варианта за анализ на инфраструктурата.
Форма на опаковката Фасада на TS-utility пакет без поле за хранилище Последователен шаблон за кампания: фалшиви пакети с помощни програми TypeScript с вградени злонамерени полезни товари postinstall hooks или добавено към index.js.
инструменти за анализ на състава на софтуера SCA Tools
Приоритизирайте, отстранете и защитете софтуерните си рискове
Вземете своя безплатен акаунт.
Не е необходима кредитна карта.

Осигурете си разработка и доставка на софтуер

с продуктовия пакет Xygeni