اگر همین حالا در حال مدیریت پروژههای جاوااسکریپت هستید، احتمالاً بدون آنکه بدانید بخشی از یک زنجیره آلوده شدهاید. یک کرم مخرب در ۴ اوت ۲۰۲۶، ۸۶۸ بسته نرمافزاری در ۱۳۸۱ نسخه مختلف را به دام انداخت تا اسرار زیرساختی شرکتها را بدزدد.
به نقل از گزارش Aikido، این حمله زمانی آغاز شد که هکرها حساب گیتهاب توسعهدهنده کتابخانه keyv — یک ابزار حیاتی برای ذخیرهسازی کلید-مقدار — را تصاحب کردند. آنها بدافزاری را در خانوادهای از ابزارهای کشینگ تزریق کردند که بسیاری از برنامهنویسان برای افزایش سرعت برنامههای خود از آنها استفاده میکنند.
این اتفاق درست مثل یک بیماری واگیردار دیجیتال است؛ تصور کنید یک کتابخانه مورد اعتماد آلوده شود و هر پروژهای که آن را نصب میکند، ناخودآگاه درِ پشتی (Backdoor) برای هکرها باز کند. بسیاری از توسعهدهندگان برای بهبود عملکرد از این ابزارها استفاده میکنند، بدون اینکه بدانند اینها در واقع وابستگیهای وابستگیهای آنها (Dependencies of dependencies) هستند. همانطور که در تحلیلهای پیشین ما درباره امنیت زنجیره تأمین نرمافزار اشاره کردیم، این نقاط کور خطرناکترین بخشهای زنجیره هستند.
ابعاد و مقیاس فاجعه
مقیاس این نفوذ تکاندهنده است. طبق گزارشهای منتشر شده، بستههای آلوده در زمان گزارشدهی، در مجموع بیش از ۲ میلیارد نصب ماهانه داشتند. حمله اولیه خانوادهای از ابزارهای کاربردی را هدف قرار داد که شامل موارد زیر بود:
- keyv: ۶۱۹ میلیون دانلود ماهانه
- flat-cache: ۵۶۵ میلیون دانلود ماهانه
- file-entry-cache: ۵۵۷ میلیون دانلود ماهانه
- cacheable-request: ۱۳۳ میلیون دانلود ماهانه
- cacheable: ۲۹ میلیون دانلود ماهانه
- @cacheable/utils: ۳۴ میلیون دانلود ماهانه
- @cacheable/memory: ۲۸ میلیون دانلود ماهانه
- cache-manager: ۱۶ میلیون دانلود ماهانه
- @cacheable/node-cache: ۵.۹ میلیون دانلود ماهانه
- ecto: ۴ هزار دانلود ماهانه
این کرم از آن پس به سایر توسعهدهندگان و سازمانهای بزرگ سرایت کرده است. نسخههای آلوده شناسایی شده شامل @deliveroo/reevent 1.0.1، @or-sdk/invitations 1.4.9، @picsart/ai-sdk 3.32.2، @qlik/embed-runtime 1.6.4 و picasso.js 2.11.6 هستند.
مکانیزم عفونت
مهاجمان فایلهای مخرب را مستقیماً در شاخه اصلی (Main Branch) قرار دادند و نسخههای جدید را با امضای GitHub Actions منتشر کردند. این یعنی نسخههای مسموم با اعتبار کامل و دارای منشأ (Provenance) معتبر در npm منتشر شدند. هر بسته آلوده دو فایل جدید به نامهای setup.mjs و Math_Symbol.js دریافت کرد. یک ورودی با عنوان "preinstall": "node setup.mjs" در فایل package.json تضمین میکند که فایل setup.mjs به صورت خودکار در هنگام اجرای دستور npm install اجرا شود.

