مقالات

آسیب‌پذیری بحرانی PHP2Shell چیست؟ راهنمای پچ اضطراری PHP

تا به حال پیش آمده کد PHP شما حتی لود هم نشود، اما سرورتان در همان درخواست اول به هکر شِل (Shell) بدهد؟

دنیای امنیت وب‌سایت‌ها و زیرساخت‌های هاستینگ با کشف و افشای یک جفت آسیب‌پذیری فوق‌العاده خطرناک در هسته زبان برنامه‌نویسی PHP با نام مستعار PHP2Shell (ثبت‌شده با شناسه‌های CVE-2026-109618 و CVE-2026-109619) تکان شدیدی خورد. اگر معمولاً آسیب‌پذیری‌های وب به‌خاطر باگ‌های وردپرس، پلاگین‌های ناقص یا خطاهای برنامه‌نویس رخ می‌دهند، این بار فاجعه درست در موتور پردازش (Runtime) زبان PHP رخ داده است. این یعنی تفاوتی ندارد کدهای برنامه شما چقدر اصولی و امن نوشته شده باشند؛ اگر بسته‌های مفسر PHP روی سرور آسیب‌پذیر باشند، مهاجمان می‌توانند بدون نیاز به هیچ‌گونه احراز هویت یا دسترسی قبلی (Pre-Auth RCE)، کدهای مخرب خود را مستقیماً بر روی سرورهای میزبان اجرا کنند.

با توجه به ضریب شدت بحرانی (CVSS v4.0 Score: 9.2) و گزارش‌های تاییدشده از بهره‌برداری فعال در دنیای واقعی (In-the-wild)، به‌روزرسانی فوری سیستم‌ها یک ضرورت حیاتی است. اما بحران واقعی در محیط‌های عملیاتی (Production) و شرکت‌های هاستینگ کجاست؟ در سرورهایی که ده‌ها نسخه مختلف PHP کنار هم زندگی می‌کنند، فرآیند پچ کردن با یک دستور ساده تمام نمی‌شود. در این مقاله جامع، علاوه بر کالبدشکافی فنی PHP2Shell، به‌صورت کاملاً گام‌به‌گام بررسی می‌کنیم چطور سرورهای لینوکس خام، cPanel، Plesk و CloudLinux را دقیقاً پچ، راستی‌آزمایی و ایمن‌سازی کنیم.


آسیب‌پذیری PHP2Shell چیست و ریشه فنی ماجرا کجاست؟

عبارت PHP2Shell به دو آسیب‌پذیری مستقل اما مرتبط در زمینه اجرای کد از راه دور (Remote Code Execution – RCE) اشاره دارد که نحوه مدیریت حافظه در سطح زبان C در ساختار داخلی مفسر PHP را هدف قرار می‌دهند:

  • ۱. آسیب‌پذیری CVE-2026-109618 (فساد حافظه ناشی از خطای مدیریت OOM): این آسیب‌پذیری زمانی فعال می‌شود که مفسر PHP در حین آماده‌سازی و پردازش یک درخواست وب سنگین، با کمبود حافظه (Out of Memory) مواجه شود. در این حالت، ساختارهای درونی درخواست به‌صورت نیمه‌کاره رها می‌شوند. پاک‌سازی ناقص این بخش باعث می‌شود کدهای Cleanup به داده‌های نامعتبر و ناقص در حافظه اعتماد کنند و مهاجم بتواند جریان اجرای برنامه (Execution Flow) را به دست بگیرد.
  • ۲. آسیب‌پذیری CVE-2026-109619 (حالت سراسری ماندگار یا Stale Global State): این مشکل ناشی از داده‌ها و اشاره‌گرهای داخلی باقی‌مانده‌ای است که بعد از آزادسازی حافظه (Use-After-Free)، عمر آن‌ها از حافظه درخواست مربوطه فراتر می‌رود. در نتیجه، درخواست بعدی که توسط همان پردازشگر یا کارگر (PHP Worker) دریافت و پردازش می‌شود، از این حافظه فاسد استفاده کرده و مسیر سوءاستفاده و اجرای کد برای مهاجم باز می‌شود.

