
فرز للكشف فقط لـ GitLab CVE-2026-97229 (و CVE-2026-110264): تقييم إصدار GitLab المُدار ذاتيًا بالإضافة إلى Ruby الخاص به، واكتشاف فخّي تصحيح 12 أكتوبر وRuby المخصص. لا حمولات، ولا فحوصات شبكية.
gitlab-onigmo-scannerفرز الإصدارات لثغرتي GitLab النصيتين (regex) المصنفتين CVSS 10.0، CVE-2026-97229 وCVE-2026-110264. أعطه إصدار GitLab الذي تملكه، سيخبرك ما إذا كان ذلك البناء لا يزال عرضة للخطر، ويكشف الفخّين اللذين يوقعان الناس بالفعل. لا يلمس الشبكة أبدًا، ولا يرسل أي حمولة (payload)، ولا يصل إلى نقطة نهاية فحص CI، ولا يترجم تعبيرًا نصيًا (regex) مصممًا خصيصًا.
الثغرةالتفصيل | القيمة |
|---|---|
CVE | CVE-2026-97229، بالإضافة إلى CVE-2026-110264 المصنفة إلى جانبها |
الخلل | Integer overflow (CWE-190) في Onigmo، محرك التعبيرات النصية المدمج في Ruby، عندما يترجم GitLab تعبيرًا نصيًا مقدَّمًا من المستخدم |
التأثير | تنفيذ تعليمات برمجية عن بُعد دون مصادقة على خادم GitLab ذاتي الإدارة، في ظروف معينة |
الخطورة | 10.0 حرجة لكليهما، مصنفة من قِبل GitLab بصفتها CNA |
الاستغلال | أُضيفت CVE-2026-97229 إلى CISA KEV في 2026-10-29، والموعد النهائي الفيدرالي 2026-11-01. لا يوجد إدراج لـ CVE-2026-110264 في KEV حتى كتابة هذه السطور، وGitLab تفيد بعدم وجود أي دليل على استخدامها في هجمات |
CVE-2026-97229 هي ثغرة التعبيرات النصية في CI/CD: تعبير نصي مصمم خصيصًا في إعداد CI/CD، مع تحقق غير كافٍ من التعبيرات النصية، وأُصلحت في 2026-10-12. أما CVE-2026-110264 فهي ثغرة تعبيرات نصية ثانية أوسع نطاقًا أُصلحت في 2026-10-21، وتمتد إلى كل إصدار ذاتي الإدارة وصولًا إلى 7.0. المحرك نفسه، والدرجة نفسها، لكن الخلل مختلف، ولهذا السبب تحديدًا لا يكفي فحص واحد.
الإصدارات المُصلحةCVE-2026-97229 (أُصلحت في 2026-10-12)الخط | مُصلح في |
|---|---|
GitLab 19.2 | 19.2.8 |
GitLab 19.3 | 19.3.5 |
GitLab 19.4 | 19.4.2 |
GitLab 19.5، والأقدم من 19.2 | غير مُدرج كمتأثر بهذه الثغرة |
CVE-2026-110264 (أُصلحت في 2026-10-21)الخط | مُصلح في |
|---|---|
GitLab 19.5 | 19.5.1 |
GitLab 19.4 | 19.4.3 |
GitLab 19.3 | 19.3.6 |
GitLab 19.2 | 19.2.9 |
GitLab 19.1 | 19.1.9 |
GitLab 19.0 | 19.0.10 |
GitLab 18.11 | 18.11.13 |
GitLab 18.10 والأقدم | لا يوجد إصدار مُصلح، قم بالترقية إلى 18.11.13 أو أحدث |
Ruby، لعمليات التثبيت من المصدر والصور المخصصةالخط | مُصلح في |
|---|---|
Ruby 3.3 | 3.3.13 |
Ruby 3.4 | 3.4.12 |
Ruby 4.0 | 4.0.9 |
Ruby 3.2 والأقدم | لا يوجد إصلاح، انتهى عمره الافتراضي، انتقل إلى 3.4 أو 4.0 |
الفخ 1: تصحيح 12 أكتوبر لا يغطي 21 أكتوبرأصلحت 19.4.2 و19.3.5 و19.2.8 الثغرة CVE-2026-97229. كل واحدة منها تقع دون إصلاح CVE-2026-110264 الخاص بفرعها (19.4.3، 19.3.6، 19.2.9). إذا قمت بالتصحيح في 12 أكتوبر وتوقفت، فأنت لا تزال عرضة للخطر، وأي أداة فحص تعرف الثغرة الأولى فقط ستخبرك بأنك سليم. هذه الأداة تصنّف كلتيهما، وتذكر الفخ في مخرجاتها عندما تراه.
الفخ 2: ترقية GitLab لا تصلح Ruby الخاص بكإصلاح GitLab هو تصحيح لـ Ruby الذي تُضمّنه في حزمها وصورها الرسمية. أما التثبيت من المصدر، أو الصورة المخصصة التي تثبّت Ruby بشكل منفصل، فلا تحصل على ذلك التصحيح من ترقية GitLab. عاشت Alpine Linux هذه التجربة: فقد رقّت إلى GitLab 19.3.6 في 2026-10-22 وظلت عرضة للخطر، لأن صورتها استخدمت Ruby القياسي. فحص مهاجم خادمها في 2026-10-20 و21، وأسقط العمّال (workers) ثماني مرات، ووصل إلى منتصف الاستغلال في أربع منها، وعاد في 25 و26. لم تجد Alpine دليلًا على نجاح الاستغلال، ولم تستطع استبعاده، فأعادت بناء النسخة من الصفر، واستبدلت مفاتيحها السرية وأعادت تعيين كل كلمة مرور. صورتها المُصلحة، التي أُعيد سحبها بعد 2026-10-27، تحمل Ruby 3.3.13.
لذا: --install-type official يقيّم إصدار GitLab وحده، لأن Ruby يأتي معه. أما --install-type source أو custom فيقيّم أيضًا Ruby الذي توفره عبر --ruby-version، وإصدار Ruby المفقود يُقيَّم UNKNOWN، وليس سليمًا. Ruby 4.0.8 حالة خاصة تستحق المعرفة: فهي تصلح خلل CVE-2026-97229 لكن ليس CVE-2026-110264، لذا تُقيَّم VULNERABLE هنا. لم يطلب Ruby أي معرّفات CVE خاصة به لهذه الإصلاحات، ولهذا فإن أي ماسح يطابق سجلات CVE مع الحزم المثبّتة لن يجد أي Ruby مصاب في أي مكان. هذه الأداة تفحص إصدار Ruby مباشرةً بدلًا من ذلك.
ما الذي تفحصهGitLab واحد: CVE-2026-97229 وCVE-2026-110264 كلٌّ على حدة، ثم حكم إجمالي واحدCSV لكثير من النسخ: name,gitlab_version,ruby_version,install_type,hostingRuby، عندما تقول إن التثبيت من نوع source أو customGitLab.com وDedicated بوصفهما مُرقَّعين مسبقًا، دون حاجة إلى أي إجراءكل نتيجة تحصل على حكم: VULNERABLE أو FIXED أو EOL_NO_FIX أو UNKNOWN أو NOT_AFFECTED لـ CVE واحد على فرع لا يمسّه. يُحتسب EOL_NO_FIX كإصابة: فلا توجد رقعة قادمة لذلك الخط.
ما الذي لا تفعله أبدًالا طلبات شبكة. لا فحص للخوادم البعيدة. لا تعبيرات نمطية مصنوعة، لا طلب فحص CI، لا حركة استغلال، لا شيفرة PoC. تقرأ سلاسل الإصدارات التي توفرها وتتوقف. وهذا متعمّد: فـ PoCs العامة لـ CVE-2026-97229 موجودة بالفعل، وإعادة إنتاج واحدة هنا لن تضيف شيئًا دفاعيًا.
لماذا هذا، بينما PoCs وعدّادات الإصدارات موجودة بالفعلالمادة العامة لـ CVE-2026-97229 هجومية في معظمها: PoCs تشغّل شيفرة بصلاحيات مستخدم git، ومختبرات تحدد أي الإصدارات قابلة للتسليح. Censys يعدّ المضيفين المكشوفين حسب الإصدار. نشر GitLab قواعد Sigma لرصد محاولات الاستغلال في السجلات. لا شيء من ذلك أداة فرز دفاعية قائمة بذاتها تقيّم ثغرتي أكتوبر ذواتي CVSS 10.0 معًا وتفحص Ruby الكامن تحت تثبيت source أو custom. تلك الفجوة هي هذا المستودع: أمر واحد، كلتا الثغرتين، كلا الفخّين، دون أي حمولة. استخدمه إلى جانب قواعد Sigma الخاصة بـ GitLab، لا بدلًا منها. إذا فُحصت نسخة ما، فإن فرز الإصدارات ليس فرزًا للاختراق: افحص سجلات انهيار العمال وتقارير انهيار Onigmo، واتبع مثال Alpine إن لم تستطع استبعاد محاولة ما.
التقييمFinding | Severity |
|---|---|
GitLab أدنى من إصلاح فرعه لأي من CVE | VULNERABLE |
GitLab على 18.10 أو أقدم، أو Ruby 3.2 أو أقدم على تثبيت source/custom | EOL_NO_FIX، يُحتسب كإصابة |
GitLab عند كلا الإصلاحين أو بعدهما، وRuby مُصلَح حيث ينطبق | FIXED |
تثبيت Source/custom دون إصدار Ruby، أو فرع أحدث من بيانات هذه الأداة (2026-10-30) | UNKNOWN، وليس سليمًا |
GitLab.com / Dedicated | FIXED، مُرقَّع من GitLab |
الاستخدام# One instance, official package or image
python3 gitlab_onigmo_scanner.py --version 19.4.2
# One instance, source install with its own Ruby
python3 gitlab_onigmo_scanner.py --version 19.4.3 --ruby-version 3.4.11 --install-type source
# A whole estate, machine-readable output
python3 gitlab_onigmo_scanner.py --list inventory.csv --json
# Tests (version tables only, no network)
python3 -m unittest discover -s tests -v
تنسيق inventory.csv، صف الرأس اختياري:
name,gitlab_version,ruby_version,install_type,hosting
prod,19.4.1,,official,self-managed
staging,19.4.3,,official,self-managed
legacy-source,19.4.3,3.4.11,source,self-managed
أكواد الخروج: 0 = لم يُعثر على أي شيء قابل للاستغلال، 2 = نتيجة قابلة للاستغلال أو نهاية العمر الافتراضي، 1 = خطأ في الفحص. لا يغيّر UNKNOWN رمز الخروج، لكنه ليس نظيفًا. أكّد تلك العناصر بطريقة أخرى قبل إغلاقها.
اختلافات المصادر، وما يتبعه هذا الأداة