TL博士
一位 npm 管理員花了六週發布了一些虛假的 TypeScript「實用程式」包,例如: ts-form-utils, ts-project-lint以及 ts-enum-helper.
雖然這些軟體包會暴露一些看起來很合法的小型驗證助手,但真正的有效載荷會在安裝或首次引入時執行,並執行主機指紋識別、GitHub 組織發現、儲存庫克隆和原始程式碼外洩。
該惡意軟體專門針對高價值的 GitHub 組織,其中包括多個組織。 Shopify 然後,將儲存庫歸檔,並將可達的原始碼樹提取到集中式集合端點。
作為妥協流程的一部分,有效載荷 commit在冒充Google自主編碼身分的同時,將 sa 檔案放回受害者儲存庫。 google-labs-jules[bot].
我們追蹤了這場名為“ JulesJacker — 跨越多個發布者範圍和至少五代有效載荷,包括加密和沙箱感知變體。
最新變種專門針對惡意軟體分析基礎設施:它僅在分析環境內部激活,竊取雲元資料服務帳戶令牌,並探測 Kubernetes 控制平面和雲端儲存桶。
所有有效載荷世代共享的主要 IOC 是收集端點 aaronstack[.]com/jules-collect.
嚴重程度:危急。
攻擊原理
每個 JulesJacker 套件都遵循相同的模板。 的package.json 它宣傳一個無害的 TypeScript 輔助工具,採用 MIT 許可證,且沒有連結原始碼倉庫。 index.js 它導出了一些真正可用的函數——電子郵件正規表示式、枚舉映射、程式碼檢查規則表——以便實際匯入該套件的開發人員能夠看到合理的行為。惡意行為存在於其他地方:在… 安裝後 鉤子,或底部的塊 index.js 該函數會在需要該模組時立即執行。
有效載荷經歷了清晰編號的內部階段演變(運營商自行標記遙測事件)。 sc1-, sc3-, sc4-等等),觀察這一演變過程是了解這場運動的最清晰的方式。
第一代和第二代:偵察和git-config竊取
最早的軟體包就是直接竊取資訊的工具。安裝時,它們會收集環境變數、GitHub CLI hosts 檔案和全域 git 設定(git config --global --list, git 遠程-v然後,它將該捆綁包 POST 到集合端點。這確立了營運商的簽名:一個「TypeScript 表單驗證工具」的幌子,一個指向單一網域的出站信標,以及對開發者憑證而非消費者資料的偏好。
第三代:虛擬機器管理程式與核心逃逸探針
其中一個中期版本的攻擊策略迅速轉向基礎設施攻擊。它不再竊取配置,而是運行偵察框架進行探測。 AF_VSOCK 套接字、virtio MMIO 區域、 / dev / mem以及核心加固標誌,甚至嘗試透過 sysrq 觸發核心崩潰——這些行為與嘗試逃離虛擬機器或容器有關。遙測標籤(s0-vmm-recon, s1-vmm-vsock-fuzz, s2-vmm-mmio, s3-kernel-probe)明確表達了意圖。這個變體顯然是針對… 雲端沙箱和無伺服器運行環境 — 一種用於建置和測試不受信任程式碼的臨時虛擬機器。
第三代(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 編碼,然後分塊擷取。
- 第一階段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/Vault, Shopify/秘訣, Shopify/基礎設施, Shopify/.github以及更多——與測試機構一起, AaronStackBarnes操作員似乎可以控制並將其用作寫入目標。
第四代(SC4):加密和門控
最新的開發者導向的版本在 SC3 蠕蟲之上增加了兩層規避機制。
首先,有效載荷不再以明文形式傳輸。真正的邏輯位於經過 AES-256-CBC 加密的資料區塊中。 lib/.perf.dat其中 IV 位於前 16 個位元組。加載器在 index.js 它從連接的字串片段中重建解密金鑰,解密資料塊,並運行它 新的函數()甚至連模組名稱都進行了拆分,以躲避靜態掃描器—— require('crypt' + 'o'), require('f' + 's').
其次,它是主機控制的。其中一個變體僅在特定情況下才能解密和運行。 os.hostname() 等於 開發盒 or ubuntu-fc-uvm (Firecracker 微型虛擬機器的預設值)或包含子字串 開發盒另一個關卡取決於是否存在 .jules/ 工作目錄:
換句話說,SC4有效載荷的設計目的是在普通開發者的筆記型電腦上保持休眠狀態,僅在自動化AI代理內部才會喚醒。 沙箱環境 運營商其實想做出妥協。
啟動實驗室:分析基礎設施變體
此次活動中最具創新性的方案, ts-enum-helper完全不會攻擊開發者或 Shopify。 postinstall.sh 開場便是一扇洩漏遊戲規則的門:
除非設定了惡意軟體分析平台特有的環境變量,否則該腳本不會執行任何操作。設定了該環境變數後,有效載荷便知道它正在專門用於引爆和分析此類軟體包的沙箱中運行,並會發起反擊。
它首先從實例元資料伺服器提取 GCP 服務帳戶 OAuth 令牌並將其洩漏。然後,使用該令牌掃描… Kubernetes 控制平面 可達 kubernetes.default.svc:
- 列出 ClusterRoleBindings、ClusterRoles 和 Nodes;
- 探測跨 Pod、密鑰和配置映射 kube-system, 默認, kube-public, kube-node-lease以及分析命名空間;
- 發出 SelfSubjectAccessReview 呼叫,以精確映射被盜身分被允許執行的操作。
最後,它透過暴力破解的方式,根據硬編碼的 GCP 專案 ID 建立 Google Cloud Storage 儲存桶名稱(罕見簽名者-437603-p9)和項目編號,猜測組合,例如 *-構建, *-人工製品,還有幾個 蘋果酸中毒 前綴(蘋果酸溶血結果, 蘋果分析套件, 溶血掃描每個回應代碼和回應體都會被記錄並以 POST 方式傳送回同一個伺服器。 jules-collect 端點。
這是一個罕見的案例,其供應鏈有效載荷專門針對防御者本身的基礎設施而設計。整個攻擊活動的掩飾說法——部分內容以註釋的形式出現在有效載荷中,將攻擊行為描述為「安全研究概念驗證……透過範圍過大的 Git 代理令牌進行跨倉庫寫入」——無論運行時目標是 Shopify 的單體倉庫還是分析叢集的元資料伺服器,其理由都如出一轍。
時間表和範圍遷移
JulesJacker並非曇花一現。它是一個持續運作的域名,透過簡單地更改名稱,成功躲過了域名註冊局的查封。
| 日期 | 創建 |
|---|---|
| 2026年XNUMX月中旬 | 第一個軟體包出現在原始發布者範圍內:TS-utility 外觀、環境和 git-config 外洩。 |
| 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 | 掉落和 committed 帶著這則訊息回到了受害者儲存庫中 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. |