نکته بسیار نگران‌کننده این است که برای سوءاستفاده از این آسیب‌پذیری‌ها، مهاجم فقط باید از طریق شبکه (پورت HTTP/HTTPS) به سرور دسترسی داشته باشد و هیچ‌گونه حساب کاربری، رمز عبور یا لاگین نیاز نیست.


ماجرای افشای زودهنگام، نقش هوش مصنوعی و گاه‌شمار رخداد (Timeline)

یکی از ابعاد خیره‌کننده پرونده PHP2Shell، نقش مستقیم هوش مصنوعی (AI) در کشف آن است. این کلاس از باگ‌ها سال‌ها در کدهای منبع PHP پنهان بود تا اینکه در آگوست ۲۰۲۶، محققی به نام رایان آستین (Ryan Austin) با بهره‌گیری از مدل هوش مصنوعی پیشرفته GPT-5.6 Sol در جریان بازرسی سورس‌کد PHP موفق به کشف آن شد و به‌طور موازی، تیم امنیت سایبری Wiz نیز به اکسپلویت‌های آن دست یافت.

اما برخلاف فرآیندهای هماهنگ و استاندارد افشای آسیب‌پذیری (Coordinated Disclosure)، جزئیات فنی این نقص‌ها پیش از انتشار رسمی وصله‌های امنیتی در تاریخ ۲۰ اکتبر ۲۰۲۶ به بیرون درز کرد و ابزار اثبات مفهوم (PoC) آن با نام php2shell در فضای وب منتشر شد. نگاهی به گاه‌شمار این رخداد ابعاد فاجعه را بهتر نشان می‌دهد:

  • ۲۰ اکتبر ۲۰۲۶: جزئیات آسیب‌پذیری‌ها لو رفت. شرکت امنیت سایبری watchTowr به عنوان نخستین مرجع رسمی، صحت شایعات را تایید کرد و توانست CVE-2026-109618 را با موفقیت بازسازی کند. تیم امنیتی PHP نیز از انتشار اضطراری اصلاحیه در ۲۱ اکتبر خبر داد.
  • ۲۱ اکتبر ۲۰۲۶: مرکز امنیت سایبری ملی بریتانیا (NCSC) هشدار فوری صادر کرد و از سازمان‌ها خواست سیستم‌های خود را بلافاصله آپدیت کنند یا در صورت عدم امکان، موقتاً از دسترس خارج سازند. تیم PHP رسماً نسخه‌های اصلاح‌شده را منتشر کرد.
  • ۲۱ اکتبر ۲۰۲۶ (عصر): شبکه طعمه‌گذار (Honeypot) شرکت watchTowr رسماً شواهدی از حملات و سوءاستفاده‌های واقعی از این آسیب‌پذیری‌ها را در سطح اینترنت رصد کرد.

میزان فراگیری PHP؛ چرا این تهدید تا این حد بزرگ است؟

زبان PHP از سال ۱۹۹۴ ستون فقرات وب را تشکیل داده است. این زبان برای کار با HTML، وب‌سرورها و دیتابیس‌ها بهینه‌سازی شده و سیستم‌های مدیریت محتوای بزرگی مانند وردپرس (WordPress) (که بیش از ۴۳ درصد کل وب‌سایت‌های اینترنت را اداره می‌کند)، فروشگاه‌سازها، فریم‌ورک‌هایی نظیر لاراول (Laravel) و سامانه‌های سازمانی روی آن بنا شده‌اند.

بر اساس آمارهای اواسط سال ۲۰۲۶، PHP سهم ۷۰.۸ درصدی از تمام وب‌سایت‌هایی که زبان برنامه‌نویسی سمت سرور آن‌ها مشخص است را در اختیار دارد؛ این یعنی صدها میلیون سامانه زنده در سراسر جهان در خطر قرار دارند.


کدام نسخه‌های PHP آسیب‌پذیر و کدام ورژن‌ها امن هستند؟