این دراپِر (Dropper) به شدت مبهمسازی (Obfuscated) شده است. تنها وظیفه آن دانلود بیصدای محیط اجرای جاوااسکریپت Bun (نسخه v1.3.13) از گیتهاب است تا بتواند محموله اصلی یعنی Math_Symbol.js را اجرا کند. این فایل ۷۲۸ کیلوبایتی که مبهمسازی شده است، مانند یک کرم عمل میکند؛ ابتدا اسرار را جمعآوری کرده و سپس تلاش میکند بستههای دیگر متعلق به قربانی را آلوده کند. دادههای سرقتی در نهایت به یک مخزن عمومی در گیتهاب با نام «Shai-Hulud: Here We Go Again» ارسال میشوند.
جزئیات اطلاعات هدفگذاری شده
این بدافزار مجموعهای جامع از استخراجکنندهها را برای شکار گرانبهاترین دسترسیها پیادهسازی کرده است:
- زیرساخت ابری: سرقت اعتبارنامههای AWS از مسیرهای
~/.aws/credentialsو~/.aws/configو متغیرهای محیطی. این کرم سرویس Metadata در EC2 را هدف قرار میدهد (ابتدا IMDSv2 و سپس IMDSv1) و نقطه پایانی متادیتای کانتینر ECS را میکاود. همچنین دستورsecretsmanager:ListSecretsرا در چندین منطقه (Region) فراخوانی میکند تا تمام اسرار ذخیرهشده را استخراج کند. این نوع نفوذ به زیرساختهای ابری یادآور حملات پیچیدهای است که در آن عوامل هوشمند توانستند به زیرساختهای Hugging Face نفوذ کنند و دسترسیهای حساس را هدف قرار دهند. - مدیریت عملیات (DevOps): خواندن توکنهای حسابهای خدماتی Kubernetes، گواهینامههای CA و فضای نامها (Namespaces) از مسیر
/var/run/secrets/kubernetes.io/serviceaccount/برای پرسوجو از API کوبرنتیز. همچنین توکنهای HashiCorp Vault را از طریق ۶ منبع اولویتدار، از جملهVAULT_TOKENو مسیرهای Runner در GitHub Actions هدف قرار داده و در نهایت تمام ذخیرههای KV را از طریق/v1/sys/mountsفهرست میکند. این رویکرد برای دور زدن محدودیتها، شباهت زیادی به تکنیکهای سوءاستفاده از حفرههای Sandbox برای نفوذ به محیطهای تولید دارد. - توکنهای پلتفرم: شکار توکنهای احرازی npm از فایل
~/.npmrcو اعتبارسنجی زنده آنها در برابرregistry.npmjs[.]org/-/whoami. هدفگیری توکنهای کلاسیک گیتهاب (ghp_...)، توکنهای OAuth (gho_...)، توکنهای سرور به سرور اپلیکیشن (ghs_...) و توکنهای JWT OIDC. در محیطهای GitHub Actions، بدافزار حافظه پردازش را برای استخراج ذخیره اسرار، بهویژهACTIONS_ID_TOKEN_REQUEST_TOKENوACTIONS_ID_TOKEN_REQUEST_URLمیکاود. - APIهای شخص ثالث: جستوجو برای کلیدهای Stripe (هر دو پیشوند
sk_وpk_) و توکنهای Slack (xox[baprs]-...) در سراسر سیستم فایل.

علاوه بر توکنهای خاص، این کرم یک اسکنر آگاه از پلتفرم (تفاوت macOS و Linux) را با استفاده از حدود ۲۰۰ الگوی glob اجرا میکند. این اسکنر فایلهای .env، .env.* و .envrc، کلیدهای SSH (id_rsa و id_ed25519)، فایلهای وضعیت Terraform و پایگاههای داده KeePass (*.kdbx) را هدف قرار میدهد. همچنین فایلهای پیکربندی IDE مانند .vscode/tasks.json و .claude/settings.json را بررسی میکند. برای حفظ سرعت و پنهان ماندن، از ۶۴ خوانش همزمان استفاده کرده و فایلهای بزرگتر از ۵ مگابایت را نادیده میگیرد.
این حمله نشاندهنده شکست بحرانی در مدل اعتماد مدیریت بستههای مدرن است. با نفوذ به تنها یک توسعهدهنده، مهاجمان به ۲ میلیارد نصب ماهانه دسترسی پیدا کردند. قابلیت «کرم» به این معناست که شعاع تخریب به صورت نمایی گسترش مییابد، زیرا توسعهدهندگان ناخودآگاه بدافزار را به پروژههای خود منتقل میکنند.
برای کسبوکارها، این یک یادآوری است که «منشأ» (Provenance) و نسخههای امضا شده، در صورتی که خودِ حساب کاربری تصاحب شده باشد، تضمینی برای امنیت نیستند. سرعت انتشار نشان میدهد که بهروزرسانیهای خودکار وابستگیها در زمان یک حمله فعال، میتواند به یک نقطه ضعف تبدیل شود.
گام بعدی شما
- فوراً درخت وابستگیهای (Dependency Tree) پروژههای خود را برای نسخههای ذکر شده بررسی کنید.
- تمام توکنهای ابری (AWS/Azure/GCP) و توکنهای دسترسی گیتهاب را که احتمالاً در محیطهای آلوده استفاده شدهاند، تغییر دهید (Rotate).
- از ابزارهایی مانند Aikido Safe Chain برای بررسی بستهها پیش از نصب در محیط محلی استفاده کنید تا آنها را با دادههای تهدیدات تطبیق دهد.
اما داستان خطرناکتر این است که چگونه امضاهای دیجیتال در گیتهاب اکنون به ابزاری برای توزیع بدافزار تبدیل شدهاند — به تحلیل ما درباره امنیت GitHub Actions مراجعه کنید.




گفتگو