TL؛ DR
یک اپراتور npm به تنهایی شش هفته را صرف انتشار بستههای «کاربردی» جعلی TypeScript مانند ts-form-utils, ts-project-lintو ts-enum-helper.
در حالی که این بستهها، کمککنندههای اعتبارسنجی کوچک و ظاهراً قانونی را افشا میکنند، بار دادهی اصلی در هنگام نصب یا اولین درخواست اجرا میشود و انگشتنگاری میزبان، کشف سازمان گیتهاب، شبیهسازی مخزن و استخراج کد منبع را انجام میدهد.
این بدافزار بهطور خاص سازمانهای باارزش GitHub، از جمله چندین مورد را هدف قرار میدهد. Shopify مخازن، سپس درختهای منبع قابل دسترسی را بایگانی و به یک نقطه پایانی جمعآوری متمرکز منتقل میکند.
به عنوان بخشی از گردش کار نفوذ، بار داده commitفایل sa را در حالی که هویت کدگذاری خودکار گوگل را جعل میکند، به مخازن قربانی برمیگرداند. google-labs-jules[bot].
ما این کمپین را ردیابی کردیم - به نام جولز جاکر - در چندین محدودهی انتشار و حداقل پنج نسل از پیلودها، شامل انواع رمزگذاریشده و آگاه از سندباکس.
جدیدترین نوع آن بهطور خاص زیرساختهای تحلیل بدافزار را هدف قرار میدهد: فقط در محیطهای تحلیل فعال میشود، توکنهای حساب سرویس ابرداده را میدزدد و صفحات کنترل Kubernetes و سطلهای ذخیرهسازی ابر را بررسی میکند.
نقطه پایانی جمعآوری، نقطه دسترسی اصلی (IOC) مشترک در تمام نسلهای بار داده است. aaronstack[.]com/jules-collect.
شدت: بحرانی.
حمله: چگونه کار میکند
هر بسته JulesJacker از الگوی یکسانی پیروی میکند. pack.json یک کمککنندهی بیخطر TypeScript با مجوز MIT و بدون مخزن منبع لینکشده را تبلیغ میکند. index.js تعدادی تابع واقعی و کارآمد - regexeهای ایمیل، نقشههای شمارشی، جداول قوانین lint - را صادر میکند، به طوری که توسعهدهندهای که واقعاً بسته را وارد میکند، رفتار قابل قبولی را مشاهده میکند. نیت شوم در جای دیگری نهفته است: در یک نصب پس از نصب قلاب، یا در یک بلوک در پایین index.js که در لحظه نیاز به ماژول اجرا میشود.
محمولهها از طریق مراحل داخلی شمارهگذاریشدهی واضح تکامل یافتهاند (اپراتور رویدادهای تلهمتری خود را برچسبگذاری میکند) sc1-, sc3-, sc4-و غیره)، و مشاهدهی این تکامل، روشنترین راه برای درک این کمپین است.
نسل ۱-۲: شناسایی و سرقت git-config
اولین بستهها، دزدهای اطلاعات سرراستی بودند. هنگام نصب، متغیرهای محیطی، فایل میزبانهای رابط خط فرمان گیتهاب و پیکربندی سراسری گیت (پیکربندی گیت – سراسری – لیست, گیت ریموت -v)، سپس بسته را به نقطه پایانی جمعآوری ارسال کرد. این کار امضای اپراتور را تعیین کرد: یک داستان پوششی «ابزارهای اعتبارسنجی فرم TypeScript»، یک چراغ راهنمای خروجی به یک دامنه واحد، و تمایل به اعتبارنامههای توسعهدهنده به جای دادههای مصرفکننده.
نسل ۳: کاوشگرهای فرار از هسته و هایپروایزر
یک نسخه در اواسط کمپین، به شدت به حملات زیرساختی روی آورد. به جای دزدیدن پیکربندی، یک ابزار شناسایی و کاوش در مهار را اجرا میکرد. AF_VSOCK سوکتها، مناطق مجازی MMIO، / dev / mem، و پرچمهای مقاومسازی هسته، و حتی تلاش برای از کار افتادن هسته ناشی از sysrq - رفتاری مرتبط با تلاش برای خروج از یک ماشین مجازی یا کانتینر. برچسبهای تلهمتری (شناسایی s0-vmm, s1-vmm-vsock-fuzz, s2-vmm-mmio, کاوشگر هسته s3) قصد را صریحاً بیان کرد. این نوع [عبارت] آشکارا هدف قرار گرفته بود محیطهای ابری-سندباکس و بدون سرور — نوعی ماشین مجازی موقت که کد غیرقابل اعتماد را میسازد و آزمایش میکند.
نسل ۳ (SC3): کرم نوشتن بین مخزنی
مرکز ثقل این کمپین به یک دزد مخزن خود تکثیر شونده تبدیل شد. در هنگام نصب، این بدافزار یک توالی زمانی پنج مرحلهای را اجرا میکند:
- مرحله 0 (حدود ۱۰۰ میلیثانیه): اثر انگشت میزبان — نام میزبان، اطلاعات کاربر، هویت گیت.
- مرحله 1 (~۳ ثانیه): با بررسی، مشخص میشود که قربانی به کدام سازمان تعلق دارد گیت ریموت -v، سپس یک کد سخت افزاری را جستجو کنید پیکربندی ORG دسترسی به جدول و مخزن تست با گیت ls-remote — از طریق یک پروکسی SSRF تحت کنترل مهاجم در http://git@192.168.0.1:8080.
- مرحله 2 (حدود ۱۰ ثانیه): کلون گیت هر مخزن قابل دسترسی در لیست هدف، tarball و gzip کردن درخت، رمزگذاری base64 آن و استخراج تکهای آن.
- مرحله 3 (حدود ۴۵ ثانیه): «اثبات دسترسی» - یک مخزن قابل نوشتن را کلون کنید، فایلی با نام SECURITY-POC.md را رها کنید، و commit آن را با تنظیم نویسنده روی google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> و کار اصلی پیام: بهروزرسانی حافظه پنهان وابستگی، سپس ارسال به شاخه اصلی قربانی، اجرا کنید.
فهرست هدفِ کدگذاریشده، عمومی نیست. بیش از سی مورد را فهرست میکند. Shopify مخازن بر اساس نام — شاپیفای/شاپیفای, Shopify/هویت, Shopify/صورتحساب, شاپیفای/والت, Shopify/اسرار, Shopify/زیرساخت, Shopify/.githubو بسیاری موارد دیگر - در کنار یک سازمان آزمایشی، آرون استک بارنزکه به نظر میرسد اپراتور آن را کنترل میکند و به عنوان هدف نوشتن از آن استفاده میکند.
نسل ۴ (SC4): رمزگذاری شده و دروازهدار
جدیدترین نوعِ مخصوص توسعهدهندگان، دو لایهی گریز علاوه بر کرم SC3 اضافه میکند.
اول اینکه، بار داده دیگر به صورت متن ساده ارسال نمیشود. منطق واقعی در یک حباب رمزگذاری شده با AES-256-CBC قرار دارد. lib/.perf.dat، با IV در شانزده بایت اول خود. لودر در index.js کلید رمزگشایی را از قطعات رشتهای به هم پیوسته بازسازی میکند، blob را رمزگشایی میکند و آن را با ... اجرا میکند. تابع جدید ()حتی نام ماژولها هم برای جلوگیری از اسکنرهای استاتیک جدا شده است - نیاز('کریپت' + 'o'), نیاز('f' + 's').
دوم، میزبان-دروازهدار است. یک نوع آن فقط زمانی رمزگشایی و اجرا میشود که نام میزبان ()os برابر است دوباکس or اوبونتو-fc-uvm (پیشفرض Firecracker microVM) یا شامل زیررشته است دوباکسدروازه دیگری به روی حضور یک .جولز/ دایرکتوری کاری:
به عبارت دیگر، محموله SC4 به گونهای طراحی شده است که روی لپتاپ یک توسعهدهنده معمولی غیرفعال بماند و فقط درون عامل هوش مصنوعی خودکار فعال شود. محیط های sandbox اپراتور در واقع میخواهد مصالحه کند.
روشن کردن آزمایشگاه: نوع تحلیل-زیرساخت
جدیدترین بسته در این کمپین، تابع کمکی ts-enum، به هیچ وجه به توسعهدهندگان یا Shopify حمله نمیکند. postinstall.sh با دروازهای باز میشود که بازی را لو میدهد:
این اسکریپت هیچ کاری انجام نمیدهد مگر اینکه یک متغیر محیطی مخصوص پلتفرم تحلیل بدافزار تنظیم شده باشد. وقتی این متغیر تنظیم شود، بدافزار میداند که درون یک محیط آزمایشی (sandbox) که برای بررسی و شناسایی بستههایی دقیقاً مانند این وجود دارد، در حال اجرا است - و حمله متقابل انجام میدهد.
ابتدا توکن OAuth حساب سرویس GCP را از سرور ابرداده نمونه دریافت کرده و آن را استخراج میکند. سپس، با استفاده از آن توکن، ... را جارو میکند. صفحه کنترل Kubernetes قابل دسترسی در kubernetes.default.svc:
- ClusterRoleBindings، ClusterRoles و گرهها را فهرست میکند؛
- پادها، رازها و نقشههای پیکربندی را در سراسر [سیستم/شبکه/...] بررسی میکند. سیستم کوبه, به طور پیش فرض, کوبه-عمومی, اجاره گره کوبهو فضای نام تحلیل؛
- فراخوانیهای SelfSubjectAccessReview را برای مشخص کردن دقیق کارهایی که هویت دزدیده شده مجاز به انجام آنهاست، صادر میکند.
در نهایت، نامهای سطلهای ذخیرهسازی ابری گوگل که از یک شناسه پروژه GCP کدگذاری شده ساخته شدهاند را با روش جستجوی فراگیر (brute-force) مورد جستجو قرار میدهد.امضاکننده-نادر-۴۳۷۶۰۳-p۹) و شماره پروژه، حدس زدن ترکیباتی مانند *-ساختها, *-مصنوعات، و چند مالیزیس- پیشوندها (نتایج مالیز, بستههای مالیز, اسکنهای مالیزیس). هر کد و بدنه پاسخ ثبت شده و به همان آدرس POST میشود. ژول-کلکسیون نقطه پایانی
این مورد نادری از یک پیلود زنجیره تأمین است که بهطور خاص برای حمله به زیرساختهای خود مدافعان ساخته شده است. داستان پوششی در کل کمپین - بخشهایی از آن که در داخل پیلودها به عنوان نظراتی ظاهر میشوند که رفتار را به عنوان یک «PoC تحقیقات امنیتی ... نوشتن متقابل مخزن از طریق توکن پروکسی گیت با دامنه وسیع» قالببندی میکنند - همان توجیه خود است، چه هدف زمان اجرا یک مونوریپو Shopify باشد و چه سرور فراداده خوشه تجزیه و تحلیل.
جدول زمانی و مهاجرت محدوده
JulesJacker یک بدافزار یکباره نیست. این یک عملیات پایدار است که با تغییر نام خود، از حذف رجیستری جان سالم به در برد.
| چه زمانی | واقعه |
|---|---|
| اواسط آوریل ۲۰۲۳ | اولین بستهها تحت محدودهی ناشر اصلی ظاهر میشوند: نمای TS-utility، محیط و استخراج git-config. |
| اوایل ماه مه 2026 | نسخه شناسایی Hypervisor و Kernel-Escape منتشر شد. |
| اواسط تا اواخر مه ۲۰۲۶ | کرم نوشتن SC3 cross-repo در کنار بارهای دادهای که Shopify را هدف قرار میدهند، ظاهر میشود. google-labs-jules[bot] جعل هویت. SC4 لودرهای رمزگذاری شده با AES و میزبان-دروازهدار را معرفی میکند. |
| اواخر مه ۲۰۲۵ | npm محدودهی ناشر اصلی را حذف میکند؛ نام بستهها به متغیرهای خالیِ دارای امنیت تبدیل میشوند. |
| همان هفته | اپراتور به یک محدودهی تقریباً یکسان مهاجرت میکند و کرم را، از جمله نوع زیرساخت-تحلیل، دوباره منتشر میکند. |
مهاجرت بخشی است که مدافعان باید با آن کنار بیایند. از کار انداختن اولین اسکوپ، کمپین را پایان نداد یا حتی آن را کند نکرد. اپراتور قبلاً یک اسکوپ موازی را که نامش با نام اصلی تنها یک کاراکتر متفاوت است، راهاندازی کرده بود و در همان هفته به انتشار ادامه داد. تا زمان نگارش این مطلب، اسکوپ جدید ابزارهای ts-form (نسخههای ۱.۰.۰ تا ۱.۱.۰)، ts-project-lint (1.0.0 و 1.1.0) و نسخه مستقل تابع کمکی ts-enum (1.0.0) قابل نصب باقی میماند.
شاخص های سازش
تمام شاخصهای زیر در برابر منبع بستهبندی تأیید شدند.
| نوع | شاخص | یادداشت |
|---|---|---|
| شبکه (C2) | aaronstack[.]com/jules-collect | یک نقطه پایانی جمعآوری در هر نسل؛ دادههای تلهمتری JSON و تکههای tarball مخزن base64-gzip را دریافت میکند. |
| شبکه (پروکسی SSRF) | http://git@192.168.0.1:8080 | نمای جلویی یک توکن پروکسی گیت با دامنهی دسترسی گسترده که برای دسترسی به مخازن سازمان هدف استفاده میشود. |
| شبکه (ابری) | 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 در ۱۶ بایت اول ذخیره شده و کلید به صورت پویا در آن بازسازی میشود 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. |