تمام محیط‌هایی که درخواست‌های وب PHP را پردازش می‌کنند در محدوده خطر قرار دارند. پروژه PHP نسخه‌های پایدار را به‌صورت اضطراری آپدیت کرده است. جدول زیر وضعیت نسخه‌های مختلف، آخرین نسخه آسیب‌پذیر و نسخه اصلاح‌شده (امن) را نشان می‌دهد:

شاخه نسخه PHPآخرین نسخه آسیب‌پذیرنسخه اصلاح‌شده (Fixed Version)وضعیت پشتیبانی رسمی
PHP 8.5.x8.5.11 و قدیمی‌تر8.5.12پشتیبانی رسمی فعال
PHP 8.4.x8.4.26 و قدیمی‌تر8.4.27پشتیبانی رسمی فعال
PHP 8.3.x8.3.35 و قدیمی‌تر8.3.36پشتیبانی رسمی فعال
PHP 8.2.x8.2.34 و قدیمی‌تر8.2.35پشتیبانی رسمی فعال
PHP 7.4, 8.0 و 8.1تمامی نسخه‌ها آسیب‌پذیرندنیازمند پچ Backport توزیع‌کنندگان (LTS) یا کامپایل سورسپایان پشتیبانی رسمی (EOL)
PHP 7.3 و قدیمی‌تر (شامل PHP 5.x)تمامی نسخه‌ها آسیب‌پذیرندهیچ اصلاحیه‌ای در PHP.net وجود ندارد (نیازمند پچ Backport یا ارتقا)پایان پشتیبانی رسمی (EOL)

کالبدشکافی فنی اکسپلویت و خطرناک‌ترین بسترهای اجرا

بررسی کدهای اثبات مفهوم (PoC) منتشرشده نشان می‌دهد که مهاجمان بدون نیاز به دسترسی محلی، مکانیزم امنیتی ASLR (تصادفی‌سازی چیدمان فضای آدرس) سیستم‌عامل را از راه دور و صرفاً با ارسال درخواست‌های استاندارد HTTP دور می‌زنند. چرخه حمله در ۴ گام اصلی (Trigger با ارسال درخواست POST چندبخشی، Free یا آزادسازی زودهنگام در zend_hash_update، Reclaim یا تصاحب مجدد حافظه با بافرهای دستکاری‌شده و Execution در مرحله پاکسازی درخواست با فراخوانی zend_call_function) رخ می‌دهد.

کدام بسترها و تنظیمات در بالاترین حد ریسک قرار دارند؟

  • انواع هاستینگ و محیط‌های اجرا (SAPI): فرقی نمی‌کند از PHP-FPM، Apache mod_php، php-cgi، FrankenPHP یا LiteSpeed استفاده می‌کنید؛ تمامی این پیاده‌سازی‌ها در معرض خطرند.
  • خطرناک‌ترین سناریو در Apache mod_php: طبق اعلام رسمی تیم امنیتی PHP، وب‌سرور آپاچی به همراه ماژول mod_php در بالاترین سطح تهدید قرار دارد؛ چرا که اکسپلویت مهاجم می‌تواند در همان ابتدای پردازش درخواست و پیش از اجرای حتی یک خط از کدهای برنامه شما، شِل (Shell) را فعال کند.
  • نقش ویژگی Session Upload Progress: این ویژگی که به‌صورت پیش‌فرض در PHP فعال است، یکی از مسیرهای تاییدشده برای فعال‌سازی آسیب‌پذیری است (البته تنها مسیر نیست).
  • بی‌اثربخشی تغییرات فایل‌های ini به تنهایی: هیچ‌گونه تغییر تنظیمات در فایل‌های پیکربندی php.ini نمی‌تواند به طور کامل جلوی این آسیب‌پذیری را بگیرد و تنها راهکار قطعی، ارتقا و نصب پچ است.

راهنمای عملیاتی پچ اضطراری در سرورهای لینوکس، Plesk، cPanel و CloudLinux

تنها راهکار جامع و قطعی برای رفع کامل این نقص امنیتی، ارتقای PHP به نسخه‌های اصلاح‌شده و ری‌استارت کردن تمامی سرویس‌های وابسته است. پیش از اعمال هرگونه تغییر، حتماً از لاگ‌های وب‌سرور، لاگ‌های PHP و اسنپ‌شات کانفیگ‌ها نسخه پشتیبان تهیه کنید.

