
الدفاع ضد هجوم سلسلة التوريد Shai-Hulud
أداة أمنية للكشف عن حزم npm المخترقة من هجمات سلسلة التوريد Shai-Hulud (الهجوم الأصلي سبتمبر 2025 و Shai-Hulud 2.0 نوفمبر 2025). تفحص كلاً من ملفات package.json و package-lock.json للكشف عن الإصدارات المثبتة الدقيقة ومؤشرات الاختراق (IoCs). متوفرة بتطبيقين بلغة Python و Node.js مع تهيئة مركزية بصيغة YAML لسهولة الصيانة.
آخر تحديث: 24 نوفمبر 2025 - أكثر من 738 حزمة مخترقة تم تتبعها مع 1,291 تركيبة فريدة من package@version. الآن يكتشف كلاً من متغيرات الهجوم الأصلية Shai-Hulud و Shai-Hulud 2.0.
للمسح عبر أنظمة بيئية متعددة، انظر ore-mal-pkg-inspector.
للمسح للحزم الخبيثة عبر أنظمة بيئية متعددة (npm، PyPI، Maven، RubyGems، Go، Cargo)، انظر: ore-mal-pkg-inspector - ماسح شامل للحزم الخبيثة مع استخبارات تهديدات ديناميكية.
يركز OreNPMGuard تحديدًا على دفاع هجمات Shai-Hulud لحزم npm.
Shai-Hulud هي دودة ذاتية التكاثر بدأت في اختراق حزم npm في 14-15 سبتمبر 2025، وتمثل أول هجوم ناجح ذاتي الانتشار في نظام npm البيئي، وأحد أشد هجمات سلسلة التوريد لجافا سكريبت التي تمت ملاحظتها حتى الآن. سُميت على اسم الديدان الرملية العملاقة من سلسلة كثيب لفرانك هربرت، وقد تطورت هذه البرمجيات الخبيثة إلى عدة متغيرات.
أصاب الهجوم الأصلي أكثر من 200 حزمة npm (كما هو متتبع في هذه الأداة) مع تأثر إصدارات متعددة لكل حزمة.
ظهر متغير جديد في نوفمبر 2025 مع تغييرات كبيرة:
preinstall (وليس فقط postinstall)setup_bun.js و bun_environment.js (بالإضافة إلى bundle.js)المرجع: Wiz Research - مقالة مدونة Shai-Hulud 2.0
المريض صفر: بدأ الهجوم بحزمة rxnt-authentication التي نُشرت في 14 سبتمبر 2025، الساعة 17:58:50 UTC بواسطة حساب npm المخترق "techsupportrxnt".
سلسلة الهجوم (Shai-Hulud الأصلي):
postinstall الذي ينفذ bundle.js (حمولة JavaScript تزيد عن 3 ميغابايت)data.json (مشفر base64 مرتين).github/workflows/shai-hulud-workflow.yml) يقوم بتسريب أسرار المستودع إلى webhook[.]sitepostinstallسلسلة الهجوم (Shai-Hulud 2.0 - نوفمبر 2025):
preinstall الذي ينفذ setup_bun.js أو bun_environment.js (ملفات حمولة جديدة)cloud.json و contents.json و environment.json و truffleSecrets.json.github/workflows/discussion.yaml مع عامل تشغيل ذاتي الاستضافة للوصول الخلفي.github/workflows/formatter_*.yml لتسريب الأسرار (ثم يحذف سير العمل لإخفاء النشاط)docker run --rm --privileged -v /:/hostghp_*, gho_*)، رموز المصادقة لـ npmShai-Hulud الأصلي (سبتمبر 2025):
@ctrl/tinycolor, ngx-bootstrap)Shai-Hulud 2.0 (نوفمبر 2025):
سرقة بيانات اعتماد مؤكدة (من حوالي 20,000 مستودع تم تحليلها):
هام: أكدت أبحاث Wiz حدوث تسريب عبر الضحايا. هذا يعني:
التأثير على التحقيق: عند مراجعة البيانات المسربة في مستودعاتك، تحقق مما إذا كانت البيانات تنتمي بالفعل إلى مؤسستك أو إلى ضحية أخرى.
يرتبط هذا الهجوم مباشرة باختراق s1ngularity/Nx في أغسطس 2025، حيث مكّنت سرقة رمز GitHub الأولية من تنفيذ هجوم سلسلة التوريد الأوسع. العديد من ضحايا Shai-Hulud الأوائل كانوا ضحايا معروفين لهجوم s1ngularity. كما يلاحظ باحثو الأمن دمج محتوى مولّد بالذكاء الاصطناعي ضمن الحملة، مع ثقة معتدلة بأن LLM استُخدم لتوليد النص البرمجي الخبيث لـ bash.
حملة Shai-Hulud الأصلية:
rxnt-authentication ("المريض صفر")حملة Shai-Hulud 2.0:
PyYAML (pip install pyyaml)js-yaml (npm install js-yaml)# جعل الملف قابل للتنفيذ
chmod +x shai_hulud_scanner.py
# مسح ملف package.json واحد
python3 shai_hulud_scanner.py ./package.json
# مسح package-lock.json للإصدارات الدقيقة
python3 shai_hulud_scanner.py ./package-lock.json
# مسح دليل المشروع بالكامل
python3 shai_hulud_scanner.py ./my-project
# مسح الدليل الحالي
python3 shai_hulud_scanner.py .
# تثبيت التبعيات أولاً
npm install
# جعل الملف قابل للتنفيذ
chmod +x shai_hulud_scanner.js
# مسح ملف package.json واحد
node shai_hulud_scanner.js ./package.json
# مسح package-lock.json للإصدارات الدقيقة
node shai_hulud_scanner.js ./package-lock.json
# مسح دليل المشروع بالكامل
node shai_hulud_scanner.js ./my-project
# مسح الدليل الحالي
node shai_hulud_scanner.js .
✅ كشف المطابقة الدقيقة: يحدد الحزم ذات الإصدارات المطابقة تمامًا للإصدارات المخترقة المعروفة
⚠️ كشف المخاطر المحتملة: يضع علامات على الحزم التي تحمل نفس الاسم ولكن بإصدارات مختلفة (قد تظل في خطر)
🔍 دعم الملفات المزدوجة: يمسح كلاً من package.json (التبعيات المعلنة) و package-lock.json (الإصدارات المثبتة الدقيقة)
📦 تغطية شاملة: يشمل مسح package-lock.json التبعيات المتداخلة والحزم الانتقالية
🔄 مسح تكراري: يمسح تلقائيًا جميع الأدلة الفرعية مع تخطي node_modules
📋 تقارير مفصلة: يعرض أسماء الحزم، الإصدارات، أقسام التبعيات، والإصدارات المتأثرة
🔎 كشف مؤشرات الاختراق: يحدد مؤشرات الاختراق لكل من Shai-Hulud الأصلي و Shai-Hulud 2.0:
"postinstall": "node bundle.js"، ملفات bundle.js، ملفات shai-hulud-workflow.yml"preinstall"، ملفات setup_bun.js، bun_environment.js، discussion.yaml، سير عمل formatter_*.ymlwebhook.site، أنماط عامل التشغيل SHA1HULUD، تصعيد صلاحيات Docker🚨 حرج (تم العثور على حزم مخترقة):
🚨 حرج: تم العثور على حزمتين مخترقتين مؤكدتين:
• @ctrl/deluge v7.2.2 في التبعيات
الإصدارات المتأثرة: 7.2.2, 7.2.1
• ngx-bootstrap v19.0.3 في devDependencies
الإصدارات المتأثرة: 18.1.4, 19.0.3, 20.0.4, 20.0.5, 20.0.6, 19.0.4, 20.0.3
⚠️ تحذير (عدم تطابق الإصدار):
⚠️ تحذير: تم العثور على حزمة واحدة بإصدار مختلف:
• @ctrl/deluge v7.2.0 في التبعيات
الإصدارات المعروفة المتأثرة: 7.2.2, 7.2.1
✅ نظيف:
✅ لم يتم العثور على حزم متأثرة
npm uninstall <package-name>npm cache clean --forcerm -rf node_modules"postinstall": "node bundle.js" في ملفات package.jsonbundle.js (أكثر من 3 ميجابايت، تحتوي على حمولة خبيثة).github/workflows/shai-hulud-workflow.yml"preinstall" في ملفات package.jsonsetup_bun.js و bun_environment.jscloud.json, contents.json, environment.json, truffleSecrets.jsonتتركز بيانات الحزم في affected_packages.yaml. لإضافة حزم مخترقة جديدة:
affected_packages.yaml- name: "اسم-الحزمة"
versions: ["1.0.0", "1.0.1"]
هذا النهج المركزي يلغي الحاجة لتحديث ملفات متعددة عند اكتشاف تهديدات جديدة.
# إنشاء سكريبت مسح مركزي
curl -O https://your-domain.com/shai_hulud_scanner.py
chmod +x shai_hulud_scanner.py
# مسح جماعي لمشاريع متعددة
for dir in /projects/*/; do
echo "جاري مسح $dir"
python3 shai_hulud_scanner.py "$dir"
done
# مثال لـ GitHub Actions
- name: مسح حزم Shai-Hulud
run: |
curl -O https://your-domain.com/shai_hulud_scanner.js
npm install js-yaml
node shai_hulud_scanner.js .
if [ $? -ne 0 ]; then
echo "تنبيه أمني: تم الكشف عن حزم مخترقة!"
exit 1
fi
# أضف إلى مجموعة أدوات الأمن
cp shai_hulud_scanner.py /usr/local/bin/
cp shai_hulud_scanner.js /usr/local/bin/
cp affected_packages.yaml /usr/local/bin/
# أنشئ اسمًا مستعارًا للوصول السهل
echo 'alias scan-shai="python3 /usr/local/bin/shai_hulud_scanner.py"' >> ~/.bashrc
postinstall، Shai-Hulud 2.0 يستخدم preinstall (يزيد التعرض في بيئات البناء)Shai-Hulud الأصلي (سبتمبر 2025):
"postinstall": "node bundle.js" في package.jsonbundle.js (عادةً أكثر من 3 ميجابايت من JavaScript مصغرة)webhook.site.github/workflows/shai-hulud-workflow.yml للاستمراريةshai-hulud تحتوي على التزامات خبيثةShai-Hulud 2.0 (نوفمبر 2025):
"preinstall": "node setup_bun.js" أو "preinstall": "node bun_environment.js" في package.jsonsetup_bun.js, bun_environment.js (بالإضافة إلى bundle.js)cloud.json, contents.json, environment.json, truffleSecrets.json.github/workflows/discussion.yaml (مع runs-on: self-hosted و RUNNER_TRACKING_ID: 0).github/workflows/formatter_*.yml (مطابقة نمط، يستخدم لتسريب الأسرار)مشترك بين المتغيرين:
webhook.sitepreinstall (مرحلة تنفيذ Shai-Hulud 2.0)setup_bun.js و bun_environment.jscloud.json, contents.json, environment.json, truffleSecrets.jsondiscussion.yaml و formatter_*.ymlprevention/block-shai-hulud.shللاستفسارات أو الأسئلة:
.github/workflows/discussion.yaml (مع عامل تشغيل ذاتي الاستضافة).github/workflows/formatter_*.ymldocker run --rm --privileged -v /:/host)webhook.site في الكود أو سجلات الشبكةdocker run --rm --privileged -v /:/hostwebhook.site (نفس الأصلية)