
مدقق IOC لهجوم سلسلة التوريد TanStack/Mini Shai-Hulud npm (CVE-2026-45321)
curl -fsSL https://raw.githubusercontent.com/nkopylov/tanscript-exploit-check/main/check-tanstack-exploit.sh | bash
أو استنسخ وشغّل محليًا:
git clone https://github.com/nkopylov/tanscript-exploit-check.git
cd tanscript-exploit-check
./check-tanstack-exploit.sh [project_dir ...]
يغطي هذا المدقق موجتين من حملة هجوم سلسلة التوريد Mini Shai-Hulud بواسطة TeamPCP:
في 11 مايو 2026 (19:20-19:26 UTC)، نشر مهاجم 84 نسخة ضارة عبر 42 حزمة @tanstack/* من npm في نافذة مدتها 6 دقائق. أصاب الهجوم أيضًا حزمًا من Mistral AI وUiPath وOpenSearch وغيرها — أكثر من 170 حزمة إجمالاً عبر npm وPyPI.
لم تُسرق بيانات اعتماد أي من المطورين. استغل المهاجم سلسلة الثقة لـ CI/CD نفسها عبر هجوم من 3 مراحل:
pull_request_target — فتح fork مؤقت على GitHub طلب سحب (PR) شغّل كود المهاجم في سياق الأمان للمستودع الأساسيفي 19 مايو 2026 (01:39-02:06 UTC)، نشر حساب npm المخترق atool ([email protected]) 637 نسخة ضارة عبر 314 حزمة في موجتين آليتين. تشمل الأهداف عالية التأثير:
size-sensor (4.2 مليون تحميل/شهر)echarts-for-react (3.8 مليون تحميل/شهر)@antv/scale (2.2 مليون تحميل/شهر)timeago.js (1.15 مليون تحميل/شهر)بالإضافة إلى أكثر من 310 حزمة إضافية من @antv/* وغيرها
استخدمت هذه الموجة حمولة مبنية على Bun (ملف index.js بحجم 498 كيلوبايت) تم تفعيلها عبر "preinstall": "bun run index.js"، مع حمولة من المرحلة الثانية مخبأة في commits مزيفة تم دفعها إلى مستودع antvis/G2 على GitHub عبر استغلال مشاركة كائن fork.
تستخدم كلتا الموجتين نفس عائلة أدوات "Mini Shai-Hulud":
gh-token-monitor (الموجة الأولى) و kitty-monitor (الموجة الثانية) عبر LaunchAgent/systemd؛ خطافات في .claude/settings.json و .vscode/tasks.jsontoJSON(secrets)، تبادل رمز OIDC لـ npmrm -rf ~/ إذا تم إلغاء رمز GitHub أثناء نشاط الخفيةfiredalazer، أوامر موقعة بـ RSA-PSSفقط @tanstack/router* و @tanstack/start* تأثرت. غير متأثرة: @tanstack/query*, @tanstack/table*, @tanstack/form*, @tanstack/virtual*, @tanstack/store.
انظر التنبيه الكامل لجميع الحزم الـ42.
جميع الحزم التي نشرها مستخدم npm atool ([email protected]) تلقت إصدارات ضارة في 19 مايو 2026. تشمل الحزم عالية التأثير:
| الحزمة | التنزيلات الشهرية |
|---|---|
size-sensor | 4.2M |
echarts-for-react | 3.8M |
@antv/scale | 2.2M |
بالإضافة إلى أكثر من 310 حزمة بشكل أساسي في نطاق @antv/* (@antv/g2, @antv/g6, @antv/l7, @antv/s2, @antv/x6, @antv/f2, إلخ)، و ai-figure، و timeago-react، و jest-canvas-mock، و jest-date-mock، وغيرها.
انظر تقرير SafeDep للقائمة الكاملة.
هام جدًا: قم بتعطيل مفتاح الموتى قبل إلغاء أي رموز. يقوم البرنامج الضار بمسح
$HOMEإذا تم إلغاء الرموز أثناء نشاط الخفية.
gh-token-monitor و kitty-monitor) وإزالة خدمات LaunchAgent و systemd.claude/router_runtime.js, .vscode/setup.mjs, ~/.local/share/kitty/cat.py, /var/tmp/.gh_update_state، إلخ.)node_modules وملفات lock، وأعد التثبيت باستخدام --ignore-scriptsapi.masscan.cloud, filev2.getsession.org, git-tanstack.com, t.m-kosche.com)انسخ والصق هذه الإرشادات في عميل الترميز بالذكاء الاصطناعي الخاص بك (Claude Code, Cursor, Cline/OpenClaw, Windsurf, Hermes، إلخ) لتعزيز مشروعك ضد هجمات سلسلة التوريد مثل هذا الهجوم.
عزز تكوين npm لهذا المشروع ضد هجمات سلسلة التوريد. قم بما يلي:
تثبيت الإصدارات الدقيقة: أزل جميع البادئات
^و~من كل اعتماد فيpackage.jsonبحيث لا يسحبnpm installإصدارًا منشورًا حديثًا بصمت.تعطيل سكريبتات ما بعد التثبيت افتراضيًا: أضف
ignore-scripts=trueإلى.npmrc. ثم أضف سكريبت"preinstall"صريحًا فيpackage.jsonيشغّل فقط سكريبتات دورة الحياة المعروفة الآمنة التي يحتاجها هذا المشروع بالفعل (إن وجدت).فرض التثبيت باستخدام ملفات lock فقط في CI: تأكد من أن CI يستخدم
npm ci(وليسnpm install). إذا كان هناك ملف تكوين CI، تحقق من ذلك. وإلا، فذكرها كخطوة يدوية.إضافة التحقق من الإثبات: أضف
npm audit signaturesكخطوة في خط أنابيب CI وكخطاف git قبل الدفع.
دقق وعزز تكوين عميل الترميز بالذكاء الاصطناعي لهذا المشروع ضد هجمات حقن سلسلة التوريد (مثل حملة TanStack/Mini Shai-Hulud التي حقنت خطافات ضارة في
.claude/settings.jsonو.vscode/tasks.json). قم بما يلي:Claude Code (
.claude/):
- راجع
.claude/settings.jsonو.claude/settings.local.jsonبحثًا عن أي إدخالاتhooksتشغّل أوامر شل. قم بالإبلاغ عن أي شيء ينفذ ملفات.jsأو.mjsأو.sh— خاصة من داخل.claude/أو.vscode/أوnode_modules/.- أزل أي خطافات لا يمكنك تتبعها إلى غرض شرعي أنشأه المستخدم.
- أضف قاعدة
.gitignoreلمنع إضافة إلى المستودع (يجب أن يبقى محليًا).
دقق وعزز تكوين GitHub Actions في هذا المستودع ضد هجمات سلسلة التوريد على CI/CD. قم بما يلي:
أزل أو أعد بناء أي مشغلات
pull_request_target— هذه المشغلات تشغّل كود سير العمل في سياق المستودع الأساسي مع الوصول إلى الأسرار، حتى عند تشغيلها بواسطة fork. استبدلها بـpull_request+ سير عمل منفصل بموافقة إذا لزم الأمر.ثبّت جميع إجراءات الطرف الثالث على تجزئات commit كاملة (وليس علامات أو فروع). على سبيل المثال، استبدل
actions/checkout@v4بـactions/checkout@<full-sha>. أضف تعليقًا مع العلامة لسهولة القراءة.طبّق صلاحيات الحد الأدنى على كل سير عمل. أضف كتل
permissions:صريحة. معظم سير العمل تحتاج فقطcontents: read. سير عمل النشر يحتاجid-token: write— ولا شيء آخر.قيّد نطاق ذاكرة التخزين المؤقت: إذا كنت تستخدم
actions/cache، تأكد من أن مفاتيح التخزين المؤقت محددة النطاق بالفرع لمنع التسميم عبر الفروع. أضفrestore-keysبحذر — لا تستعد ذاكرات التخزين المؤقت من فروع غير موثوقة.أضف StepSecurity Harden-Runner كخطوة أولى في كل وظيفة:
step-security/harden-runner@v2مع (أو إذا كنت تعرف نقاط النهاية المسموح بها).
MIT
| # | الفحص | الوصف |
|---|
| 1 | مفتاح الموتى | خفيّات الثبات: gh-token-monitor (الموجة الأولى)، kitty-monitor (الموجة الثانية) |
| 2 | العمليات الضارة | أسماء عمليات المهاجم المعروفة (كلتا الموجتين) |
| 3 | ملفات الحمولة | الملفات الضارة المعروفة بالاسم وتجزئة SHA-256 (4 تجزئات) |
| 4 | خطافات Claude Code | الخطافات المحقونة في .claude/settings.json + إرشادية SessionStart العامة |
| 5 | مهام VS Code | المهام المحقونة في .vscode/tasks.json + إرشادية runOn: folderOpen العامة |
| 6 | GitHub Actions | toJSON(secrets) في أي سير عمل + تحذير pull_request_target |
| 7 | ملفات lock الخاصة بـ npm | إصدارات الحزم المخترقة في ملفات lock |
| 8 | الاعتماديات الاختيارية | @tanstack/setup و @antv/setup الضارة + 4 تجزئات commit مزيفة |
| 9 | اتصالات الشبكة | اتصالات نشطة إلى بنية C2 التحتية (5 نطاقات/عناوين IP) |
| 10 | ذاكرة DNS المؤقتة | حل سابق لنطاقات المهاجم (4 نطاقات) |
| 11 | فروع Git | نمط تسمية فروع المهاجم المستوحى من Dune |
| 12 | سكريبتات دورة الحياة | إرشادية: bun run في preinstall/postinstall (الحزم المثبتة) |
| 13 | C2 بالإسقاط الميت | كلمة firedalazer وعلامات "Shai-Hulud" في تاريخ git |
| 14 | الاعتماديات على GitHub | إرشادية: اعتماديات github: مثبتة على تجزئة commit في optionalDeps |
| الحزمة | الإصدارات الضارة | أول إصدار آمن |
|---|
@tanstack/react-router | 1.169.5, 1.169.8 | 1.169.9 |
@tanstack/router-core | 1.169.5, 1.169.8 | 1.169.9 |
@tanstack/vue-router | 1.169.5, 1.169.8 | 1.169.9 |
@tanstack/solid-router | 1.169.5, 1.169.8 | 1.169.9 |
@tanstack/react-start | 1.167.68, 1.167.71 | 1.167.72 |
@tanstack/router-plugin | 1.167.38, 1.167.41 | 1.167.42 |
timeago.js |
| 1.15M |
إنشاء سكريبت سياسة التحديث: أنشئ scripts/safe-update.sh يقوم بـ:
npm view <pkg> time --json)npm install <pkg>@latest --save-exactلا تغير أي كود تطبيق. فقط قم بتعديل ملفات التكوين و.npmrc وسكريبتات package.json وتكوين CI.
.claude/settings.local.jsonVS Code (.vscode/):
.vscode/tasks.json و .vscode/launch.json بحثًا عن مهام تنفذ سكريبتات أو ملفات ثنائية غير متوقعة.setup.mjs أو router_runtime.js أو أسماء أخرى لا تنتمي لهذا المشروع..vscode/extensions.json بحثًا عن إضافات لا تعرفها.Cursor (.cursor/):
.cursor/settings.json وأي ملفات قواعد بحثًا عن أوامر أو خطافات محقونة..vscode/.عام:
preinstall أو postinstall أو prepare أو prestart في package.json لم تكتبها أنت. قم بالإبلاغ عن أي شيء مشبوه..github/workflows/ بحثًا عن أي سير عمل يستخدم pull_request_target — قم بالإبلاغ عنه كمخاطرة أمنية مع تعليق يشرح السبب..gitignore يستبعد ملفات جلسات العميل التي قد تسرب بيانات الاعتماد (.claude/projects/, .cursor/logs/، إلخ).أبلغ عن ما وجدته وما غيرته. لا تقم بتعديل كود التطبيق.
egress-policy: auditblockتحقق من وجود أسرار في سجلات سير العمل: تأكد من عدم طباعة أي خطوة في سير العمل لـ ${{ secrets.* }} أو ${{ toJSON(secrets) }} إلى الإخراج القياسي.
أبلغ عن جميع التغييرات. لا تقم بتعديل كود التطبيق.