بخش اول: آپدیت در سرورهای لینوکس خام (Ubuntu / Debian / AlmaLinux / Rocky)

در سرورهایی که مستقیماً از مخازن رسمی یا مخازن استاندارد مانند Ondřej Surý (در اوبونتو/دبیان) و Remi (در خانواده ردهت) استفاده می‌کنند، دستورات زیر را برای آپدیت و ری‌استارت کارگران PHP اجرا کنید:

# ۱. آپدیت بسته‌های PHP در اوبونتو و دبیان (Ubuntu / Debian):
sudo apt update && sudo apt --only-upgrade install "php*" -y

# ۲. آپدیت بسته‌های PHP در آلما لینوکس، راکی و سنت‌او‌اس (RHEL / AlmaLinux / Rocky):
sudo dnf clean all && sudo dnf update "php*" -y

# ۳. ری‌استارت اجباری سرویس‌های PHP-FPM و وب‌سرور برای پاک شدن نسخه قدیم از RAM:
sudo systemctl restart php8.3-fpm php8.2-fpm
sudo systemctl restart apache2 || sudo systemctl restart httpd
sudo systemctl restart nginx

بخش دوم: راهنمای پچ در کنترل‌پنل Plesk

در پلسک با دو مقوله کاملاً مجزا طرف هستید: PHP وب‌سایت‌ها و انجین اختصاصی خودِ پنل (sw-engine).

  • گام ۱ (شناسایی وضعیت نسخه‌ها و تاریخ بیلد): با SSH به سرور متصل شوید و نسخه پلسک و باینری‌های نصب‌شده را چک کنید:
plesk version
/opt/plesk/php/8.3/bin/php -v
/opt/plesk/php/8.1/bin/php -v

نکته حیاتی برای نسخه‌های قدیمی (7.4، 8.0 و 8.1): شماره نسخه رسمی این شاخه‌ها پس از دریافت پچ Backport تغییر نکرده است! ملاک امن بودن آن‌ها این است که عبارت built: Oct 21 2026 یا تاریخ‌های بعد از آن در خروجی دستور بالا درج شده باشد.

  • گام ۲ (آپدیت سراسری پلسک و کامپوننت‌ها): برای ارتقای هم‌زمان پنل و تمامی PHPها دستورات زیر را اجرا کرده و سپس لیست هندلرها را رفرش کنید:
plesk installer --select-release-latest --upgrade-installed-components
plesk bin php_handler --reread

توجه داشته باشید که حداقل نسخه‌های امن خودِ کنترل‌پنل Plesk عبارتند از: Plesk Obsidian 18.0.80 Update 11 و Plesk Obsidian 18.0.81 Update 4.

بخش سوم: راهنمای پچ در cPanel و EasyApache 4

در سرورهای مبتنی بر cPanel، صرفاً آپدیت کردن WHM کافی نیست و پکیج‌های RPM مربوط به خانواده ea-php باید مستقیماً ارتقا یابند:

  • گام ۱ (پاک‌سازی کش و آپدیت پکیج‌ها):
yum clean all && yum makecache
/scripts/rpmup
  • گام ۲ (اعتبارسنجی از طریق Changelog): برای اینکه ۱۰۰٪ مطمئن شوید پچ در پکیج اعمال شده است، چنج‌لاگ پکیج را مستقیماً با دستور grep بررسی کنید:
rpm -q --changelog ea-php83-php-common | grep -iE 'CVE-2026-109618|CVE-2026-109619'
  • گام ۳ (ری‌استارت سرویس وب‌سرور و FPM): تا زمانی که سرویس‌ها ری‌استارت نشوند، ورکرها نسخه‌های قبلی را در مموری نگه می‌دارند:
/scripts/restartsrv_httpd
/scripts/restartsrv_apache_php_fpm

بخش چهارم: مدیریت پیچیدگی‌های سیستم‌عامل CloudLinux

