تحديث أمان PHP الصادر في 21 أكتوبر 2026 متاح الآناقرأ النشرة الرسمية ↗
Globya PHP2Shell Checkerby Globya Information Technologies
العربية

كيفية إصلاح PHP2Shell

موقف php.net واضح: «لا توجد تدابير مؤقتة كاملة، والتحديث هو الخيار الآمن الوحيد». يشرح هذا الدليل التحديث، وإعادة التشغيل التي كثيرًا ما تُنسى، والتحقق، وما يجب فحصه إن كان الخادم مكشوفًا.

1 اعثر على كل نسخة PHP على الخادم

تشغّل خوادم كثيرة أكثر من نسخة PHP واحدة: حزمة النظام، والإصدارات التي تثبّتها لوحة التحكم (cPanel EA-PHP، وPlesk، وCWP/CloudLinux alt-php، وDirectAdmin)، والحاويات، وبنى سطر الأوامر التي يستخدمها cron. يجب تحديث كل نسخة تخدم طلبات الويب.

شغّل php -v، واعرض عمليات php-fpm باستخدام ps aux | grep php-fpm، وراجع أداة اختيار PHP في لوحة التحكم لديك.

2 حدّث إلى إصدار مُصلَح

الإصدارات المُصلَحة من المصدر الأصلي هي 8.5.12 و8.4.27 و8.3.36 و8.2.35. قد تتضمن حزم التوزيعات الإصلاح تحت رقم إصدار أقدم، فراجع سجل التغييرات بحثًا عن CVE-2026-109618 وCVE-2026-109619.

لا يصدر مشروع PHP أي إصدار لـ PHP 8.1 وما قبله. نُشرت إصلاحات منقولة مصغّرة على مستوى الشفرة المصدرية للإصدارات 7.4 و8.0 و8.1 لمن يبني من المصدر، لكن الحل الدائم هو الانتقال إلى فرع مدعوم.

Debian / Ubuntu (حزم التوزيعة)

ثبّت التحديث الأمني من توزيعتك وأعد تشغيل PHP. قد يبقى رقم الإصدار كما هو؛ ويُذكر رقم CVE في سجل تغييرات الحزمة.

sudo apt update && sudo apt install --only-upgrade 'php*'
sudo systemctl restart 'php*-fpm' apache2 2>/dev/null
apt changelog php8.3-fpm | grep -i -m3 CVE-2026-1096
RHEL / AlmaLinux / Rocky (dnf)

طبّق تحديثات المورّد (errata) لتدفق وحدة PHP لديك، ثم أعد التشغيل.

sudo dnf upgrade --refresh 'php*'
sudo systemctl restart php-fpm httpd
rpm -q --changelog php-common | grep -i -m3 CVE-2026-1096
Docker / صور php الرسمية

اسحب الصورة بالوسم المُصلَح أو أعد بناءها، ثم أعد إنشاء الحاويات.

docker pull php:8.3-fpm   # must report 8.3.36 or later
docker compose up -d --build --force-recreate
docker compose exec app php -v
cPanel, Plesk, CWP, DirectAdmin

استخدم أداة التحديث في اللوحة لكل إصدار PHP مثبّت (EA-PHP، ومعالجات PHP في Plesk، وalt-php، وCustomBuild)، ثم أعد تشغيل PHP-FPM. كثيرًا ما تُبقي اللوحات إصدارات قديمة مثبّتة لمواقع بعينها، فحدّثها أو أزلها أيضًا.

الاستضافة المشتركة أو المُدارة

لا يمكنك عادةً تحديث PHP بنفسك. استخدم الرسالة الموجودة في بطاقة النتيجة لتطلب من مزوّدك الإصدار الدقيق وتاريخ التحديث وتأكيد إعادة تشغيل العمليات.

Windows / IIS

نزّل البنية المُصلَحة من windows.php.net، واستبدل مجلد PHP، وأعد تدوير مجمّعات تطبيقات IIS.

3 أعد تشغيل كل عمليات PHP

تثبيت الحزمة لا يغيّر الشفرة التي تعمل بالفعل. أعد تشغيل PHP-FPM وApache (في حالة mod_php) وLiteSpeed وFrankenPHP وعمليات معالجة الطوابير والمشرفين. أما الحاويات، فأعد بناء الصورة أو اسحب الصورة الجديدة، فإعادة تشغيل الصورة نفسها لا تثبّت أي إصلاح.

