
كشوفات Zeek وSuricata لـ "php2shell" CVE-2026-109618 وCVE-2026-109619
كشوفات Zeek وقواعد Suricata لمؤشرات HTTP المرتبطة بـ "php2shell" CVE-2026-109618 / CVE-2026-109619، احتمال تنفيذ تعليمات عن بُعد (RCE) في معالجة الذاكرة longjmp() في PHP. تحدد النتائج حركة مرور مشبوهة أو برمجيات قد تكون متأثرة.
يتطلب Zeek 7.0.0 أو أحدث. التثبيت باستخدام Zeek Package Manager:
zkg install https://github.com/corelight/php2shell-detect
حمّل الحزم المثبّتة باستخدام @load packages في إعدادات Zeek الخاصة بك.
للحصول على نسخة مباشرة من المستودع، حمّل /path/to/php2shell-detect/scripts.
تستخدم الحزمة واجهات Zeek القياسية الخاصة بـ HTTP وتحليل الملفات والإشعارات والعنقود.
تفحص الحزمة أطوال أسماء حقول POST، وبُنى بيانات مُسلسلة مختارة، ورؤوس MIME المتكررة. كما تربط المعاملات المشبوهة ذات الصلة باستخدام ملفات تعريف ارتباط الجلسة المُهيّأة. توفّر رؤوس الاستجابة جردًا منفصلًا لإصدار PHP. يجب أن تكون حركة المرور مرئية لمحلّل HTTP الخاص بـ Zeek؛ ويتطلب HTTP المشفّر فك التشفير قبل الفحص.
جميع أنواع الإشعارات تقع تحت PHP2SHELL:::
| الإشعار | الملاحظة |
|---|---|
PHP_Crash_Sequence | معاملات HTTP مشبوهة ذات صلة ضمن جلسة واحدة |
Multipart_Header_Flood | تكرار مفرط لرؤوس MIME المعروفة |
Large_Form_Key | اسم حقل نموذج مُرمّز بعنوان URL طويل بشكل غير معتاد |
Serialized_Integer_Overflow | رمز عدد صحيح مُسلسل كبير بشكل غير معتاد |
Serialized_Integer_Collisions | نمط مفتاح عدد صحيح مُسلسل معروف |
Serialized_String_Collisions | نمط مفتاح نصي مُسلسل معروف |
Serialized_Duplicate_Array | نمط إدخال مصفوفة مُسلسلة متكرر |
Serialized_Object_Repetition | نمط كائن مُسلسل متكرر |
Potentially_Affected_PHP_Version | يُعلن رأس الاستجابة عن إصدار ضمن النطاق المتأثر المُهيّأ |
تذهب النتائج إلى notice.log القياسي؛ ولا تُنشئ الحزمة أي تدفق سجلات
إضافي. يوفّر حقل sub في الإشعار سياقًا محدودًا مثل اسم الرأس،
وعمق المعاملة، والأعداد، وعيّنة قصيرة مُهرّبة من جسم POST. تقتصر العيّنات
افتراضيًا على 64 بايتًا خامًا قبل التهريب؛ اضبط
notice_body_sample_bytes=0 لحذفها. تُستخدم ملفات تعريف الارتباط وبصماتها
في الذاكرة فقط ولا تُسجّلها هذه الحزمة.
افتراضيًا، يمكن لكل مؤشر طلب مميّز إصدار إشعار لكل معاملة.
تُكبَت المطابقات المتكررة للمؤشر نفسه. اضبط detect_only_once=T
لإيقاف فحص الجسم بعد أول اكتشاف في الطلب في كل معاملة.
إشعارات جرد الإصدارات مستقلة عن اكتشافات الطلبات.
تستخدم جميع الإعدادات مساحة الأسماء PHP2SHELL:::
| الإعداد | الافتراضي | التأثير |
|---|---|---|
detect_only_once | F | الإبلاغ عن كل مؤشر طلب مميّز؛ T يتوقف بعد أول اكتشاف |
max_trans_depth | 3 | فحص أول ثلاث معاملات HTTP لكل اتصال؛ 0 تعني الكل |
inspect_cookies | T | استخدام ملفات تعريف ارتباط الجلسة للربط |
session_cookie_names | {"PHPSESSID"} | أسماء ملفات تعريف الارتباط المستخدمة لربط الجلسات |
correlation_window | 1 min | الحد الأقصى لعمر حالة ربط الجلسة المعلّقة |
max_pending_sessions | 1000 | الحد الأقصى للإدخالات المحتفظ بها في كل جدول ربط |
inspect_post_bodies | T | فحص بيانات كيان POST ورؤوس MIME |
http_body_analysis_byte_depth | 8388608 | سقف تحفّظي قدره 8 MiB على عمل فحص جسم POST، مشترك بين أجزاء MIME؛ 0 تعطّل تسليم الجسم |
body_overlap_bytes | 256 | التداخل المحتفظ به للأنماط التي تعبر أجزاء الجسم |
large_form_key_bytes | 65536 | عتبة بايتات الإرسال لاسم النموذج |
multipart_header_threshold | 128 | عدد رؤوس MIME المعروفة المتكررة اللازمة للاكتشاف |
notice_body_sample_bytes | 64 | الحد الأقصى لبايتات الجسم الخام لكل عيّنة إشعار؛ 0 يحذف العيّنات |
detect_affected_php_versions | T | تفعيل جرد الإصدارات من رؤوس الاستجابة |
php_version_notice_interval | 1 hr | كبت إشعارات الإصدارات لكل عنوان IP خادم عبر المنافذ والإصدارات |
php_fixed_patch_versions | 8.2: 35, 8.3: 36, 8.4: 27, 8.5: 12 | أول تصحيح إصلاحي مؤقت لكل فرع |
على سبيل المثال:
redef PHP2SHELL::detect_only_once = T;
redef PHP2SHELL::notice_body_sample_bytes = 0;
redef PHP2SHELL::session_cookie_names += { "custom_session" };
فحص POST يستخدم أجزاء تحليل الملفات مع تداخل محدود، بدلاً من تجميع الأجسام الكاملة. يحترم عدّ أسماء النماذج فواصل القيم وإنهاء NUL الخام. فقط كيانات POST المؤهلة تتلقى محللاً؛ ميزانيات الجسم وحدود المعاملات تقيّد نطاق الكشف عمداً. هذه المؤشرات غير مكتملة ويمكن أن تطابق أيضاً حركة مرور حميدة.
في عنقود Zeek، يوجّه العمال ملاحظات الجلسات الصغيرة إلى الوكلاء باستخدام Cluster::publish_hrw(). تصل كلتا المرحلتين للجلسة نفسها إلى الوكيل نفسه، الذي يطابقهما ويرفع PHP_Crash_Sequence مباشرة. يحتفظ الإشعار بمعرّف اتصال المتابعة وUID وعمق المعاملة؛ ويحدد peer_descr الوكيل. لا يحتفظ العمال بسجلات الاتصال أو HTTP الكاملة لعمليات الاستدعاء.
تنتهي صلاحية المحفزات والمتابعات غير المتطابقة بعد correlation_window، مع تحديد max_pending_sessions لكل جدول. يحتفظ الوكلاء بأول متابعة غير متطابقة لكل مفتاح جلسة. يبحث المحفز عن ذلك المفتاح مباشرة للتعامل مع الرسائل الواردة بترتيب معكوس؛ يتم دمج المتابعات غير المتطابقة اللاحقة للمفتاح نفسه حتى تتطابق تلك المدخلة أو تنتهي صلاحيتها. تستخدم المطابقة طوابع وقت الملاحظة والعميل والخادم ومنفذ الخادم ومضيف HTTP وملخص الجلسة. يرتبط Zeek المستقل محلياً. يلزم اتصال وكيل عادي.
تستخدم إشعارات الوكيل كبت الإشعارات القياسي المفتاح بـ UID وعمق المعاملة لـ correlation_window. هذا مستقل عن نتائج العمال ولا يوقف فحص جسم العامل. لا تزال المطابقات المتزامنة لملفات تعريف ارتباط جلسات مختلفة على وكلاء مختلفين قادرة على إنتاج إشعارات مكررة قبل انتشار كبت العنقود.
يتم فحص رؤوس استجابة Server وX-Powered-By الخارجية، بما في ذلك الاستجابات لطلبات GET. أسماء الرؤوس غير حساسة لحالة الأحرف. الحد الأدنى المتأثر هو PHP 5.4.0. تفترض الحدود التالية أن التصحيح التالي بعد أحدث الإصدارات المستقرة التي تم فحصها في 18 أكتوبر 2026 سيعالج كلا الخطأين:
| الفرع | أحدث إصدار مستقر عند الفحص | أول إصدار مُصلح مؤقت |
|---|---|---|
| 8.2 | 8.2.34 | 8.2.35 |
| 8.3 | 8.3.35 | 8.3.36 |
| 8.4 | 8.4.26 | 8.4.27 |
| 8.5 | 8.5.11 | 8.5.12 |
الإصدارات المُصلحة المُهيأة والتصحيحات اللاحقة في الفرع نفسه لا تُنبّه. الفروع التي لا تحتوي على حد مُهيأ تبقى مرشحة. تستخدم لواحق البائعين الشائعة الإصدار الرقمي الأساسي. قد تكون اللافتات غائبة أو معاد كتابتها أو تعكس بناء بائع مع إصلاحات مدعومة، لذا فهذه تلميحات جرد.
القواعد الثلاث في
[suricata/php2shell.rules][rules]
تعمل بشكل مستقل عن Zeek. تثبيت حزمة Zeek باستخدام zkg لا يحمّل هذه القواعد في Suricata. القواعد الثلاث جميعها مفعّلة في الملف؛ خيارات تهيئة Zeek لا تؤثر عليها.
| SID | مخزن الفحص | الملاحظة |
|---|---|---|
| 3000650 | http.request_body مع الطريقة POST | علامة كشف في جسم الطلب |
| 3000651 | http.response_header | إصدار PHP متأثر محتمل يُعلن عنه عبر Server أو X-Powered-By |
| 3000652 | http.response_body | إصدار PHP متأثر محتمل في عنوان HTML على شكل phpinfo |
أضف ملف القواعد إلى قائمة rule-files الموجودة في suricata.yaml، مع الاحتفاظ بإدخالات القواعد الأخرى. استخدم المسار المطلق لنسختك المستخرجة:
rule-files:
- /path/to/php2shell-detect/suricata/php2shell.rules
تحقق من صحة إعداداتك، ثم أعد تحميل Suricata أو أعد تشغيله باستخدام إجراء النشر المعتاد لديك:
suricata -T -c /path/to/suricata.yaml
تم التحقق من القواعد باستخدام Suricata 8.0.6. يجب تفعيل فحص جسم HTTP؛ تحدد حدود جسم الطلب/الاستجابة وحدود إعادة تجميع التدفق المحتوى الذي يصل إلى هذه القواعد. يتطلب HTTP المشفر فك التشفير قبل الفحص.
ابحث عن هذه القواعد في سجلات تنبيهات EVE باستخدام alert.signature_id، أو عبر
SID الخاص بها في مخرجات التنبيه المُهيأة لديك. قد تظهر علامة POST في حركة مرور
شرعية ولا تثبت وجود محاولة استغلال. لا يقوم Suricata بإجراء ربط الجلسات الذي
تقدمه حزمة Zeek.