کلودلینوکس دارای ۳ خانواده مجزای PHP است که باید به همه آن‌ها توجه کنید:

  1. alt-php: نسخه‌های اختصاصی CloudLinux برای سلکتور (PHP Selector) کاربران.
  2. ea-php: نسخه‌های ادغام‌شده با cPanel.
  3. Native PHP: پکیج پیش‌فرض توزیع لینوکس.

برای آپدیت خانواده alt-php در CloudLinux 8 و 9 و بررسی اعمال شدن وصله امنیتی، دستورات زیر را اجرا کنید:

dnf clean all && dnf upgrade "alt-php*" -y

# بررسی اعمال وصله در کلودلینوکس:
rpm -q --changelog alt-php82-common | grep -iE 'CVE-2026-109618|CVE-2026-109619'

اقدامات موقت کاهنده ریسک (Mitigation) اگر الان نمی‌توانید آپدیت کنید

پروژه PHP صراحتاً اعلام کرده است که هیچ راهکار موقتی جایگزین پچ رسمی نمی‌شود. با این حال، برای کاهش سطح حمله تا زمان هماهنگی پنجره نگهداری (Maintenance Window) یا در سرورهای قدیمی، این اقدامات را فوراً اعمال کنید:

  1. غیرفعال کردن Session Upload Progress در سطح سرور:در فایل اصلی php.ini یا تنظیمات FPM مقدار زیر را ست کنید (این مقدار حتماً باید در سطح کل سرور اعمال شود، نه داخل کد برنامه یا .htaccess):
    session.upload_progress.enabled = Off
    ; در صورت استفاده از PHP 8.5 گزینه زیر را هم غیرفعال کنید:
    fatal_error_backtraces = Off
  2. ریست کردن کارگران PHP-FPM پس از هر درخواست (مقابله با CVE-2026-109619):در فایل پیکربندی استخر PHP-FPM (مانند www.conf) مقدار زیر را تنظیم کنید تا هر Worker پس از پردازش یک درخواست ریست شود و وضعیت آلوده در حافظه باقی نماند:
    pm.max_requests = 1
  3. محدودسازی حجم داده‌های ورودی (جلوگیری از خطای OOM):در لایه Reverse Proxy (مانند Nginx) و در php.ini، مقادیر post_max_size و اندازه هدرها را به حداقل نیاز ممکن برسانید تا از تحریک شدن باگ‌های کمبود حافظه (OOM) جلوگیری شود.
  4. پرهیز از توهم امنیت کامل با WAF و Imunify360:رول‌های فایروال وب (WAF)، Cloudflare و ابزارهایی مانند Imunify360 صرفاً الگوهای شناخته‌شده حمله را شکار می‌کنند. اگر مهاجم از پی‌لود مبهم‌سازی‌شده (Obfuscated Payload) استفاده کند، WAF به سادگی دور زده خواهد شد.

شکار تهدید (Threat Hunting): چگونه از نفوذ احتمالی به سرور مطلع شویم؟

مرکز امنیت سایبری ملی بریتانیا (NCSC) توصیه می‌کند که سازمان‌ها در وهله اول دارایی‌های مبتنی بر PHP خود را فهرست‌بندی کرده، سرورهای متصل به اینترنت را در اولویت قرار دهند و رفتار آن‌ها را به دقت زیر نظر داشته باشند. با توجه به اینکه این آسیب‌پذیری‌ها در درون یک درخواست فعال‌سازی می‌شوند، بررسی دقیق لاگ‌های PHP و وب‌سرور بهترین نقطه شروع است. به دنبال شواهد زیر باشید:

  • درخواست‌های چندبخشی (Multipart Requests) غیرمعمول، حجیم یا با تودرتویی بالا.
  • پروسس‌های کارگر PHP که دچار کرش شده یا به سقف محدودیت حافظه (Memory Limit) اصابت کرده‌اند.
  • ایجاد پروسس‌های خط فرمان مشکوک (مانند sh، bash، curl یا wget) توسط پردازش والد php-fpm یا apache2.
  • فایل‌های ناشناخته (وب‌شل‌ها) نوشته شده در دایرکتوری روت وب، تسک‌های کران (Cron Jobs) ناشناخته یا ارتباطات خروجی شبکه (Outbound Connections) غیرقابل توضیح توسط پروسس‌های PHP.

