
مجموعة أدوات بلغة Python لتدقيق خادم Apache HTTP Server ضد CVE-2026-23918 (ثغرة RCE للتحرير المزدوج في HTTP/2) و4 ثغرات CVE ذات صلة. ماسح سلبي مع التحقق من ALPN + مدقق محلي للقراءة فقط. بدون استغلالات.
أدوات تدقيق دفاعية لـ CVE-2026-23918 (ثغرة تحرير مزدوج (double-free) في HTTP/2 ضمن Apache HTTPD تؤدي إلى تنفيذ كود عن بُعد RCE) وأربع ثغرات CVE ذات صلة تم الكشف عنها في النشرة الأمنية الصادرة عن Apache Software Foundation بتاريخ 4 مايو 2026.
| CVE | الخطورة | المكوّن | التأثير | الإصدارات المتأثرة |
|---|---|---|---|---|
| CVE-2026-23918 | عالية (CVSS 8.8) | HTTP/2 | تحرير مزدوج / RCE | فقط 2.4.66 |
| CVE-2026-24072 | متوسطة | mod_rewrite (ap_expr) | تصعيد الامتيازات | ≤ 2.4.66 |
| CVE-2026-28780 | منخفضة | mod_proxy_ajp | تجاوز سعة المخزن المؤقت في الكومة (Heap Buffer Overflow) | ≤ 2.4.66 |
| CVE-2026-29168 | منخفضة | mod_md (OCSP) | استنزاف الموارد | 2.4.30 – 2.4.66 |
| CVE-2026-29169 | منخفضة | mod_dav_lock | إلغاء مرجعية مؤشر فارغ / DoS | ≤ 2.4.66 |
تم إصلاح جميع الثغرات في Apache HTTP Server 2.4.67.
هذه الأدوات مخصصة للاستخدام فقط ضد الأنظمة التي تملكها أو لديك إذن كتابي صريح لاختبارها. قد يكون الفحص غير المصرح به غير قانوني في نطاق سلطتك القضائية.
مجموعة الأدوات دفاعية بالتصميم:
Server: ويستخدم تفاوض TLS ALPN القياسي — وهي نفس الآلية التي يستخدمها كل متصفح حديث للتفاوض على HTTP/2..
├── apache_passive_audit.py # External asset audit (banner-grab + ALPN)
├── apache_local_audit.py # On-host / SSH local audit
├── LICENSE # MIT
├── .gitignore
└── README.md
python3 الافتراضي في Ubuntu 18.04 وجميع الإصدارات الأحدث.git clone https://github.com/sibersan/cve-2026-23918.git
cd cve-2026-23918
chmod +x apache_passive_audit.py apache_local_audit.py
apache_passive_audit.pyيقرأ ترويسة HTTP Server: لاكتشاف إصدار Apache ويطابقها مع جدول CVE. بالإضافة إلى ذلك، بالنسبة لأهداف HTTPS، ينفذ تفاوض TLS ALPN قياسي لتحديد ما إذا كان HTTP/2 مكشوفًا — وهذا هو الشرط المسبق الرئيسي لاستغلال CVE-2026-23918. لا يتم إرسال أي حمولات استغلال.
يعرض البرنامج النصي h2 وhttp/1.1 في امتداد ALPN الخاص بمصافحة TLS (RFC 7301). اختيار الخادم هو الإجابة القياسية الواضحة على سؤال "هل HTTP/2 مفعّل؟" — وهي الآلية نفسها التي يستخدمها كل متصفح حديث وcurl. لا يؤدي ذلك إلى تفعيل الثغرة أو أي سلوك غير معتاد.
قرار المخاطر يعكس ذلك:
# Single target
python3 apache_passive_audit.py -t https://web.example.com
# Multiple targets
python3 apache_passive_audit.py -t https://a.example.com -t https://b.example.com
# Targets file, parallel, CSV + JSON output
python3 apache_passive_audit.py -f targets.txt -w 20 -o report.csv --json report.json
# CI / log-friendly (no colors)
python3 apache_passive_audit.py -f targets.txt --no-color
صيغة targets.txt (هدف واحد في كل سطر، مع # للتعليقات):
https://www.example.com
intranet.example.local:8443
# old staging box
http://10.0.5.12
| الخيار | الوصف |
|---|---|
-t, --target | هدف واحد (يمكن تكراره) |
-f, --file | ملف قائمة الأهداف |
-o, --csv | إخراج تقرير CSV |
--json | إخراج تقرير JSON |
--timeout | مهلة الطلب بالثواني (الافتراضي 10) |
-w, --workers | خيوط عمل متوازية (الافتراضي 10) |
--no-color | تعطيل الإخراج الملون |
| الكود | المعنى |
|---|---|
| 0 | جميع الأهداف آمنة |
| 1 | هدف واحد على الأقل UNKNOWN أو ERROR |
| 2 | هدف واحد على الأقل VULNERABLE أو AT_RISK |
| المستوى | المعنى |
|---|---|
VULNERABLE | الإصدار يطابق نطاق CVE المذكور في النشرة وتوفر شرطه المسبق (مثل تفعيل HTTP/2) |
AT_RISK | إصدار غير مُحدَّث لكن الشرط المسبق عالي الخطورة غير متوفر؛ لا تزال ثغرات CVE أخرى تنطبق |
SAFE | الإصدار ≥ 2.4.67 |
UNKNOWN | شعار الخادم مخفي (ServerTokens Prod) أو محجوب بواسطة وكيل عكسي/WAF — تحقق باستخدام برنامج التدقيق المحلي |
NOT_APACHE | ليس Apache (nginx أو IIS أو غيرها) |
ERROR | خطأ في الاتصال |
ServerTokens Prod أو Minimal تخفي الإصدار — يعيد البرنامج النصي النتيجة UNKNOWN بصدق. استخدم التدقيق المحلي للتأكيد.apache_local_audit.pyيعمل على المضيف المستهدف (أو عبر SSH) ويفحص الملف الثنائي لـ Apache والإصدار والوحدات المحمّلة وإعدادات HTTP/2. كما يقيّم الشروط المسبقة للاستغلال: على سبيل المثال، إذا كان الإصدار 2.4.66 لكن HTTP/2 معطّل، يتم تخفيض المخاطر الخاصة بـ CVE-2026-23918 وفقًا لذلك.
sudo python3 apache_local_audit.py
# JSON report (for centralized inventory)
sudo python3 apache_local_audit.py --json /var/log/apache_audit_$(hostname).json
# Custom binary path
sudo python3 apache_local_audit.py --binary /opt/apache/bin/httpd
httpd -v / apache2 -v — الإصدارhttpd -V — معلومات البناء، HTTPD_ROOT، SERVER_CONFIG_FILEapache2ctl -M أو httpd -M — الوحدات المحمّلةdpkg-query / rpm -q — إصدار الحزمةInclude/IncludeOptional (بما في ذلك sites-enabled/ وmods-enabled/ الخاصة بـ Debian) → توجيه Protocols (h2 / h2c / http/1.1)| الخيار | الوصف |
|---|---|
--binary | مسار ملف Apache الثنائي (يتجاوز الاكتشاف التلقائي) |
--json | إخراج تقرير JSON |
--no-color | تعطيل الإخراج الملون |
| الكود | المعنى |
|---|---|
| 0 | SAFE |
| 1 | PATCH_NEEDED أو UNKNOWN |
| 2 | VULNERABLE أو AT_RISK |
| المستوى | المعنى |
|---|---|
VULNERABLE | إصدار غير مُحدَّث + توفر الشروط المسبقة لثغرة CVE عالية الخطورة (مثل تفعيل HTTP/2) |
AT_RISK | إصدار غير مُحدَّث + توفر شرط مسبق واحد على الأقل من شروط CVE |
PATCH_NEEDED | إصدار غير مُحدَّث لكن لا توجد وحدة/بروتوكول ذو صلة مفعّل — قم بالتحديث على أي حال |
SAFE | الإصدار ≥ 2.4.67 |
UNKNOWN | تعذر اكتشاف الإصدار |
يُوصى باستخدام sudo/root لقراءة التكوين بشكل كامل. بدون ذلك، قد يتعذر قراءة بعض الملفات في sites-enabled/ أو mods-enabled/ أو /etc/httpd/conf.d/.
لتشغيل التدقيق المحلي على عدة مضيفين وجمع التقارير بشكل مركزي، إليك مثال باستخدام Ansible ad-hoc:
ansible all -i inventory.ini -b -m script \
-a "apache_local_audit.py --json /tmp/apache_audit.json --no-color"
ansible all -i inventory.ini -b -m fetch \
-a "src=/tmp/apache_audit.json dest=./reports/ flat=no"
يمكن دمج ملفات JSON المجمّعة باستخدام jq أو برنامج Python صغير.
بالنسبة لـ CVE-2026-23918 (حتى يتم التصحيح):
h2 وh2c من توجيه Protocols في إعداداتك، أو نفّذ sudo a2dismod http2 على Debian/Ubuntu، ثم أعد تحميل الخدمة.mod_dav_lock إذا لم يكن قيد الاستخدام (CVE-2026-29169)..htaccess (CVE-2026-24072).النشرة الرسمية: https://httpd.apache.org/security/vulnerabilities_24.html
نرحب بطلبات السحب (Pull requests). عند إضافة ثغرة CVE جديدة، يرجى: