فحص واقع سلسلة الإمداد البرمجية: دروس من ثغرة tj-actions (CVE-2025-30066)
تحليل تقني لثغرة سلسلة الإمداد في GitHub Actions التي أثرت على آلاف المستودعات، مع دليل تنفيذي للمدراء التقنيين لاكتشاف التأثر وتدوير الأسرار.
م. أحمد موري و م. خالد الحربي
مؤسس، مطور برمجيات ومحلل تهديدات سيبرانية | قائد فريق الاستجابة للحوادث

الموقف التنفيذي: لماذا يجب أن تهتم؟
في 14 مارس 2025، استيقظ مجتمع الأمن السيبراني على واقعة اختراق حرجة في سلسلة الإمداد البرمجية (Software Supply Chain). الأداة الشهيرة tj-actions/changed-files، التي تعتمد عليها أكثر من 23,000 منشأة في أتمتة عملياتها، تعرضت لحقن برمجيات خبيثة.
هذا ليس مجرد إنذار نظري؛ الهجوم كان يهدف لسرقة الأسرار الرقمية (Secrets)—مثل مفاتيح الوصول للخدمات السحابية ورموز المصادقة—مباشرة من سجلات البناء (Build Logs).
"تقييم الأثر: إذا استخدمت مؤسستك هذه الأداة بين 14 و 15 مارس 2025، فيجب عليك افتراض أن أسرار خطوط الأنابيب (CI/CD Pipelines) الخاصة بك قد سُرّبت.
التسلسل الزمني للحادثة
التشريح التقني: كيف حدث التسريب؟
الهجوم استغل "الثقة العمياء" التي نمنحها لأدوات الطرف الثالث في بيئات التكامل المستمر (CI/CD).
لماذا نجح الهجوم؟
- الاعتماد على الوسوم المتحركة (Moving Tags): الكثير يستخدم
@v4بدلاً من التثبيت على نسخة محددة (SHA Pinning). - الصلاحيات الزائدة: مسارات العمل (Workflows) غالباً ما تملك صلاحيات قراءة الأسرار افتراضياً.
بروتوكول الاستجابة الفورية
1. اكتشاف الضرر
استخدم هذا السكربت لفحص ما إذا كانت مستودعاتك تستخدم الأداة المصابة.
#!/bin/bash
# scan-affected-workflows.sh
# فحص المستودعات التي تستخدم tj-actions/changed-files
ORG_NAME="${1:-your-org}"
OUTPUT_FILE="affected-workflows.csv"
echo "repository,workflow_file,line_number,version_used" > "$OUTPUT_FILE"
# يتطلب: gh CLI مع صلاحيات قراءة للمنظمة
gh api "/orgs/${ORG_NAME}/repos" --paginate -q '.[].name' | while read -r repo; do
echo "جاري فحص: ${ORG_NAME}/${repo}"
# فحص ملفات سير العمل
gh api "/repos/${ORG_NAME}/${repo}/contents/.github/workflows" -q '.[].name' 2>/dev/null | while read -r workflow; do
content=$(gh api "/repos/${ORG_NAME}/${repo}/contents/.github/workflows/${workflow}" -q '.content' 2>/dev/null | base64 -d)
if echo "$content" | grep -q "tj-actions/changed-files"; then
version=$(echo "$content" | grep -oP "tj-actions/changed-files@\K[^\s\"']+" | head -1)
echo "${ORG_NAME}/${repo},${workflow},${version}" >> "$OUTPUT_FILE"
fi
done
done
echo "تم حفظ النتائج في: $OUTPUT_FILE"2. قائمة تدوير الأسرار (Secrets Rotation)
إذا كان لديك أي عملية بناء (Build) في الفترة المتأثرة، يجب تدوير المفاتيح التالية فوراً:
| نوع السر | الإجراء المطلوب | الأولوية |
|---|---|---|
| GITHUB_TOKEN | لا يتطلب إجراء (مؤقت لكل عملية) | منخفضة |
| Personal Access Tokens (PATs) | إعادة توليد (Regenerate) وحذف القديم | قصوى |
| AWS/Azure/GCP Keys | إصدار مفاتيح جديدة وتعطيل القديمة | قصوى |
| NPM/PyPI Tokens | إلغاء الرموز الحالية وإصدار جديدة | عالية |
| Slack/Discord Webhooks | تغيير روابط الويب هوك | متوسطة |
استراتيجية الدفاع المستقبلية
للمدراء التقنيين (CTOs)، هذه الحادثة هي جرس إنذار لتغيير معمارية خطوط الإنتاج البرمجية.
1. التثبيت باستخدام البصمة (SHA Pinning)
لا تستخدم أسماء النسخ (@v1)، بل استخدم بصمة الالتزام (@sha123...).
# ❌ غير آمن - قد يتغير الكود خلف هذا الوسم
- uses: actions/checkout@v4
# ✅ آمن - الكود ثابت لا يتغير
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.22. تقليل الصلاحيات (Least Privilege)
تأكد من أن كل ملف سير عمل يحدد صلاحياته بدقة.
permissions:
contents: read # قراءة الكود فقط
issues: none # لا صلاحية للكتابة3. الانتقال إلى المصادقة بدون أسرار (OIDC)
بدلاً من تخزين مفاتيح AWS طويلة الأمد في GitHub Secrets، استخدم OpenID Connect (OIDC) لمنح صلاحيات مؤقتة أثناء التشغيل فقط.
المراجع
- GitHub Advisory Database: GHSA-mrrh-fwg8-r2c5 (15 مارس 2025)
- CISA KEV Catalog: CVE-2025-30066 Entry (18 مارس 2025)
- NVD: CVE-2025-30066 Detail
كاتبا المقال
م. أحمد موري
مؤسس مشارك، يجمع بين خبرة بناء النظم البرمجية العميقة وتحليل التهديدات السيبرانية المتقدمة.
م. خالد الحربي
متخصص في الدفاع السيبراني وإدارة الأزمات التقنية والاستجابة الفورية للتهديدات النشطة.


