کرم سرقت‌کنندهٔ اعتبار که نخستین‌بار در keyv@6.0.0 مشاهده شد، در تاریخ 4 اوت 2026 به صدها بسته در رجیستری npm سرایت کرد و محتوای مخرب را از طریق اسکریپت‌های lifecycle منتشر ساخت.

روش نفوذ و نحوهٔ عملکرد

نسخهٔ مخرب keyv@6.0.0 یک فرمان preinstall (فایل node setup.mjs) اضافه کرد و دو فایل setup.mjs و Math_Symbol.js را به بسته افزود؛ کد کتابخانهٔ اصلی دست‌نخورده باقی ماند. بدافزار ابتدا وجود runtime بن (Bun) را بررسی می‌کند و در صورت نیاز Bun نسخهٔ 1.3.13 را از صفحهٔ رسمی GitHub دانلود می‌نماید. سپس اجرای اصلی را به یک باندلِ کامپایل‌شدهٔ تقریباً 727680 بایتی واگذار می‌کند.

قابلیت‌های payload

تحلیل‌های اولیهٔ شرکت‌هایی مانند SafeDep نشان می‌دهد payload قابلیت جمع‌آوری اطلاعات GitHub، npm، سرویس‌های ابری، Vault، Kubernetes، پایگاه‌داده‌ها و کلیدهای خصوصی را دارد. این بدافزار حافظهٔ رانرهای GitHub Actions را می‌خواند، یک نگهبانِ لغوِ توکن نصب می‌کند و ابزارهای انتشار npm را در اختیار مهاجم قرار می‌دهد تا با هویت‌های سرقت‌شده بسته‌ها را تغییر و دوباره منتشر کند.

گسترش کمپین و آمار نسخه‌های آلوده

SafeDep وقوع 353 نسخهٔ مسموم در 79 نام بسته را تایید کرد؛ نظارت آن‌ها ردپای وسیع‌تری شامل 442 نسخه در 353 نام را نشان داد و شرکت دیگری به‌نام Aikido حداقل 868 بسته در 1,381 نسخه گزارش کرد. تغییر سریع تگ‌های رجیستری مانع از تهیهٔ فهرستِ ثابت و کامل آثار کمپین شد؛ بنابراین تعیین مواجهه باید بر اساس نام بستهٔ دقیق، نسخهٔ حل‌شده و فایل‌های lock انجام شود، نه صرفاً تکیه بر تگ‌های جاری.

مسیرهای اجرای اضافی: هوک‌های Claude Code و VS Code

مخزن keyv علاوه بر مسیر نصبِ پیش‌فرض، دو مسیر اجرای محلی دیگر نیز دارد: فایل .claude/settings.json یک هوک به نام SessionStart دارد که .vscode/setup.mjs را فراخوانی می‌کند، و .vscode/tasks.json یک تسک «راه‌اندازی محیط» با runOn: folderOpen تعریف کرده که .claude/setup.mjs را اجرا می‌کند. این ترکیب امکان اجرای payload حتی از مخزنی که بازبینی شده را فراهم می‌سازد، اگرچه این فایل‌ها به‌صورت پیش‌فرض در همهٔ محیط‌ها اجرا نمی‌شوند؛ VS Code تسک‌های خودکار را در ورک‌اسپیس‌های غیرقابل‌اعتماد مسدود می‌کند و Claude Code از مکانیزم اعتمادِ ورک‌اسپیس استفاده می‌نماید.

کدهای setup.mjs و ساختار هوک‌های VS Code و Claude Code

سیستم‌های در معرض خطر و نحوهٔ واکنش

هر ایستگاه کاری یا رانری که نسخهٔ آلوده را نصب یا اجرا کرده باشد باید به‌عنوان دچار افشای اعتبار در نظر گرفته شود. تحلیلگران هشدار می‌دهند نگهبانِ لغوِ توکن (token-revocation watcher) را پیش از چرخش توکن‌ها و کلیدها حذف کنید، زیرا چرخش زودهنگام ممکن است هندلری محلی که مهاجم نصب کرده را فعال کند.

