Skip to content
KitploitKITPLOIT
أدواتعمليات الاستغلالالمدونة
Log in
إرسال
أدواتعمليات الاستغلالالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
cve-2026-85706 — تحليل السبب الجذري، ومختبر Docker معرّض للثغرة، ونصوص PoC للثغرة CVE-2026-85706، وهي قراءة ملفات عشوائية دون مصادقة في GitLab عبر تباين في المحلل بين Workhorse/Puma. | Kitploit
أدوات/GitHubGitHub/unh00k3d/cve-2026-85706
ماسحات الثغرات الأمنيةتحليل الثغرات الأمنيةالاستغلالاستغلال تطبيقات الويبأمن الويباختبار الاختراقالتعلم والتعليممختبرات وتدريب عملي
GitHubunh00k3d/cve-2026-85706

cve-2026-85706

تحليل السبب الجذري، ومختبر Docker معرّض للثغرة، ونصوص PoC للثغرة CVE-2026-85706، وهي قراءة ملفات عشوائية دون مصادقة في GitLab عبر تباين في المحلل بين Workhorse/Puma.

منذ يوم واحدلم تتم المراجعة بعد
عرض المستودع

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

CVE-2026-85706 — قراءة ملفات عشوائية بدون مصادقة في GitLab

CVSS 10.0 · بدون مصادقة · مستغلة فعليًا (CISA KEV)

يسمح اختلاف في تحليل المسارات بين GitLab Workhorse (وكيل عكسي بلغة Go) وPuma/Grape (بلغة Ruby) لمهاجم غير مُصادَق بتجاوز عملية تسليم الرفع المُسرَّعة في Workhorse والوصول إلى ثلاث نقاط نهاية للرفع مع file.path يتحكم به المهاجم، مما يؤدي إلى قراءة ملفات عشوائية على مضيف GitLab.

ترميز حرف واحد من files كـ %66iles يجعل مسار الرفع في Workhorse يفشل في المطابقة (فهو يطابق على المسار المُرمَّز) بينما يقوم Rails بفك ترميزه والعودة إلى المعالج الحقيقي (فهو يوجّه على المسار المُفكَّك). يثق المعالج بمعامل file.path الخام الذي كان من المفترض أن يستبدله Workhorse — لذا يُقرأ file.path=/etc/passwd من القرص دون أي بيانات اعتماد.

root@kitploit:~
POST /api/v4/projects/1/repository/%66iles/x?file=&file.path=/etc/passwd&file.size=1
                                   ^^^^^^  Workhorse misses -> raw file.path survives to Rails

المتأثر / المُصلَّح

الإصدار
المتأثرCE/EE 18.7 → 19.1.8، 19.2 → 19.2.6، 19.3 → 19.3.2
المُصلَّح19.1.8 / 19.2.6 / 19.3.2 (2026-09-10)

ما يوجد في هذا المستودع

المسارالمحتويات
docs/ANALYSIS.mdتحليل كامل للسبب الجذري — اختلاف المحلِّل، ورمزَي JWT في Workhorse، وخلل الثقة بـ file.path الخام، وفرق التصحيح، وقناة تسريب الأخطاء المنعكسة. تم التحليل مقابل الكود المصدري الحقيقي (v19.3.1-ee مقابل v19.3.2-ee).
lab/مختبر قابل للاستغلال قائم على Docker (gitlab-ce:19.3.1-ce.0) + تعليمات التشغيل.
poc/detect.sh (أداة كشف وجود غير مُدمِّرة) وexploit.sh (قراءة ملفات عبر الأخطاء المنعكسة). هدف واحد، مقيّد بالتصريح.

خلفية — خط أنابيب الطلبات في GitLab

لست على دراية بالبنية الداخلية لـ GitLab؟ إليك ما تفعله كل طبقة — بالترتيب الذي يمر به الطلب عبرها. يوجد معجم أعمق بالمفاهيم الأساسية في docs/ANALYSIS.md §0.

root@kitploit:~
  Internet
     │
     ▼
 ┌────────┐     ┌───────────┐     ┌────────┐     ┌──────────────────────┐
 │ NGINX  │────▶│ Workhorse │────▶│  Puma  │────▶│  Grape / Rails app  │
 │(proxy) │     │   (Go)    │     │ (Ruby) │     │      (Ruby)         │
 └────────┘     └───────────┘     └────────┘     └──────────────────────┘
