۳۱۷ پکیج npm در یک حمله ۲۲ دقیقهای آلوده شدند
خلاصهٔ کاملتر
حساب npm با نام atool در تاریخ ۱۹ مه ۲۰۲۶ در اختیار یک مهاجم قرار گرفت. این مهاجم در دو موج کوتاه، ۶۳۷ نسخه مخرب را روی ۳۱۷ پکیج پرمصرف منتشر کرد. پکیجهایی مثل size-sensor (۴.۲ میلیون دانلود ماهانه)، echarts-for-react (۳.۸ میلیون)، @antv/scale (۲.۲ میلیون)، و timeago.js (۱.۱۵ میلیون) در این حمله آلوده شدند. جالب اینجاست که مهاجم تگ latest را جابهجا نکرد؛ ولی این کار هیچ حفاظتی ایجاد نمیکنه، چون npm بالاترین نسخهای رو که با رنج semver مطابقت داره انتخاب میکنه نه لزوماً latest رو.
ابزار پیلود مخرب با نام Mini Shai-Hulud شناخته میشه و همونیه که سه هفته قبل در حمله به SAP استفاده شده بود. این فایل یک اسکریپت ۴۹۸ کیلوبایتی مبهمسازیشده برای Bun هست که از دو لایه رمزنگاری استفاده میکنه. هر نسخه آلوده دو تغییر در package.json اعمال میکنه: یک preinstall هوک که bun run index.js رو اجرا میکنه، و یک optionalDependencies که به یک کامیت جعلی در مخزن antvis/G2 روی GitHub اشاره داره. این کامیتهای جعلی (orphan commits با نویسنده جعلی) یک کپی دوم از پیلود رو بدون نیاز به دسترسی نوشتن به مخزن، هاست میکنن.
پیلود اطلاعات حساس بسیار گستردهای رو جمعآوری میکنه. زنجیره کامل اعتبارنامههای AWS (متغیرهای محیطی، فایلهای کانفیگ، EC2 IMDS، ECS container metadata، و Secrets Manager)، توکنهای GitHub، کلیدهای SSH، توکنهای npm، توکنهای Kubernetes، HashiCorp Vault، و حتی محتوای مدیران پسورد محلی مثل 1Password، Bitwarden، pass و gopass همه هدف این پیلود هستن. اسکنر فایلهای حساس روی مسیرهایی مثل ~/.ssh، ~/.aws/credentials، ~/.npmrc و ~/.docker/config.json رو هم بررسی میکنه.
دادههای دزدیدهشده از دو کانال موازی خارج میشن. اول از طریق Git Data API گیتهاب که دادهها رو به عنوان کامیت در مخازن عمومی با نامهای الهامگرفته از دنیای Dune (مثل harkonnen-melange-742 یا fremen-sandworm-315) ذخیره میکنه. دوم از طریق درخواستهای HTTPS رمزنگاریشده با RSA+AES به آدرسی که خودش رو به عنوان یک OpenTelemetry collector جا میزنه. این ترفند باعث میشه ترافیک خروجی بین لاگهای شبکه گم بشه.
در محیطهای CI/CD، پیلود قابلیتهای بیشتری داره. با استفاده از OIDC Token Exchange در GitHub Actions، توکن publish مربوط به پایپلاین رو به دست میاره. یک workflow مخرب با نام Run Copilot رو به .github/workflows/codeql.yml تزریق میکنه که toJSON(secrets) رو dump میکنه، بعد آرتیفکت رو دانلود کرده و تمام شواهد رو پاک میکنه. همچنین از Sigstore (Fulcio + Rekor) برای امضای آرتیفکتها با هویت دزدیدهشده استفاده میکنه.
پیلود سه مکانیزم پایداری (persistence) هم داره. اول، هوکهای AI agent: با تزریق SessionStart به .claude/settings.json باعث میشه هر بار که Claude Code یا Codex باز میشه، پیلود دوباره اجرا بشه. برای VS Code هم یک tasks.json با "runOn": "folderOpen" تزریق میکنه. دوم، یک سرویس systemd (یا LaunchAgent در macOS) با نام kitty-monitor نصب میکنه که هر ساعت GitHub رو برای دستوراتی با کلیدواژه firedalazer جستجو میکنه و کدهای Python دریافتی رو اجرا میکنه. سوم، اگه Docker socket در دسترس باشه، تلاش میکنه از کانتینر فرار کنه.
نکات کلیدی:
- پکیجهایی مثل echarts-for-react، size-sensor و صدها پکیج @antv آلوده شدند
- هر پروژهای که از semver range (مثل ^3.0.6) استفاده میکنه در معرض خطر است
- پیلود اطلاعات AWS، GitHub، SSH، npm، Vault، Kubernetes و مدیران پسورد رو سرقت میکنه
- دو کانال exfiltration: مخازن GitHub با نام Dune-themed و endpoint جعلی OpenTelemetry
- در CI، OIDC token exchange برای گرفتن دسترسی publish و امضای Sigstore استفاده میشه
- هوکهای Claude Code، Codex و VS Code برای اجرای مجدد خودکار پیلود تزریق میشن
- بکدور C2 از طریق GitHub commit search با کلیدواژه firedalazer فرمان میگیره
- ابزار متنباز Package Manager Guard (pmg) میتونه با قابلیت dependency cooldown جلوی نسخههای تازهمنتشرشده رو بگیره




