TL, д-р
Адзін аператар npm шэсць тыдняў публікаваў падробленыя «ўтылітныя» пакеты TypeScript, такія як ts-form-utils, ts-project-lint, і ts-enum-helper.
Хоць пакеты і прапануюць невялікія памочнікі праверкі, якія выглядаюць легітымна, рэальная карысная нагрузка выконваецца пры ўсталёўцы або першым патрабаванні і выконвае адбіткі пальцаў хаста, выяўленне арганізацыі GitHub, кланаванне рэпазіторыяў і выдаленне зыходнага кода.
Шкоднаснае праграмнае забеспячэнне спецыяльна нацэлена на высокакаштоўныя арганізацыі GitHub, у тым ліку некалькі Shopify рэпазіторыі, затым архівуе і пераносіць даступныя дрэвы крыніц у цэнтралізаваную канчатковую кропку калекцыі.
У рамках працоўнага працэсу кампрамісу карысная нагрузка commitsa-файл назад у рэпазіторыі ахвяры, выдаючы сябе за аўтаномную асобу праграміста Google google-labs-jules[bot].
Мы адсочвалі кампанію пад назвай Джулс Джэкер — для некалькіх выдаўцоў і як мінімум пяці пакаленняў карыснай нагрузкі, уключаючы зашыфраваныя варыянты і варыянты з падтрымкай пясочніцы.
Найноўшы варыянт спецыяльна накіраваны на інфраструктуру аналізу шкоднасных праграм: ён актывуецца толькі ўнутры асяроддзяў аналізу, крадзе токены ўліковых запісаў службаў воблачных метаданых і даследуе плоскасці кіравання Kubernetes і воблачныя сховішчы дадзеных.
Асноўным IOC, агульным для ўсіх пакаленняў карыснай нагрузкі, з'яўляецца канчатковая кропка збору. aaronstack[.]com/jules-collect.
Ступень цяжкасці: крытычная.
Атака: як гэта працуе
Кожны пакет JulesJacker прытрымліваецца аднаго і таго ж шаблону. package.json рэкламуе бясшкодны памочнік TypeScript з ліцэнзіяй MIT і без спасылкі на рэпазітар зыходнага кода. index.js экспартуе некалькі рэальных, працоўных функцый — рэгулярныя выразы электроннай пошты, карты пералічэнняў, табліцы правілаў lint — каб распрацоўшчык, які фактычна імпартуе пакет, бачыў праўдападобную паводзіны. Злосць хаваецца ў іншым месцы: у пасля ўстаноўкі кручок або ў блоку ўнізе index.js які выконваецца ў той момант, калі патрабуецца модуль.
Карысная нагрузка прайшла праз выразна пранумараваныя ўнутраныя этапы (аператар сам маркіруе свае тэлеметрычныя падзеі sc1-, sc3-, sc4-і гэтак далей), і назіранне за гэтай эвалюцыяй — найбольш ясны спосаб зразумець кампанію.
Пакаленне 1–2: разведка і крадзеж канфігурацыі git
Самыя раннія пакеты былі простымі крадзяжамі інфармацыі. Пры ўсталёўцы яны збіралі зменныя асяроддзя, файл hosts каманднага радка GitHub і глабальную канфігурацыю git (git config –global –list, git аддалены -v), а затым адправіў пакет у канчатковую кропку калекцыі з дапамогай POST. Гэта ўстанавіла подпіс аператара: тытульная гісторыя «ўтыліты праверкі формаў TypeScript», выходны маяк на адзін дамен і схільнасць да ўліковых дадзеных распрацоўшчыка, а не да дадзеных спажыўцоў.
Пакаленне 3: гіпервізар і зонды выхаду ядра
Адна з версій у сярэдзіне кампаніі рэзка перайшла да атак на інфраструктуру. Замест крадзяжу канфігурацыі яна правяла разведвальнае зондаванне дроту. AF_VSOCK сокеты, рэгіёны virtio MMIO, /dev/mem, а таксама сцягі ўзмацнення бяспекі ядра і нават спробы збояў ядра, выкліканых sysrq — паводзіны, звязаныя са спробамі выхаду з віртуальнай машыны або кантэйнера. Тэгі тэлеметрыі (s0-vmm-recon, s1-vmm-vsock-fuzz, s2-vmm-mmio, s3-kernel-probe) выразна выказаў намер. Гэты варыянт быў відавочна накіраваны на воблачныя пясочніцы і асяроддзі бессервернага запуску — тып эфемернай віртуальнай машыны, якая стварае і тэстуе ненадзейны код.
Пакаленне 3 (SC3): чарвяк запісу з перакрыжаванымі рэпазітарамі
Цэнтрам цяжару кампаніі стаў самараспаўсюджвальны злодзей рэпазіторыяў. Пасля ўсталёўкі карысная нагрузка выконвае пяціэтапную абмежаваную па часе паслядоўнасць:
- этап 0 (~100 мс): адбітак пальца хаста — імя хаста, інфармацыя пра карыстальніка, ідэнтыфікатар git.
- этап 1 (~3 с): вызначыць, да якой арганізацыі належыць ахвяра, шляхам праверкі git аддалены -v, а затым знайдзіце жорстка закадаваны ORG_CONFIG доступ да табліцы і тэставага рэпазітара з дапамогай git ls-аддалены — маршрутызуецца праз кантраляваны зламыснікам проксі-сервер 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>, і задачай паведамлення: абнавіць кэш залежнасцей, а затым адправіць у асноўную галінку ахвяры.
Спіс мэтаў, зададзены ў кодзе, не з'яўляецца агульным. Ён утрымлівае больш за трыццаць Shopify рэпазіторыі па назвах — Shopify/shopify, Shopify/ідэнтычнасць, Shopify/плацежная сістэма, Shopify/сховішча, Shopify/сакрэты, Shopify/інфраструктура, Shopify/.githubі многае іншае — разам з выпрабавальнай арганізацыяй, АаронСтэкБарнс, якім, відаць, кіруе аператар і выкарыстоўвае яго ў якасці мэты запісу.
Пакаленне 4 (SC4): зашыфраванае і абароненае
Найноўшы варыянт, арыентаваны на распрацоўшчыкаў, дадае два ўзроўні ўхілення ад чарвяка SC3.
Па-першае, карысная нагрузка больш не перадаецца ў выглядзе адкрытага тэксту. Сапраўдная логіка знаходзіцца ў блобе, зашыфраваным па AES-256-CBC. lib/.perf.dat, з IV у першых шаснаццаці байтах. Загрузчык у index.js аднаўляе ключ дэшыфравання з аб'яднаных фрагментаў радка, дэшыфруе блоб і запускае яго з дапамогай новая функцыя()Нават назвы модуляў падзеленыя, каб пазбегнуць статычных сканераў — патрабуецца('крыпт' + 'o'), патрабуецца('f' + 's').
Па-другое, ён абмежаваны хостам. Адзін варыянт расшыфроўваецца і запускаецца толькі тады, калі os.імя_хаста() ўраўноўваецца распрацоўніцкая скрынка or ubuntu-fc-uvm (па змаўчанні для Firecracker microVM) або змяшчае падрадок распрацоўніцкая скрынкаЯшчэ адзін вароты на наяўнасці .jules/ рабочы каталог:
Іншымі словамі, карысная нагрузка SC4 распрацавана так, каб заставацца ў спячым стане на звычайным ноўтбуку распрацоўшчыка і абуджацца толькі ўнутры аўтаматызаванага агента штучнага інтэлекту. асяроддзя пясочніцы аператар насамрэч хоча пайсці на кампраміс.
Уключэнне лабараторыі: варыянт аналітычнай інфраструктуры
Найбольш новы пакет у кампаніі, ts-enum-helper, зусім не атакуе распрацоўшчыкаў або Shopify. Яго postinstall.sh адчыняецца брамай, якая выдае гульню:
Скрыпт нічога не робіць, пакуль не зададзена зменная асяроддзя, спецыфічная для платформы аналізу шкоднасных праграм. Калі яна зададзена, карысная нагрузка ведае, што яна працуе ўнутры пясочніцы, якая існуе для дэтанацыі і вывучэння пакетаў, падобных да гэтага, і контратакуе.
Спачатку ён атрымлівае токен OAuth службовага ўліковага запісу GCP з сервера метададзеных экзэмпляра і выдаляе яго. Затым, выкарыстоўваючы гэты токен, ён праглядае Плоскасць кіравання Kubernetes даступны на kubernetes.default.svc:
- пералічвае прывязкі кластарных ролей, ролі кластара і вузлы;
- зондуе пады, сакрэты і карты канфігурацый па ўсім сістэма кубе, дэфолт, kube-public, арэнда вузла kubeі прастору імёнаў аналізу;
- выдае выклікі SelfSubjectAccessReview, каб дакладна адлюстраваць, што дазволена рабіць скрадзенай асобе.
Нарэшце, ён перабірае назвы сховішчаў Google Cloud, створаныя з жорстка закадаванага ідэнтыфікатара праекта GCP (рэдкі-падпісант-437603-p9) і нумар праекта, адгадваючы камбінацыі, такія як *-зборкі, *-артэфакты, і некалькі малізіс- прэфіксы (вынікі малізу, пакеты malysis, малізіс-сканаванняКожны код і цела адказу запісваюцца ў журнал і адпраўляюцца назад у той жа Жуль-Калекшн канчатковая кропка.
Гэта рэдкі выпадак, калі карысная нагрузка ланцужка паставак была створана спецыяльна для атакі ўласнай інфраструктуры абаронцаў. Прыкрыццё ўсёй кампаніі — фрагменты якой з'яўляюцца ўнутры карысных нагрузак у выглядзе каментарыяў, якія апісваюць паводзіны як «PoC даследаванняў бяспекі... запіс у міжрэпазітарны рэпазітар праз токен проксі-сервера git з перавышанай вобласцю» — з'яўляецца адным і тым жа самаапраўданнем, незалежна ад таго, ці з'яўляецца мэтай выканання монарэпазітар 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. |
| Сетка (проксі-сервер 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 | BLOB-карысная нагрузка, зашыфраваная па 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 | Шчытаванне асяроддзя пясочніцы і агента штучнага інтэлекту перад расшыфроўкай і выкананнем карыснай нагрузкі. |
| Паводніцкія | .jules/ і /app/.jules чытае каталог | Яўнае таргетынг асяроддзяў працоўнай прасторы агентаў штучнага інтэлекту. |
| Паводніцкія | sc1-, sc3-, sc4-, s0-vmm-recon | Вызначаныя аператарам меткі этапаў тэлеметрыі, карысныя для выяўлення і палявання. |
| Воблачная мэта | rare-signer-437603-p9malysis-* здагадкі з вядра | Жорстка закадаваныя ідэнтыфікатары праектаў GCP і шаблоны пералічэння сховішчаў, убудаваныя ў варыянт інфраструктуры аналізу. |
| Форма ўпакоўкі | Фасад пакета TS-utility без поля рэпазітара | Паслядоўны шаблон кампаніі: падробленыя пакеты ўтыліт TypeScript з убудаванымі шкоднаснымі карыснымі нагрузкамі postinstall hooks або дадаецца да index.js. |