می‌توانید از دستورات زیر برای بررسی سریع لاگ‌ها و فایل‌های مشکوک در سرور لینوکس استفاده کنید:

# ۱. جستجوی خطاهای کمبود حافظه (OOM) یا کرش کارگران در لاگ‌های PHP و وب‌سرور:
grep -iE "Allowed memory size|segfault|exit signal|child .* exited on signal" /var/log/php* /var/log/nginx/error.log /var/log/apache2/error.log

# ۲. یافتن فایل‌های PHP که در ۷ روز گذشته در پوشه سایت تغییر کرده یا ساخته شده‌اند:
find /var/www/ /home/*/public_html/ -type f -name "*.php" -mtime -7 -ls

# ۳. بررسی پردازش‌های مشکوک در حال اجرا مرتبط با PHP:
ps aux | grep php

چک‌لیست نهایی مدیر سیستم (SysAdmin Checklist)

پیش از بستن پرونده این آسیب‌پذیری در سازمان یا شرکت هاستینگ خود، این ۴ مورد کلیدی را تیک بزنید:

  • ✅ ۱. عدم اشتباه گرفتن خروجی ترمینال با هندلر واقعی: آیا مطمئن هستید که خروجی دستور php -v در ترمینال (نسخه CLI پیش‌فرض) را با هندلر واقعی سایت‌ها در کنترل‌پنل اشتباه نگرفته‌اید؟
  • ✅ ۲. ری‌استارت کامل پردازش‌ها: آیا سرویس‌های php-fpm، httpd، nginx و lsws پس از آپدیت پکیج‌ها ری‌استارت شده‌اند؟
  • ✅ ۳. آپدیت انجین داخلی کنترل‌پنل سرور: آیا موتور داخلی پنل مدیریت سرور (مانند sw-engine در پلسک یا سرویس‌های WHM) آپدیت شده است؟
  • ✅ ۴. بررسی رفتار پردازش‌ها و لاگ‌ها: آیا لاگ‌های دسترسی وب‌سرور و پردازش‌های فعال (ps aux | grep php) را برای کشف رفتارهای غیرعادی چک کرده‌اید؟

سوالات متداول (FAQ) درباره آسیب‌پذیری PHP2Shell

۱. آیا سایت‌های وردپرسی که تمام پلاگین‌ها و قالب خود را آپدیت کرده‌اند هم در خطرند؟

بله، کاملاً! آسیب‌پذیری PHP2Shell در کدهای وردپرس یا افزونه‌های آن نیست، بلکه در خودِ موتور مفسر PHP روی سرور قرار دارد. حتی اگر وردپرس شما به آخرین نسخه مجهز باشد و پلاگین امنیتی داشته باشید، در صورت قدیمی بودن نسخه PHP سرور، مهاجم می‌تواند پیش از لود شدن کدهای وردپرس، سرور را تسخیر کند.

۲. از کجا بفهمیم PHP 7.4 یا 8.1 روی سرور ما پچ شده است؟

از آنجا که شماره نسخه رسمی شاخه‌های پایان عمر (EOL) تغییر نمی‌کند، باید تاریخ بیلد باینری را با دستور php -v بررسی کنید تا عبارت built: Oct 21 2026 (یا جدیدتر) در آن درج شده باشد، و یا در سیستم‌های RPM-based با دستور rpm -q --changelog وجود شناسه‌های CVE-2026-109618 و CVE-2026-109619 را تایید نمایید.

۳. اگر امکان آپدیت فوری سرور را در ساعات کاری نداریم چه کنیم؟

بلافاصله در فایل php.ini اصلی سرور مقدار session.upload_progress.enabled = Off را قرار دهید، در تنظیمات PHP-FPM مقدار pm.max_requests = 1 را ست کنید و سرویس PHP-FPM را ری‌استارت نمایید تا در اولین فرصت پچ اصلی را نصب کنید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *