آسیبپذیری PHP2Shell چیست و nsin چطور سایت PHP شما را همین حالا محافظت میکند
دو نقص بحرانی خود PHP (CVE-2026-109618 و CVE-2026-109619) با یک درخواست آپلود اجرای کد میدهد. ببینید چه چیزی در خطر است، nsin کدام درخواستها را پیش از رسیدن به سرور شما میبندد و چرا باز هم باید PHP را بهروز کنید.
روز ۲۱ اکتبر ۲۰۲۶ تیم PHP وصلههای اضطراری دو آسیبپذیری بحرانی را منتشر کرد که با نام PHP2Shell شناخته میشوند: CVE-2026-109618 و CVE-2026-109619. هر دو امتیاز ۹٫۲ (CVSS v4.0) گرفتهاند و میتوانند بدون هیچ ورود و رمزی روی سرور شما اجرای کد بدهند. جزئیات پیش از زمان هماهنگشده لو رفت و ابزار و مقالههای فنی حمله منتشر شده است.
خبر خوب برای کاربران nsin: محافظت PHP2Shell همین حالا روی همه دامنههای شما روشن است، روی هر پلنی، رایگان و بدون هیچ کاری از سمت شما. خبر مهمتر: این یک سپر موقت است، نه جایگزین بهروزرسانی PHP. در ادامه هر دو را دقیق توضیح میدهیم.
ماجرا چیست؟
این دو نقص در خود موتور PHP هستند، نه در وردپرس، ووکامرس، مجنتو یا کد شما. به همین دلیل سایتی که کدش کاملاً تمیز است هم آسیبپذیر میماند.
| CVE-2026-109618 | CVE-2026-109619 | |
|---|---|---|
| نوع نقص | خرابی حافظه هنگام تمام شدن حافظه (OOM) | حالت سراسری باقیمانده پس از آزاد شدن حافظه |
| نتیجه | اجرای کد از راه دور بدون احراز هویت | اجرای کد از راه دور بدون احراز هویت |
| امتیاز CVSS v4.0 | ۹٫۲ | ۹٫۲ |
نسخههای آسیبپذیر از PHP 5.4 شروع میشوند و با تنظیمات پیشفرض، هم زیر mod_php و هم زیر PHP-FPM، در معرضاند. وصله فقط برای شاخههای زیر آمده است:
- PHP 8.5.12
- PHP 8.4.27
- PHP 8.3.36
- PHP 8.2.35
برای PHP 7 و PHP 5 وصله رسمی وجود ندارد. اگر سایتتان روی این نسخههاست، باید یا ارتقا بدهید یا از توزیع لینوکستان وصله بکپورتشده بگیرید.
چرا خطرناک است: حمله پیش از رسیدن به کد شما رخ میدهد
PHP بدنه یک درخواست multipart/form-data (همان فرم آپلود فایل) را پیش از اجرای هر خط کد برنامه میخواند و تجزیه میکند. تمام راههای شناختهشده برای رسیدن به این دو نقص از همین مسیر میگذرد.
نتیجهاش این است که:
- هیچ افزونه امنیتی داخل سایت نمیتواند جلوی آن را بگیرد، چون اجرا هنوز به آن نرسیده است.
- حالت تعمیر (Maintenance Mode) وردپرس یا مجنتو کمکی نمیکند، چون PHP درخواست را پیش از آن میخواند.
- نیازی به حساب کاربری، لاگین یا هیچ صفحه خاصی نیست. هر آدرسی که PHP پشتش باشد، هدف است.
nsin چه کار میکند
nsin مقابل سایت شما میایستد و درخواست HTTP را پیش از رسیدن به سرور اصلی میخواند. قانون PHP2Shell فقط درخواستهایی را بررسی میکند که ممکن است بدنه multipart داشته باشند، یعنی درخواستهای غیر از GET و HEAD با نوع multipart/form-data. بقیه ترافیک سایت شما را اصلاً لمس نمیکند.
بررسیهایی که بلاک میکنند
این دو نشانه، علامت قطعی حملهاند و بهصورت پیشفرض درخواست را بلاک میکنند:
- فیلد پیشرفت آپلود نشست (
php_session_upload_progress) داخل بدنه. این همان فیلدی است که مسیر نشت حافظه از آن میگذرد و هیچ فرم عادی آن را نمیفرستد. - بدنه multipart بدون Content-Length. PHP حد
post_max_sizeرا با طول اعلامشده میسنجد؛ بدنهای که طولی اعلام نمیکند از این سنجش میگذرد. مرورگرهای واقعی هنگام آپلود طول را میفرستند.
بررسیهایی که فقط ثبت میشوند
شش نشانه دیگر ساختار مشکوک بدنه را زیر نظر دارند و فعلاً فقط در لاگ ثبت میشوند تا مطمئن شویم کاربر واقعی را اشتباه نمیگیرند:
- بدنه فشردهشده (
Content-Encoding) - تعداد بسیار زیاد بخشهای multipart (۵۰۰ و بیشتر)
- تعداد زیاد بخشهای فایل خالی (۵۰ و بیشتر)
- نام فیلد با تو در تویی عمیق (۱۶ سطح و بیشتر)
- بدنهای که هیچ بخش قابلخواندنی ندارد
- بدنه بزرگی که در ابتدای آن هیچ بخش فایل دیده نمیشود
وقتی چنین درخواستی را میبینید، در گزارشهای فایروال با برچسب php2shell و شناسههای CVE ثبت شده است و میتوانید ببینید چه کسی و از کجا امتحان کرده.
چند نکته دربارهی طراحی
- بدون وابستگی به موتور قوانین سنگین. این بررسیها اسکن ساده بایتهاست، نه قانونهای OWASP CRS. حمله دقیقاً وقتی میرسد که سرور شلوغ است؛ پس چیزی در این مسیر نیست که زیر فشار از کار بیفتد و درخواست را بیبررسی رد کند.
- بدنه دستنخورده به مبدأ میرسد. nsin فقط یک بخش اول بدنه (۲۵۶ کیلوبایت) را میخواند و درخواست مجاز را بیتغییر به سرور شما میفرستد.
- هماهنگ با رفتار خود PHP. مرز multipart و نوع محتوا همانطور خوانده میشوند که PHP میخواند، تا درخواستِ حمله با نوشتن عجیب هدر از زیر دید در نرود.
- آپلودهای عادی سالم میمانند. در ترافیک واقعی nsin، درخواستهای آپلودِ بدون طول کمتر از ۰٫۰۲٪ کل آپلودها بودند و بیشترشان اسکنر بودند، نه کاربر.
لازم نیست چیزی روشن کنید
قانون PHP2Shell روی هر دامنه بهصورت خودکار ساخته شده است: بدون بررسی اینکه سایت شما PHP است یا نه (چون ممکن است PHP روی یک مسیر یا زیردامنهای باشد که دیده نشده) و بدون هیچ شرط پلنی. برای سایتِ غیر PHP هم هزینهای ندارد، چون فقط آپلودها را میبیند.
برای دیدن یا تغییر آن:
- در پنل nsin دامنه را باز کنید.
- به Rules و بخش WAF بروید.
- ردیف PHP2Shell را ببینید. میتوانید حالت آن را روی Dry run بگذارید تا چیزی بلاک نشود و فقط ثبت شود، آن را خاموش کنید یا حذف کنید.
اگر قانون را حذف کنید، nsin دوباره آن را برایتان نمیسازد؛ و اگر خاموش باشد، صفحه Recommendations با یک کلیک پیشنهاد روشن کردنش را میدهد. اطلاعات بیشتر دربارهی قانونهای فایروال در مستندات WAF آمده است.
این جایگزین بهروزرسانی PHP نیست
صادقانه بگوییم: تنها راه رفع کامل، وصله کردن PHP است. قانون nsin شکلهای شناختهشده حمله را میبندد، اما محدودیتهایی دارد که باید بدانید:
- دسترسی مستقیم به IP مبدأ. اگر سرور اصلی شما از راه IP خودش، بدون عبور از nsin، جواب بدهد، مهاجم از قانون ما رد میشود. دسترسی مستقیم را در فایروال سرور ببندید و فقط IPهای nsin را مجاز کنید.
- شکلهای ناشناخته. قانون روی نشانههایی ساخته شده که گزارشهای عمومی نام بردهاند. اگر شکل تازهای پیدا شود، بخشهای «فقط ثبت» ما اولین جاییاند که آن را نشان میدهند.
- پروتکلهای دیگر. ترافیکی که از nsin عبور نمیکند (مثلاً SSH یا پورتهای دیگر خودِ سرور) زیر پوشش نیست.
چکلیست عملی برای امروز
- نسخه PHP را ببینید:
php -vیا صفحه وضعیت هاست. اگر پایینتر از 8.2 است، ارتقا را برنامهریزی کنید. - وصله را نصب کنید: 8.5.12، 8.4.27، 8.3.36 یا 8.2.35. اگر هاست اشتراکی دارید، از پشتیبانی هاست بپرسید چه زمانی بهروز میشود.
- دسترسی مستقیم به مبدأ را ببندید و فقط IPهای nsin را مجاز بگذارید.
- در پنل nsin ردیف PHP2Shell را ببینید و مطمئن شوید روشن است (حالت Enforce).
- لاگ فایروال را در روزهای آینده نگاه کنید: تلاشهای بلاکشده را با برچسب
php2shellببینید. - اگر همین حالا نمیتوانید PHP را بهروز کنید، تا زمان وصله دسترسی مستقیم به سرور را کاملاً ببندید و قانون nsin را روشن نگه دارید.
پرسشهای متداول
آیا باید چیزی در پنل روشن کنم؟
نه. قانون PHP2Shell روی همه دامنهها خودکار ساخته شده و حالت آن Enforce است. فقط اگر خودتان آن را خاموش یا حذف کرده باشید، لازم است دوباره روشنش کنید.
سایت من PHP نیست؛ آیا چیزی را خراب میکند؟
نه. قانون فقط درخواستهای multipart غیر از GET و HEAD را میخواند و برای سایتِ بدون PHP هیچ اثری ندارد.
آیا آپلود فایل در سایت من قطع میشود؟
آپلودهای عادی از مرورگر عبور میکنند. اگر نگران هستید، حالت Dry run را انتخاب کنید و چند روز لاگ را ببینید؛ هیچ درخواستی بلاک نمیشود و هر تطبیق ثبت میشود.
اگر PHP را وصله کنم، باز هم این قانون لازم است؟
دیگر برای همان دو نقص لازم نیست، ولی نگه داشتنش ضرری ندارد: اسکنرهایی را که هنوز دنبال سایتهای وصلهنشده میگردند زودتر از سرور شما میگیرد.
سایت من روی PHP 7 است. چه کنم؟
وصله رسمی برای PHP 7 منتشر نشده است. بهترین راه ارتقا به یکی از نسخههای وصلهشده است. تا آن زمان قانون nsin را روشن نگه دارید و دسترسی مستقیم به مبدأ را ببندید.
گام بعدی
اگر هنوز دامنهتان پشت nsin نیست، با پنل nsin اضافهاش کنید تا محافظت PHP2Shell و فایروال وب همراه بقیه امکانات CDN nsin برایش فعال شود. برای محافظت از فرمها و ورودها در برابر ترافیک خودکار هم محدودسازی نرخ و محافظت در برابر ربات را بخوانید.
