آسیبپذیری PHP2Shell چیست و چرا باید همین امروز سرورهای خود را بررسی کنید؟
بهتازگی دو نقص امنیتی بحرانی در هسته مفسر PHP شناسایی شده که در جامعه امنیت سایبری با نام آسیبپذیری PHP2Shell شناخته میشوند. این باگها از نوع اجرای کد از راه دور (RCE – Remote Code Execution) هستند و به مهاجمان اجازه میدهند بدون نیاز به نام کاربری یا گذرواژه، دستورات دلخواه خود را در سطح سیستمعامل اجرا کنند.
از آنجا که این نقص در هسته باینری PHP قرار دارد، نوع پلتفرم، CMS یا فریمورک اهمیتی ندارد؛ خواه سایت روی وردپرس، لاراول یا یک اسکریپت اختصاصی میزبانی شود، وجود PHP پچنشده کل سرور را در معرض خطر مستقیم قرار میدهد. واژه «Shell» در نام آسیبپذیری PHP2Shell نشاندهنده دسترسی مفسر شل است؛ یعنی نفوذگر با دسترسی کاربر وب (نظیر nobody، apache یا کاربر مجزای اکانت هاستینگ) توانایی خواندن فایلهای محرمانه، سرقت دیتابیس، تزریق بکدور و حتی پیادهسازی سازوکارهای افزایش سطح دسترسی (Privilege Escalation) را خواهد داشت.
با توجه به انتشار عمومی کدهای اثبات مفهوم (PoC) و رصد فعالیتهای مخرب واقعی در سطح اینترنت، ارتقای زیرساخت و رفع این آسیبپذیری یک اقدام اضطراری است.
تحلیل فنی: مکانیزم عملکرد آسیبپذیری PHP2Shell
این نقص امنیتی حاصل زنجیرهای از دو خطای مدیریت حافظه (Memory Corruption) در پردازش درخواستهای ورودی است:
۱. تحلیل CVE-2026-109618 (قطع ناگهانی ناشی از خطای کمبود حافظه – OOM)
در زبان PHP، سقف مجاز مصرف حافظه توسط هر اسکریپت با دایرکتیو memory_limit تعیین میشود. هنگام ارسال درخواستهای سنگین وب (مانند درخواستهای چندبخشی آپلود یا Multipart File Uploads)، اگر حافظه مورد نیاز از سقف تعیینشده فراتر رود، سیستم خطای Out-of-Memory صادر میکند.
هسته PHP برای قطع سریع پردازش و آزاد کردن منابع، جریان عادی کدهای پاکسازی را رها کرده و از تابع پرش اضطراری longjmp() استفاده میکند. اگر این پرش درست در میانه مراحل تخصیص و پیکربندی ساختارهای داخلی درخواست ورودی رخ دهد، پروسه بازیابی با خطا مواجه میشود؛ چراکه بخش پاککننده گمان میکند ساختارها کامل شدهاند و سعی در آزادسازی حافظهای میکند که هرگز مقداردهی اولیه نشده بود. این چرخه ناقص مستقیماً به خطای Use-After-Free (UAF) منجر شده و بستر اجرای پیلودهای شل را فراهم میسازد.
۲. تحلیل CVE-2026-109619 (اشارهگر منقضی یا Stale Pointer در وضعیت سراسری)
هر درخواست وب باید حافظه موقت خود را پس از اتمام چرخه حیات (Lifecycle) بهطور کامل آزاد کند. با این حال، در صورت بروز خطای مهلک (Fatal Error) یا انقضای زمان اسکریپت (Max Execution Timeout)، برخی اشارهگرهای سراسری (Global State) همچنان به بلاکهای حافظه آزادشده اشاره میکنند.
از آنجا که پروسههای پردازشی در وبسرورها (مانند Workerهای PHP-FPM یا سرویسدهندههای Apache و LiteSpeed) جهت افزایش سرعت بازیافت میشوند، درخواست بعدی که روی همان پردازه قرار میگیرد، به این اشارهگرهای منقضی (Stale Pointers) دسترسی پیدا کرده و پیش از آمادهسازی استاندارد متغیرها، خطای Use-After-Free دیگری تولید میکند که منجر به نقض مرزهای امنیتی سرور میگردد.
کدام نسخهها تحت تأثیر آسیبپذیری PHP2Shell هستند؟
تمام نسخههای پیش از بهروزرسانیهای اعلامشده در جدول زیر آسیبپذیر هستند و باید به نسخههای اصلاحشده ارتقا یابند:
| شاخه PHP | نسخه ایمن و پچشده | وضعیت پشتیبانی رسمی |
|---|---|---|
| PHP 8.5 | 8.5.12 به بالا |
فعال |
| PHP 8.4 | 8.4.27 به بالا |
فعال |
| PHP 8.3 | 8.3.36 به بالا |
فعال |
| PHP 8.2 | 8.2.35 به بالا |
فعال |
| PHP 8.1 و قبل از آن | نیاز به پچ های تجاری / توزیعهای سازمانی | پایان دوره پشتیبانی (EOL) |
نکته تخصصی پیرامون Backporting:
سیستمعاملهای سازمانی (مانند RHEL، CloudLinux و Ubuntu LTS) پچهای امنیتی را اغلب مستقیماً روی نسخههای موجود «Backport» میکنند. بنابراین شماره نسخه خروجی دستورphp -vممکن است تغییر نکند اما باگ برطرف شده باشد. برای اطمینان، چنجلاگ پکیج را بررسی کنید.
گام اول: شناسایی تمامی باینریهای PHP روی سرور
برای بررسی کامل و اطمینان از جا نماندن نسخههای جانبی روی کنترلپنلها، دستور زیر را در ترمینال اجرا نمایید:
ls -la /usr/bin/php* /usr/sbin/php-fpm* 2>/dev/null
ls -la /opt/cpanel/ea-php*/root/usr/bin/php 2>/dev/null
ls -la /opt/alt/php*/usr/bin/php 2>/dev/null
ls -la /usr/local/php*/bin/php 2>/dev/null
ls -la /usr/local/lsws/lsphp*/bin/php 2>/dev/null
روشهای بهروزرسانی و رفع آسیبپذیری در کنترلپنلها و توزیعها
۱. سیستمعاملهای لینوکس پایه (بدون پنل)
سیستمهای مبتنی بر دبیان / اوبونتو (Debian / Ubuntu):
sudo apt update
sudo apt install --only-upgrade 'php*'
sudo systemctl restart php*-fpm apache2 nginx 2>/dev/null
سیستمهای مبتنی بر ردهت / آلمالینوکس (RHEL / AlmaLinux / Rocky):
sudo dnf clean all
sudo dnf upgrade 'php*'
sudo systemctl restart php-fpm httpd nginx 2>/dev/null
۲. سرورهای مجهز به cPanel و EasyApache 4
ارتقای پکیجهای ea-php و همگامسازی ابزارهای cPanel:
dnf clean all && dnf upgrade -y 'ea-php*'
/scripts/restartsrv_httpd
/scripts/restartsrv_apache_php_fpm
/scripts/upcp --force
۳. سرورهای CloudLinux (ماژول PHP Selector)
بهروزرسانی پکیجهای محیط اختصاصی alt-php:
dnf clean all && dnf upgrade -y 'alt-php*'
for p in /opt/alt/php*/usr/bin/php; do echo "$p -> $($p -v | head -1)"; done
systemctl restart lsws httpd php-fpm 2>/dev/null
۴. سرورهای مجهز به پلسک (Plesk)
در پلسک، مفسرهای اختصاصی از طریق ابزار installer آپدیت میشوند:
plesk installer update
systemctl restart 'plesk-php*-fpm'
systemctl restart apache2 2>/dev/null || systemctl restart httpd 2>/dev/null
۵. سرورهای مجهز به دایرکتادمین (DirectAdmin)
ارتقای PHP با اسکریپت CustomBuild:
cd /usr/local/directadmin/custombuild
./build update
./build php n
systemctl restart httpd
systemctl restart php-fpm
۶. وبسرورهای لایتاسپید (LiteSpeed Enterprise / OpenLiteSpeed)
ارتقای باینریهای lsphp و ریاستارت پردازهها:
dnf upgrade 'lsphp*'
systemctl restart lsws
killall -9 lsphp 2>/dev/null
تنظیمات موقت کاهش ریسک (Mitigations)
اگر بهدلیل تداخل در کدهای قدیمی یا تأخیر مخازن نمیتوانید سرور را بلافاصله آپدیت کنید، پیکربندیهای زیر در فایل php.ini یا فایل استخر www.conf راههای سوءاستفاده از آسیبپذیری PHP2Shell را محدود میسازند:
۱. کنترل سقف ارسال بادی درخواستها و آپلود:
php_admin_value[post_max_size] = 32M
php_admin_value[upload_max_filesize] = 8M
۲. پیشگیری از بروز پرش اضطراری (longjmp) ناشی از کمبود حافظه:
php_admin_value[memory_limit] = -1
۳. غیرفعالسازی مکانیسم رهگیری آپلود در نشستها:
php_admin_value[session.upload_progress.enabled] = 0
جدول مرجع دستورات ارتقا و سرویسهای مرتبط
| محیط سرور | مسیر کلیدی باینریها | دستور ارتقا | ریاستارت سرویسها |
|---|---|---|---|
| Ubuntu / Debian | /usr/bin/php* |
apt update && apt install --only-upgrade 'php*' |
systemctl restart php*-fpm apache2 |
| AlmaLinux / Rocky | /usr/bin/php* |
dnf upgrade 'php*' |
systemctl restart php-fpm httpd |
| cPanel / EA4 | /opt/cpanel/ea-php*/ |
dnf upgrade 'ea-php*' |
/scripts/restartsrv_httpd && /scripts/restartsrv_apache_php_fpm |
| CloudLinux | /opt/alt/php*/ |
dnf upgrade 'alt-php*' |
systemctl restart lsws / httpd |
| DirectAdmin | /usr/local/php*/ |
cd custombuild && ./build update && ./build php n |
systemctl restart httpd php-fpm |
| Plesk | /opt/plesk/php/ |
plesk installer update |
systemctl restart plesk-php*-fpm |
نظرات کاربران