اقدامات فوری توصیه‌شده

  • تشخیص دقیق مواجهه: از نام بستهٔ دقیق و نسخهٔ حل‌شده در فایل‌های lock برای تعیین مواجهه استفاده کنید؛ تکیه بر تگ latest قابل‌اعتماد نیست.
  • حذف نگهبان: ابتدا مکانیسمِ نگهبانِ لغو توکن را حذف یا غیرفعال کنید تا چرخش توکن اجراکنندهٔ محلی مهاجم را فعال نکند.
  • چرخش و بازپیکربندی: پس از حذف نگهبان، توکن‌ها و کلیدهای افشا شده را بازنگری و چرخش دهید و دسترسی‌های نامعتبر را فوراً لغو نمایید.
  • بررسی CI و رانرها: لاگ‌ها و حافظهٔ رانرها را بررسی کنید؛ هر رانر یا ماشین توسعه که نسخهٔ آلوده را اجرا کرده فرضاً دچار افشا شده است.
  • به‌روزرسانی کلاینت‌ها: npm نسخهٔ 12 اجرای اسکریپت‌های lifecycle تاییدنشده را به‌صورت پیش‌فرض مسدود می‌کند؛ هرچه سریع‌تر به کلاینت‌های جدیدتر مهاجرت کنید و مسیرهای نصب جایگزین را نیز کنترل کنید.

پیچیدگی شناسایی و محدودیت‌های فهرست‌سیاه

بازگردانی زودهنگام بسته‌ها و تغییر تگ‌ها، فهرست‌سیاه‌سازی سطح namespace را پرخطر می‌کند؛ هم احتمال علامت‌گذاری انتشارهای سالم وجود دارد و هم ممکن است نسخه‌های مسموم از دست بروند. تعیین مواجهه به تحلیل نسخه‌به‌نسخه و بررسی اجرای اسکریپت‌های lifecycle در محیط مقصد نیاز دارد. آمارهای SafeDep و Aikido نشان‌دهندهٔ شمار آثار مخرب کشف‌شده‌اند، نه لزوماً تعداد سیستم‌های قربانی.

اعتبار ساخت و محدودیت گواهی‌های SLSA / OIDC

نسخهٔ مسموم keyv از گردشِ کار مشروع GitHub Actions عبور کرده بود و سوابق OIDC و گواهی‌های SLSA را حمل می‌کرد. این گواهی‌ها فرایند ساخت را تصدیق می‌کنند اما به‌تنهایی نشان‌دهندهٔ ایمنی محتوای بسته نیستند؛ مهاجم توانسته بود از گردشِ کار مشروع برای توزیع بسته‌های مخرب سوءاستفاده کند.

جمع‌بندی عملیاتی

کمپین نمونه‌ای خطرناک از آسیب‌پذیری زنجیرهٔ تأمین نرم‌افزار است: مهاجم با استفاده از اسکریپت‌های lifecycle و هوک‌های ویرایشی، چندین مسیر اجرای payload فراهم کرده و سپس با هویت‌های انتشار سرقت‌شده گسترش داده است. سازمان‌ها باید تشخیص، قرنطینه و بازیابی را حول بسته‌ها، فایل‌های lock و رانرهای CI متمرکز کنند و سیاست‌های اجرای اسکریپت در محیط‌های توسعه و CI را بازبینی نمایند.

شاخص‌های سازش (IOCs)

  • نام فایل‌های اضافی در بسته: setup.mjs و Math_Symbol.js
  • فرمان preinstall اضافه‌شده: node setup.mjs
  • وجود فایل‌های هوک محلی در مخزن: .claude/settings.json, .vscode/setup.mjs, .vscode/tasks.json, .claude/setup.mjs
  • بارگذاری Bun نسخهٔ 1.3.13 و باندلِ باینری ~727680 بایت

برای مطالعهٔ مفاهیم مرتبط با این حمله می‌توانید به منابع مرجع مانند OpenID Connect و SLSA مراجعه کنید.