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/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-utility пакет без поле за хранилище | Последователен шаблон за кампания: фалшиви пакети с помощни програми TypeScript с вградени злонамерени полезни товари postinstall hooks или добавено към index.js. |




