بدافزار Shai-Hulud: حمله زنجیره تأمین به اکوسیستم TanStack
خلاصهٔ کاملتر
حدود سه ساعت پیش، یه تاپیک در Hacker News توجه محققان امنیتی رو به یه issue در GitHub جلب کرد که نشون میداد یه پکیج محبوب npm احتمالاً آلوده شده. بررسیها نشون داد که این یه واریانت جدید از Shai-Hulud هست — یه کرم خودگسترشپذیر روی npm که اولین بار در ۲۰۲۵ سروصدا کرد. این بار هدف مشخصی داشت: اکوسیستم TanStack.
بین ساعت ۱۹:۲۰ تا ۱۹:۲۶ UTC روز ۱۱ مه ۲۰۲۶، مهاجم موفق شد ۸۴ نسخه مخرب از ۴۲ پکیج @tanstack رو منتشر کنه. پکیجهایی مثل @tanstack/router-core، @tanstack/react-start، @tanstack/vue-router، @tanstack/solid-router-devtools و دهها پکیج دیگه در این حمله آلوده شدن. خوشبختانه یه محقق خارجی به اسم ashishkurmi از شرکت StepSecurity طی ۲۰ دقیقه این رو شناسایی کرد و نسخههای آلوده deprecated شدن.
مهاجم از طریق دزدیدن توکن npm وارد نشد. روش کار ترکیبی بود از سه تکنیک: Pwn Request (سوءاستفاده از pull_request_target در GitHub Actions)، مسمومسازی کش Actions در مرز بین فورک و ریپوی اصلی، و خواندن توکن OIDC از حافظه فرآیند Runner.Worker از طریق /proc//mem روی لینوکس. یعنی workflow انتشار npm دستکاری مستقیم نشد؛ مهاجم سوار توکنی شد که workflow خودش بهصورت قانونی گرفته بود.
وقتی یه پکیج آلوده نصب میشه، بدافزار مراحل زیر رو طی میکنه: اول اگه Bun runtime روی سیستم نباشه دانلودش میکنه (برای دور زدن برخی قوانین EDR)، بعد شروع میکنه به جمعآوری اطلاعات حساس — متغیرهای محیطی، فایل .npmrc، توکنهای GitHub، کلیدهای SSH خصوصی، کانفیگهای AWS/GCP/Kubernetes/Vault، و حتی حافظه فرآیند runner روی سیستمهای لینوکسی.
اطلاعات دزدیدهشده با یه طرح رمزنگاری ترکیبی محافظت میشن: دادهها با AES-256-GCM رمز میشن و کلید رمزنگاری با RSA-OAEP-SHA-256 با کلید عمومی مهاجم رمزگذاری میشه. بعد این dumps رمزشده بهعنوان ریپوهای عمومی GitHub زیر اکانت قربانی منتشر میشن — با اسمهایی مثل tleilaxu-lasgun-263.
بدافزار برای ماندگاری هم تمهیداتی داره: یه hook در Claude Code، یه tasks.json در VS Code با runOn: folderOpen، یه workflow جعلی CodeQL در GitHub Actions که ${{ toJSON(secrets) }} رو به api.masscan.cloud/v2/upload میفرسته، و یه سرویس gh-token-monitor (بهعنوان launchd یا systemd) که اگه توکنها revoke بشن، rm -rf ~/ رو اجرا میکنه. رشته IfYouRevokeThisTokenItWillWipeTheComputerOfTheOwner هم دقیقاً به همین منظور طراحی شده — تا قربانی از revoke کردن توکن بترسه.
خودگسترشپذیری مهمترین ویژگی این کرمه: بدافزار همه پکیجهایی که قربانی روی npm منتشر میکنه رو از طریق جستجوی maintainer: پیدا میکنه و اونا رو با همین payload آلوده دوباره منتشر میکنه. یعنی حتی اگه TanStack خودش آسیب نبینه، هر توسعهدهندهای که در اون بازه زمانی پکیج آلوده نصب کرده، ممکنه ناخواسته پکیجهای خودش رو هم آلوده کرده باشه.
نکات کلیدی:
- اگه بین ساعت ۱۹:۲۰ تا ~۱۹:۴۶ UTC روز ۱۱ مه ۲۰۲۶ هر پکیج @tanstack رو نصب کردی، فوری کردنشیالهای AWS، GCP، Kubernetes، Vault، GitHub، npm و SSH رو rotate کن
node_modules، lockfile و npm cache رو پاک کن و از نسخههای سالم build بگیر- ماشینهای CI که در این بازه
npm installزدن رو compromised فرض کن - مهاجم از
pull_request_target+ مسمومسازی کش وارد شد، نه از دزدیدن توکن — این الگو داره تکرار میشه و پروژههای open-source باید تنظیمات Actions رو بازبینی کنن