4 تحقّق

شغّل php -v لكل ملف تنفيذي، وتأكد من أن العمليات الجارية تستخدم البنية الجديدة (مثلًا يجب ألا يُظهر ls -l /proc/$(pgrep -o php-fpm)/exe الكلمة «deleted»). ثم شغّل هذا الفحص مرة أخرى.

5 إن لم تتمكن من التحديث اليوم

طبّق التدابير المؤقتة الجزئية أدناه، وقيّد من يمكنه الوصول إلى الموقع حتى تتمكن من التحديث. هذه التدابير تقلل الخطر ولا تزيله.

6 ابحث عن علامات الاختراق — وغيّر الأسرار

إن كان موقع متأثر متاحًا من الإنترنت، فراجع النشاط اعتبارًا من 20 أكتوبر 2026: أعطال عمليات PHP (SIGSEGV) في سجل أخطاء PHP-FPM أو Apache، وملفات PHP جديدة أو معدّلة في جذر الموقع، ومهام cron جديدة، وحسابات مسؤولين جديدة، واتصالات صادرة غير متوقعة.

لأن CVE-2026-109619 قد يكشف ذاكرة عملية PHP دون تشغيل أي شفرة، فإن نظام ملفات نظيفًا ليس دليلًا على عدم تسرّب شيء. غيّر كلمات مرور قواعد البيانات ومفاتيح API وبيانات اعتماد الدفع والبريد، وأبطل جلسات المستخدمين في المواقع التي كانت معرّضة.

7 بعد التحديث

يضيف الإصلاح حدًا صارمًا جديدًا للذاكرة: تُنهى العملية التي تبلغه فورًا ولا تُنفَّذ دوال الإيقاف (shutdown handlers). تحقق من سلوك تطبيقك تحت ضغط الذاكرة، وراجع memory_limit مع post_max_size وmax_input_nesting_level، وتراجع عن أي إعداد مؤقت memory_limit = -1 ضبطته قبل التصحيح. إخفاء الإصدار عبر expose_php = Off تقوية اختيارية، وليس إصلاحًا.

تدابير مؤقتة جزئية (من php.net والنشرات الأمنية)

هذه التدابير تضيّق مسارات الهجوم المعروفة فقط. ينص php.net على أن التحديث هو الخيار الآمن الوحيد.

; php.ini / FPM pool (php_admin_value) — أعد تشغيل جميع العمليات بعد ذلك
session.upload_progress.enabled = 0
fatal_error_backtraces = 0        ; PHP 8.5
post_max_size = 8M                ; 32M إن كان رفع الملفات مطلوبًا
max_input_nesting_level = 16      ; default 64
display_errors = 0

; FPM pool
pm.max_requests = 200

اضبط هذه القيم في php.ini أو في مجمّع PHP-FPM (php_admin_value) أو في إعدادات الخادم، وليس عبر ini_set() أو .user.ini، ثم أعد تشغيل العمليات. تدابير إضافية من النشرات الأمنية وفريق البحث:

  • يمنع memory_limit = -1 بعض المسارات التي تعتمد على حد الذاكرة الخاص بـ PHP، لكنه يترك نفاد الذاكرة لنظام التشغيل؛ فلا تستخدمه إلا مع حد memory.max في cgroup v2. لا تستخدم RLIMIT_AS أو RLIMIT_DATA؛ فقد يفعّلان المسارات المصابة نفسها.
  • خفّض max_input_nesting_level بالقدر الذي تسمح به نماذجك.
  • خفّض pm.max_requests في PHP-FPM كي تُستبدل العمليات بوتيرة أعلى (على حساب الأداء).
  • ضع حدودًا لحجم الطلب وعدد الحقول وعمق التداخل على مستوى خادم الويب أو الوكيل، وأزل إعدادات INI غير الصالحة أو المهملة التي تُضبط لكل طلب.
  • يمكن لسياسات SELinux أو AppArmor تقييد ما يمكن لعملية مخترقة تشغيله؛ فهي تقلل الأثر لكنها لا تمنع كشف الذاكرة.

المراجع

المصدر: النشرة الأمنية لـ php.net بتاريخ 21 أكتوبر 2026. آخر تحقق: 2026-10-23.