المكوّنما هو
NGINXالوكيل العكسي الخارجي. يُنهي TLS، ويقدّم الملفات الثابتة، ويُمرّر كل ما تبقّى إلى الداخل. غير متورط مباشرةً في هذه الثغرة.
Workhorseوكيل عكسي بلغة Go خاص بـ GitLab. مهمته الأساسية تخفيف العمل الذي يكون Ruby بطيئًا فيه — خاصةً بثّ عمليات الرفع الكبيرة. بالنسبة لنقاط نهاية الرفع، يقوم Workhorse بتخزين الجسم مؤقتًا في ملف، وتوقيع JWT، وإعادة كتابة file.path بحيث لا يرى Ruby أبدًا بايتات الرفع الخام. كما يضع JWT باسم Gitlab-Workhorse-Api-Request لكل طلب على كل طلب يُمرّره (مُثبتًا أن "هذا جاء عبر الوكيل"، وليس أن "هذا المستخدم مُصادَق").
Pumaخادم تطبيق Ruby الذي يشغّل تطبيق Rails. يستقبل الطلبات من Workhorse، ويشغّل الوسائط (Rack)، ويوزّعها على الموجّه.
Rackطبقة واجهة خادم الويب في Ruby. تتعامل وسائط Rack مع تحليل سلسلة الاستعلام، وإدارة الجلسات، والأهم هنا — التحقق من JWT الرفع الخاص بـ Workhorse وبناء كائنات UploadedFile. الدالة Rack::Utils.parse_nested_query هي التي تُسرّب رسائل خطئها محتوى الملفات في هذا الاستغلال.
Grapeإطار عمل REST API يستخدمه GitLab لجميع نقاط النهاية /api/v4/*. يوفّر تعريفات المسارات ومرشّحات قبلية مثل require_gitlab_workhorse! (فحص الوكيل) وauthenticate! (فحص هوية المستخدم). يعمل داخل Rails، على Puma، خلف Workhorse — لذا يرى مسار URL المُفكَّك.
Railsإطار الويب الشامل (Ruby on Rails). GitLab هو تطبيق Rails متكامل — النماذج والخدمات والوسائط كلها تعمل هنا داخل Puma.

تقع الثغرة في الفجوة بين Workhorse (الذي يطابق المسارات على المسار المُرمَّز) وGrape/Puma (الذين يوجّهان على المسار المُفكَّك). انظر أدناه.

الخلاصة السريعة للآلية

  1. اختلاف المحلِّل. يطابق Workhorse المسارات على r.URL.EscapedPath() (المُرمَّز)؛ بينما يوجّه Puma/Grape على المسار المُفكَّك. %66iles ≠ التعبير النمطي files بالنسبة لـ Workhorse، لكنه يُفكَّك إلى files بالنسبة لـ Rails.
  2. تخطّي التسليم. لأن مسار الرفع فشل في المطابقة، لم يقم Workhorse أبدًا بتخزين الجسم مؤقتًا في ملف، ولم يُعِد كتابة file.path إلى مسار مؤقت موقّع، ولم يضع ترويسة Gitlab-Workhorse-Multipart-Fields — لكنه لا يزال يمرّر الطلب (مع JWT صالح باسم Gitlab-Workhorse-Api-Request).
  3. غياب المصادقة + الثقة بالمعامل الخام. لم تكن لنقطة النهاية authenticate!، وكان المعالج يقرأ params['file.path'] مباشرةً (سلسلة المهاجم) بدلًا من params[:file] UploadedFile المُتحقَّق منه من Workhorse والمقيّد بالمسار.
  4. التسريب عبر رسائل الخطأ. يتسرّب المحتوى عبر سلاسل خطأ Rack::Utils.parse_nested_query ("invalid %-encoding (<file bytes>)") — تعكس الاستجابة بايتات الملف حتى أول % غير صالح.

يضيف التصحيح authenticate!، ويبدّل إلى UploadedFile المُتحقَّق منه، ويتوقف عن عكس e.message. انظر docs/ANALYSIS.md §5.

البدء السريع

root@kitploit:~
# 1. Stand up the vulnerable lab (see lab/README.md for details)
cd lab && docker compose up -d      # wait ~5 min for GitLab to become healthy

# 2. Non-destructive detection
../poc/detect.sh http://localhost:8929

# 3. File-read PoC against a file you're authorized to read on your own lab
../poc/exploit.sh http://localhost:8929 /var/opt/gitlab/gitlab-rails/etc/gitlab.yml

⚠️ الاستخدام المسؤول

نُشر هذا لأغراض دفاعية وتعليمية: فهم ثغرة CVE مُعلنة ومُصلَّحة ومُدرجة في قائمة CISA KEV، واكتشافها، وتصحيحها. السكربتات هنا أحادية الهدف وتتطلب منك تمرير الهدف صراحةً.

  • شغّل هذه الأدوات فقط ضد أنظمة تملكها أو لديك تصريح صريح باختبارها.
  • صُمّم المختبر ليعمل على localhost. لا توجّهه إلى مضيفين تابعين لجهات خارجية.
  • الوصول غير المُصرَّح به إلى أنظمة الحاسوب غير قانوني في معظم الولايات القضائية.

إذا كنت تشغّل GitLab، فقم بالترقية إلى إصدار مُصلَّح — فهذا هو العلاج الحقيقي الوحيد.

المراجع

  • watchTowr — Rapid Reaction: GitLab Path Traversal (CVE-2026-85706)
  • Nuclei Templates — PR #17231
  • فرق المصدر الأساسي: gitlab-org/gitlab @ v19.3.1-ee مقابل v19.3.2-ee

الترخيص

MIT — التحليل وكود PoC فقط. GitLab علامة تجارية لشركة GitLab Inc.؛ هذا المستودع غير تابع لشركة GitLab Inc. ولا مُعتمد منها.

تنزيل الأداة