Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

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

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

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

دليل الأدوات

الفئات

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

cve-2026-85706

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

عرض المستودع
منذ 9س 24دلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

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

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

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

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

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

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

يسمح اختلاف في تحليل المسارات (parser differential) بين 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. ولا معتمد منها.

تنزيل الأداة