
PHP 8.4.26 - حرجة - عن بُعد - OOM longjmp - CVE-2026-109618 PHP2Shell. طلب multipart مقسّم غير مُصادَق يتجاوز memory_limit قبل كود التطبيق على Apache mod_php. مخبر مقابل 8.4.27. استُنتج تنفيذ التعليمات عن بُعد (RCE) من الاستشارة الأمنية.
يمكن لأي شخص على الإنترنت التحدث إلى موقع PHP الخاص بك بالطريقة نفسها التي يتحدث بها المتصفح، دون كلمة مرور. على إصدار PHP الأخير المتأثر، يمكنه إرسال طلب رفع ملف مُصمَّم بعناية يجعل المحرك ينفد من الذاكرة أثناء قراءته للطلب، قبل أن يبدأ تطبيقك. عندها يخرج PHP من ذلك العمل بقفزة بينما الطلب نصف مبني فقط. أظهر فريق PHP أن تنظيف تلك الحالة نصف المبنية يمكن أن يتحول إلى تنفيذ شيفرة عن بُعد بصلاحيات عامل الويب. يثبت هذا المختبر قفزة نفاد الذاكرة على Apache mod_php 8.4.26 وأن 8.4.27 يُكمل الطلب نفسه بشكل نظيف.
الفئة: OOM longjmp / إجهاض بدء الطلب الوصول: عن بُعد
PHP 8.4.26 (php:8.4.26-apache) مقابل المُرقَّع 8.4.27 - php.net
يشغّل Apache mod_php دائمًا إغلاق الطلب، حتى عندما يفشل بدء الطلب. الثغرة CVE-2026-109618 هي longjmp() عند memory_limit أثناء تحليل rfc1867 بينما يكون دلو HashTable مرئيًا للتفكيك بالفعل. المختبر عبارة عن POST من نوع multipart/form-data مُجزَّأ بدون Content-Length صالح ومع ~3000 ترويسة جزء إضافية تحت memory_limit=8M. يُرجع 8.4.26 الخطأ Fatal error: Allowed memory size ... in Unknown on line 0. يُرجع 8.4.27 علامة البقاء على قيد الحياة ويشغّل index.php. طلب GET للعامل بعد المحفّز لا يزال يُرجع 200 على كلا الجانبين. تنفيذ الشيفرة عن بُعد بصلاحيات عامل Apache مُستنتَج من GHSA.
| المعرّف | CVE-2026-109618 |
| الاستشارة | GHSA-w8hw-w9fx-j79w |
| الفئة | OOM longjmp / إجهاض بدء الطلب (تنفيذ الشيفرة عن بُعد مُستنتَج من الاستشارة) |
| الوصول | عن بُعد (HTTP بدون مصادقة) |
| CWE | CWE-416 / CWE-824 / CWE-755 |
| CVSS | حرجة: 9.2 CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H (فريق PHP) |
| المنتج | PHP |
| المتأثر | PHP 8.2 قبل 8.2.35، و8.3 قبل 8.3.36، و8.4 قبل 8.4.27، و8.5 قبل 8.5.12 (تثبيت المختبر 8.4.26) |
| المُصلَح | 8.2.35 / 8.3.36 / 8.4.27 / 8.5.12 (21 أكتوبر 2026) |
| المصادقة | لا شيء |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1 فقط |
الشقيقة: CVE-2026-109619 استخدام-بعد-تحرير (UAF) لعامل عام قديم (زوج PHP2Shell).
| الطريقة | المَصبّ | الصلاحية |
|---|---|---|
POST غير مُصادَق من نوع multipart/form-data مع Transfer-Encoding: chunked، وترويسات أجزاء إضافية كثيرة، وmemory_limit محدود | تحليل rfc1867 / longjmp عبر zend_bailout أثناء php_request_startup | التوافر (مُثبَت في المختبر): إجهاض بدء الطلب قبل index.php على 8.4.26 (Unknown on line 0). السلامة (مُستنتَج): يمرّ الإغلاق على $_POST/$_FILES نصف المُهيَّأة؛ أظهر المورّد تنفيذ الشيفرة عن بُعد بصلاحيات عامل Apache (www-data في الصورة الرسمية). الاستطلاع (مُستنتَج): كشف بقايا كومة الطلب. |
| المحفّز نفسه على 8.4.27 | OOM ناعم مؤجَّل | مُغلق (مُثبَت في المختبر): علامة البقاء على قيد الحياة HTTP 200، files=1، يبقى العامل قائمًا. |
| GET بعد المحفّز | العامل لا يزال حيًّا | مُثبَت في المختبر: لم يتلقَّ هذا التثبيت SIGSEGV ولم يسجّل zend_mm_heap corrupted. |
تسجيل الدخول، مسار التطبيق، .so مخصص، صدفة عكسية | لا ينطبق | مُغلق. لم تُجرَّب السيطرة على RIP. |
مُثبَت في المختبر مقابل مُستنتَج: الفرق في OOM-longjmp بين 8.4.26 و8.4.27 مُثبَت في المختبر. موت العامل عبر UAF وتنفيذ الشيفرة عن بُعد مُستنتَجان من GHSA-w8hw-w9fx-j79w. عادةً ما يُنهي FPM العملية الفرعية عند فشل البدء؛ ولم يعرض المورّد استغلالًا كاملًا لـ FPM لهذه الثغرة.
المتطلبات: Apache apache2handler. memory_limit محدود (لا تضبطه على -1؛ فذلك هو التخفيف). تحليل multipart مُفعَّل. الصورة الرسمية php:8.4.26-apache مقابل php:8.4.27-apache.
python3 php-oom-longjmp-Abraxas-Labs.py
أو cd lab && ./run.sh. Loopback 127.0.0.1:18220 (8.4.26) مقابل 127.0.0.1:18221 (8.4.27). مشروع Compose cve-2026-109618. الشاهد CVE-2026-109618-OOM-WITNESS. السطر الأخير:
SUCCESS CVE-2026-109618 vuln-crash=yes patched-ok=yes sapi=apache2handler vuln-image=php:8.4.26-apache patched-image=php:8.4.27-apache how=oom-longjmp-startup-fatal trigger=header-bomb-chunked asan=no CVE-2026-109618-OOM-WITNESS
مختبر مُصرَّح به فقط. يتواصل عبر loopback.
حدِّث إلى PHP 8.4.27 (أو 8.2.35 / 8.3.36 / 8.5.12). تستبدل الرقعة longjmp() الخاص بـ OOM بـ soft OOM مؤجَّل عند نقطة أمان VM التالية و_exit() صارم بعد عتبة أعلى (31c0ea7). حتى ذلك الحين: اضبط memory_limit=-1 للمدير بحيث لا تستطيع التطبيقات تجاوزه؛ أبقِ post_max_size منخفضًا؛ حدِّد أجزاء multipart والترويسات. لا تستخدم RLIMIT_AS أو RLIMIT_DATA.
مختبرات أبراكساس [email protected]