
سكربت شل للكشف عن مؤشرات هجوم سلسلة التوريد في TanStack npm (CVE-2026-45321 / GHSA-g7cv-rxg3-hmpx)
كشف مؤشرات هجوم سلسلة توريد npm الخاص بـ TanStack على جهاز مطور، أو مستودع، أو بيئة تشغيل CI. سكربت Bash، صورة Docker، وإجراء GitHub — نفس المحرك، ثلاث نقاط دخول.
CVE-2026-45321 / GHSA-g7cv-rxg3-hmpx
في 11 مايو 2026، نشر المهاجمون 84 إصدارًا ضارًا عبر 42 حزمة @tanstack/* عبر تسميم ذاكرة التخزين المؤقت لإجراءات GitHub. الحمولة تسرق رموز GitHub، رموز npm، بيانات اعتماد AWS/GCP/Azure، وتقوم بتثبيت برنامج خفي لمفتاح الموتى يقوم بمسح ~/ بمجرد إلغاء الرمز المسروق.
اختر نقطة الدخول التي تناسب مكانك.
TAG=v1.0.0
curl -fsSLO https://github.com/fabriziosalmi/tanstack-compromise-checker/releases/download/$TAG/check.sh
curl -fsSLO https://github.com/fabriziosalmi/tanstack-compromise-checker/releases/download/$TAG/check.sh.sha256
sha256sum -c check.sh.sha256
bash check.sh --online
docker run --rm -v "$PWD":/scan \
ghcr.io/fabriziosalmi/tanstack-compromise-checker:v1.0.0 \
/scan true fail tanstack-findings.json '' GHSA-g7cv-rxg3-hmpx
الصورة متعددة البنى (linux/amd64, linux/arm64) وتأتي مع مصدر بناء موقّع عبر GitHub OIDC. تحقق قبل التشغيل:
gh attestation verify \
oci://ghcr.io/fabriziosalmi/tanstack-compromise-checker:v1.0.0 \
--repo fabriziosalmi/tanstack-compromise-checker
permissions: {}
jobs:
check:
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@v6
with:
persist-credentials: false
- uses: fabriziosalmi/tanstack-compromise-checker@v1
with:
scan-dir: .
online: 'true'
fail-on: fail
سير عمل كامل ومُحصّن موجود في
.github/workflows/tanstack-check.yml
وهو نفس سير العمل الذي يعمل به هذا المستودع ضد نفسه.
مع --online، يجلب السكربت أيضًا إشعار GHSA أثناء التشغيل بحيث تغطي تغطية الكشف الحالة الحية للإشعار بدلاً من قائمة إصدارات ثابتة.
العائلة المتأثرة: @tanstack/router, @tanstack/react-router,
@tanstack/history, @tanstack/start, @tanstack/eslint-plugin-router، والحزم ذات الصلة.
العائلات النظيفة (غير متأثرة): @tanstack/react-query,
@tanstack/react-table, @tanstack/react-virtual, @tanstack/form,
@tanstack/store.
# فحص سريع (المستخدم الحالي)
bash check.sh
# وضع الاتصال: الاستعلام عن إشعار GHSA وسجل النشر npm
bash check.sh --online
# فحص دليل محدد
bash check.sh --scan-dir /path/to/your/repos
# إخراج JSON لتكامل CI/SIEM
bash check.sh --json > findings.json
# اقتراح أوامر التثبيت للمستودعات المتأثرة (محاكاة جافة)
bash check.sh --scan-dir /path/to/repos --fix
# توفير قائمة إصدارات ضارة إضافية
bash check.sh --bad-versions-file ./extra-bad-versions.txt
| الرمز | المعنى |
|---|---|
| 0 | نظيف — لا توجد مؤشرات ضمن النطاق الممسوح |
| 1 | تحذيرات فقط — مراجعة موصى بها |
| 2 | إخفاقات — توجد مؤشرات اختراق |
| 3 | خطأ في الأداة/الاستخدام |
يدافع هذا المستودع عن نفسه ضد نفس فئة الهجوم التي يكتشفها. تحديدًا:
uses: إجراء GitHub محدد بـ SHA commit بطول 40 حرفًا، وليس tag عائم.permissions: {} على المستوى الأعلى؛ تمنح المهام فقط ما تحتاجه.actions/checkout يُستدعى مع persist-credentials: false بحيث لا يبقى مستودع git موثق في $GITHUB_WORKSPACE.step-security/harden-runner
هو الخطوة الأولى في كل سير عمل ويراقب حركة الخروج من بيئة التشغيل.main؛ تُرفع النتائج كـ SARIF.gh attestation.check.sh.sha256 يغطي جميع الملفات القابلة للتثبيت.السياسة الكاملة في SECURITY.md.
لا تقم بـ curl | bash لأي أداة أمان، بما في ذلك هذه الأداة. دائمًا قم بالتنزيل، تحقق من المجموع الاختباري، افحص، ثم شغّل.
━━ 1 / 8 آثار مفتاح الموتى
✔ لم يتم العثور على آثار مفتاح الموتى
━━ 2 / 8 نواقل الثبات
✔ لم يتم اكتشاف نواقل ثبات
━━ 3 / 8 كشف الرموز / بيانات الاعتماد
✔ لم يتم اكتشاف كشف بيانات اعتماد
━━ 4 / 8 مؤشرات الشبكة
✔ لا توجد اتصالات TCP node قائمة حالياً (أو غير قابلة للمراقبة)
━━ 5 / 8 فحص المستودع — package.json + ملفات القفل
ℹ تم العثور على 12 package.json + 8 ملف(ات) قفل
✔ لم يتم الإعلان عن عائلة مخترقة في أي package.json
✔ لم يتم العثور على تثبيتات مخترقة في أي ملف قفل
━━ 6 / 8 node_modules المثبتة — فحص الإصدار المباشر
✔ لا توجد حزم مخترقة في node_modules المثبتة
━━ 7 / 8 تلميحات تحصين GitHub Actions
✔ لم يتم اكتشاف أنماط GitHub Actions خطيرة (في النطاق الممسوح)
━━ 8 / 8 حمولة Mini Shai-Hulud + مؤشرات مساعدة
✔ لم يتم اكتشاف حمولة Mini Shai-Hulud / مؤشرات مساعدة
━━ ملخص
نجح: 8 تحذيرات: 0 إخفاق: 0
النطاق : /Users/alice/dev
✔ لا توجد مؤشرات اختراق ضمن النطاق: /Users/alice/dev
ملاحظة: نتيجة نظيفة لـ /Users/alice/dev لا تصدق بقية النظام.
لا تقم بإلغاء رمز GitHub الخاص بك قبل إيقاف البرنامج الخفي — سيقوم مفتاح الموتى بتنفيذ
rm -rf ~/بمجرد إلغاء الرمز.
launchctl bootout gui/$UID ~/Library/LaunchAgents/com.user.gh-token-monitor.plistlaunchctl unload ~/Library/LaunchAgents/com.user.gh-token-monitor.plistsystemctl --user stop gh-token-monitor && systemctl --user disable gh-token-monitorrm -f ~/.local/bin/gh-token-monitor.sh~/.aws/credentials, ~/.kube/config, ~/.config/gh/hosts.yml,
~/.npmrc.يحتاج سكربت bash إلى:
bash 4+jq (موصى به) — تحليل package-lock.jsonpython3 (احتياطي اختياري) — يُستخدم عند غياب jqcurl — مطلوب لـ --onlinelsof أو ss (اختياري) — استدلال مؤشرات الشبكةصورة Docker تحتوي على كل ما سبق. استخدمها على الأنظمة التي لا يمكنك أو لا ترغب في تثبيت هذه الأدوات عليها.
مرحب بالمشكلات وطلبات السحب. لاحظ أن هذا المستودع يستخدم CODEOWNERS: جميع طلبات السحب تتطلب مراجعة من المشرف.
MIT.
| # | الفحص | الوصف |
|---|
| 1 | مفتاح الموتى | ~/.local/bin/gh-token-monitor.sh، LaunchAgents + LaunchDaemons (macOS)، systemd user + system units (Linux)، العمليات الجارية |
| 2 | الثبات | ملفات شل rc، crontab المستخدم/النظام، /etc/cron.*، الإقلاع التلقائي XDG، core.hooksPath العام git |
| 3 | بيانات الاعتماد | متغيرات البيئة الحساسة، ~/.npmrc، ~/.yarnrc.yml، ~/.aws/credentials، ~/.config/gh/hosts.yml، ~/.netrc، ~/.docker/config.json، ~/.kube/config، تعداد ملفات .env* |
| 4 | مؤشرات الشبكة | عمليات node الجارية مع اتصالات TCP صادرة مؤكدة (استدلالي، مراجعة يدوية) |
| 5 | فحص المستودع | package.json التبعيات المُعلنة + الإصدارات المثبتة في ملفات القفل (package-lock.json, yarn.lock, pnpm-lock.yaml) |
| 6 | المثبتة | node_modules/@tanstack/*/package.json يتم التحقق منه مقابل قائمة الإصدارات الضارة المعروفة، ثم مقابل سجل npm time[<version>] عند --online |
| 7 | تلميحات الإجراءات | فحص .github/workflows/* لوجود pull_request_target، نقص --ignore-scripts، استخدام actions/cache |
| 8 | مؤشرات Mini Shai-Hulud | ملفات الحمولة في node_modules (router_init.js, tanstack_runner.js)، @tanstack/setup optionalDependency، التلاعب بإعدادات أدوات AI، نطاقات C2 في المصدر، نمط مؤلف الالتزام + الفرع المهاجم، رموز npm المُعلَمة بالفدية، الحزم الثانوية المنتشرة عبر الدودة، بالإضافة إلى استدلالات مستوى معلومات للأشكال غير المعروفة للحمولة |
| العلم | الوصف |
|---|
--scan-dir DIR | الدليل الجذر للمسح (الافتراضي: $HOME). يرفض مسح أدلة النظام مثل /, /etc, /usr. |
--online | الاستعلام عن إشعار GHSA وسجل npm time[<version>] لتأكيد الاختراق. غير مفعل افتراضيًا — اشتراك اختياري. |
--ghsa GHSA-ID | تجاوز معرف الإشعار المستخدم في --online (الافتراضي GHSA-g7cv-rxg3-hmpx). |
--attack-window-start ISO, --attack-window-end ISO | تجاوز نافذة زمن النشر المستخدمة في --online. |
--fix | طباعة أوامر التثبيت الموصى بها للمستودعات المتأثرة (محاكاة جافة افتراضيًا). |
--apply | مع --fix: اشتراك اختياري للتنفيذ. حاليًا لا يزال يرفض التحديث الأعمى؛ التثبيت اليدوي مطلوب. |
--yes, -y | تخطي رسالة التأكيد لـ --apply. |
--json | إصدار النتائج كـ JSON إلى stdout (يعني --quiet). |
--bad-versions-file F | إضافة إدخالات (pkg@version، سطر واحد لكل إدخال) إلى قائمة الإصدارات الضارة. |
--no-color | تعطيل ألوان ANSI. |
--quiet, -q | إخفاء مخرجات كل فحص، طباعة الملخص فقط. |
-h, --help | عرض المساعدة. |