TL; DR
あるnpmオペレーターは、次のような偽のTypeScript「ユーティリティ」パッケージを6週間かけて公開した。 ts-form-utils, ts-project-lint, ts-enum-helper.
これらのパッケージは一見すると正当な検証ヘルパーのように見えるが、実際のペイロードはインストール時または初回読み込み時に実行され、ホストのフィンガープリンティング、GitHub組織の検出、リポジトリのクローン作成、およびソースコードの漏洩を実行する。
このマルウェアは特に、複数のGitHub組織を含む、価値の高いGitHub組織を標的にしています。 Shopifyサービス リポジトリを作成し、アクセス可能なソースツリーをアーカイブして、中央集権型の収集エンドポイントに抽出します。
侵害ワークフローの一環として、ペイロード commitGoogleの自律型コーディングIDを装いながら、saファイルを被害者のリポジトリに戻す google-labs-jules[bot].
私たちはキャンペーンを追跡しました。 ジュールズ・ジャッカー — 複数のパブリッシャーの範囲と、暗号化されたバリアントやサンドボックス対応バリアントを含む、少なくとも5つのペイロード世代にわたって。
最新の亜種は、マルウェア分析インフラストラクチャを特に標的としており、分析環境内でのみ活動し、クラウドメタデータサービスアカウントトークンを盗み出し、Kubernetesコントロールプレーンとクラウドストレージバケットを調査します。
すべてのペイロード世代で共有される主要な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, git リモート -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 (約100ミリ秒):ホストのフィンガープリントを取得します。ホスト名、ユーザー情報、git ID。
- ステージ1 (約3秒):被害者がどの組織に所属しているかを調べる git リモート -vハードコードされたものを調べます ORG_CONFIG テーブルとテストリポジトリへのアクセス git ls-remote — 攻撃者が制御するSSRFプロキシを経由してルーティングされます http://git@192.168.0.1:8080.
- ステージ2 (約10秒): git clone ターゲットリスト内のアクセス可能なすべてのリポジトリを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, Shopify/アイデンティティ, Shopify/請求, Shopify/vault, Shopify/secrets, Shopify/インフラストラクチャ, Shopify/.github試験組織と並んで、 アーロン・スタックバーンズオペレーターが制御し、書き込み対象として使用すると思われるもの。
第4世代(SC4):暗号化されゲート化された
最新の開発者向けバージョンでは、SC3ワームに加えて2層の回避機能が追加されています。
まず、ペイロードはもはや平文で送られません。実際のロジックはAES-256-CBCで暗号化されたブロブに格納されています。 lib/.perf.dat最初の16バイトにIVが含まれている。ローダーは index.js 連結された文字列断片から復号鍵を再構築し、ブロブを復号して、それを実行します。 新しい関数()モジュール名さえも、静的スキャナーを回避するために分割されている。 require('crypt' + 'o'), require('f' + 's').
第二に、ホストゲート方式です。あるバリアントは、特定の条件下でのみ復号化して実行します。 os.hostname() 等しい 開発者ボックス or ubuntu-fc-uvm (Firecracker microVM のデフォルト)または部分文字列を含む 開発者ボックス。別のゲートは、 .jules/ 作業ディレクトリ:
言い換えれば、SC4ペイロードは、通常の開発者のラップトップ上で休眠状態を保ち、自動化されたAIエージェント内でのみ起動するように設計されており、 サンドボックス環境 オペレーターは実際には妥協を望んでいる。
ラボの稼働:分析インフラストラクチャ型
キャンペーンの中で最も斬新なパッケージは、 ts-enum-helper開発者やShopifyを攻撃するものでは一切ありません。 postinstall.sh ゲームの内容を明かすゲートから始まる:
マルウェア解析プラットフォーム固有の環境変数が設定されない限り、スクリプトは何も実行しません。環境変数が設定されると、ペイロードは、まさにこのようなパッケージを爆発させて解析するために存在するサンドボックス内で実行されていることを認識し、反撃を開始します。
まず、インスタンスメタデータサーバーからGCPサービスアカウントOAuthトークンを取得し、それを外部に持ち出します。次に、そのトークンを使用して、 Kubernetes コントロールプレーン で到達可能 kubernetes.default.svc:
- ClusterRoleBindings、ClusterRoles、およびNodesを一覧表示します。
- ポッド、シークレット、およびコンフィグマップをプローブします キューブシステム, デフォルト, kube-public, kube-node-lease、および分析ネームスペース。
- SelfSubjectAccessReview 呼び出しを発行して、盗まれたIDが何を実行できるかを正確にマッピングします。
最後に、ハードコードされた GCP プロジェクト ID から構築された Google Cloud Storage バケット名を総当たりで試行します (レアサイン437603-p9)とプロジェクト番号、次のような組み合わせを推測する *-ビルド, *-アーティファクト、そしていくつか 分析- 接頭辞(分析結果, 分析パッケージ, 分析スキャンすべてのレスポンスコードとボディはログに記録され、同じ宛先にPOSTされます。 ジュールズ・コレクト エンドポイントを使用して定義します
これは、防御側のインフラストラクチャを攻撃するために特別に構築されたサプライチェーンペイロードという稀なケースです。キャンペーン全体を通してのカバーストーリー(その一部はペイロード内のコメントとして現れ、「セキュリティ研究の概念実証…スコープが拡大された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 は元の発行者スコープを削除します。パッケージ名は、セキュリティを保持する空のプレースホルダーに解決されます。 |
| 同じ週 | オペレーターは、ほぼ同一の類似したスコープに移行し、分析インフラストラクチャの亜種を含むワームを再公開する。 |
移行こそが、防衛側がじっくりと取り組むべき部分だ。最初のスコープの破壊は、キャンペーンを終わらせることも、遅らせることもできなかった。オペレーターはすでに、元のスコープと名前が1文字だけ異なる並行スコープを準備しており、同じ週内に公開を続けていた。この記事執筆時点では、新しいスコープの ts-form-utils (バージョン1.0.0から1.1.0まで) ts-project-lint (1.0.0および1.1.0)、およびスタンドアロン ts-enum-helper (1.0.0) は引き続きインストール可能です。
侵害の兆候
以下の指標はすべて、パッケージのソースコードと照合して確認済みです。
| タイプ | インジケータ | Notes |
|---|---|---|
| ネットワーク(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 作者の身元が被害者のメインラインブランチに押し込まれた。 |
| File | lib/.perf.dat | AES-256-CBCで暗号化されたペイロードブロブ。IVは最初の16バイトに格納され、キーは動的に再構築されます。 index.js. |
| File | SECURITY-POC.md | 落として commit被害者リポジトリにメッセージとともに戻されました chore: update dependency cache. |
| File | scripts/postinstall.sh | ゲート付き $MALYSIS_ANALYSIS_ID; 分析インフラストラクチャをターゲットとするバリアントを識別します。 |
| 行動の | os.hostname() をチェック devbox / ubuntu-fc-uvm | ペイロードの復号化と実行に先立ち、サンドボックスおよびAIエージェント環境のゲート処理を実施する。 |
| 行動の | .jules/ (NAIST) と /app/.jules ディレクトリの読み取り | AIエージェントの作業環境を明示的にターゲットとする。 |
| 行動の | sc1-, sc3-, sc4-, s0-vmm-recon | オペレーターが定義するテレメトリステージラベルは、探知や追跡に役立ちます。 |
| クラウドターゲット | rare-signer-437603-p9malysis-* バケット予想 | 分析インフラストラクチャのバリアントに、ハードコードされたGCPプロジェクト識別子とストレージバケット列挙パターンが埋め込まれています。 |
| パッケージ形状 | リポジトリフィールドのないTSユーティリティパッケージのファサード | 一貫したキャンペーンテンプレート: 悪意のあるペイロードが埋め込まれた偽の TypeScript ユーティリティ パッケージ postinstall hooks または付加される index.js. |




