نسخههای اصلاحی PHP 8.5.12، 8.4.27، 8.3.36 و 8.2.35 به همراه وصلههایی برای شاخههای PHP 7.4، PHP 8.0 و PHP 8.1 که دیگر پشتیبانی نمیشوند (نسخههای آسیبپذیر 5.4 تا 7.3 همچنان وصله نشدهاند) منتشر شدهاند که دو آسیبپذیری حیاتی را برطرف میکنند:
- CVE-2026-109618 - اجرای کد از راه دور، آسیبپذیریای است که توسط کنترلکنندهی خارج از حافظه که تابع longjmp() را اجرا میکند، هنگامی که فرآیند با کمبود حافظه مواجه میشود، ایجاد میشود. این آسیبپذیری میتواند باعث شود که مفسر PHP زمانی که تنها برخی از ساختارهای داخلی مرتبط با پردازش درخواست مقداردهی اولیه شدهاند، خاتمه یابد. سپس تابع تکمیل درخواست به این ساختارها طوری دسترسی پیدا میکند که گویی از قبل مقداردهی اولیه شدهاند، حتی اگر هیچ حافظهای برای آنها اختصاص داده نشده باشد.
بردار حمله اصلی، دستکاری درخواستهای چندبخشی برای خالی کردن حافظه موجود فرآیند است. برای دور زدن محدودیت post_max_size، میتوان هدر Content-Length را حذف کرد و تعداد زیادی هدر HTTP را ارسال کرد. حملات هدفمند به عملیات خاص در برنامههای PHP که حافظه بیش از حد مصرف میکنند نیز امکانپذیر است. این سوءاستفاده برای mod_php تأیید شده است، زیرا حتی پس از شکست، تابع shutdown() را فراخوانی میکند. PHP-FPM پس از شکست، فرآیند فرزند را خاتمه میدهد و حمله را دشوارتر میکند، اما از نظر تئوری غیرممکن نیست.
- CVE-2026-109619 - اجرای کد از راه دور به دلیل آسیبپذیری استفاده پس از آزادسازی به دلیل پاکسازی نادرست وضعیت سراسری مرتبط با یک درخواست خاص. اگر یک درخواست به دلیل خطای مهلک، اتمام زمان یا شرایط خارج از حافظه قطع شود، ممکن است وضعیت سراسری بازنشانی نشود و اشارهگرها ممکن است با وجود آزاد شدن حافظهای که به آن ارجاع میدهند، فعال باقی بمانند. هنگام پردازش یک درخواست بعدی در همان فرآیند، ممکن است به اشارهگر باقیمانده به وضعیت سراسری قدیمی دسترسی پیدا شود.
سوءاستفاده میتواند با ایجاد شرایط خستگی حافظه در طول پردازش درخواست چندبخشی در کد نشانگر پیشرفت آپلود (session.upload_progress) انجام شود. بردار حمله اصلی و تأیید شده، کنترلکننده fatal_error_backtraces در PHP 8.5 است که پس از اتمام، وضعیت ردیابی را بازنشانی نمیکند. در حالت اول، حمله روی mod_php و PHP-FPM امکانپذیر است، در حالی که در حالت دوم، فقط روی mod_php امکانپذیر است. یک حمله تأیید نشده همچنین در پیکربندیهایی ذکر شده است که حاوی دستورالعملهایی هستند که در اوایل پردازش درخواست هشدارهایی را ایجاد میکنند (به عنوان مثال، هشدارهایی در مورد استفاده از پارامترهای قدیمی).
گفته شده است که مسدود کردن کامل آسیبپذیریها فقط با نصب یک بهروزرسانی امکانپذیر است. اقدامات زیر احتمال حملات موفقیتآمیز را کاهش میدهد، اما سیستم را کاملاً ایمن نمیکند:
- تنظیم پارامتر "memory_limit=-1" در php.ini، کنترل میزان مصرف حافظه را برای مهاجم دشوار میکند.
- اگر نیازی به آپلود فایلهای بزرگ ندارید، پارامتر "post_max_size = 8M" را تنظیم کنید. پارامتر "upload_max_filesize" باید کمتر از پارامتر "post_max_size" باشد.
- تنظیم محدودیت برای مصرف قابل قبول حافظه در سطح سیستم، از طریق پارامترهای مصرف حافظه cgroup memory.max یا container، اما نه از طریق محدودیتهای سیستمی RLIMIT_AS و RLIMIT_DATA، که فقط باعث فراخوانی مشکلساز longjmp() میشوند.
- اگر عملکرد مهم نیست، میتوانید تعداد درخواستهای پردازششده توسط یک فرآیند کارگر را با استفاده از pm.max_requests=1 در PHP-FPM و MaxRequestsPerChild در Apache httpd محدود کنید.
- تنظیم در سطح php.ini یا پیکربندی سرور (نه از طریق ini_set() یا FPM .user.ini، زیرا پارامتر باید قبل از پردازش درخواست فعال باشد) پارامتر "session.upload_progress.enabled=0."
- هنگام استفاده از نسخه PHP 8.5، پارامتر "fatal_error_backtraces=0" باید تنظیم شود.
- تنظیمات منسوخ یا اشتباه (مانند assert.* و مسیرهای نادرست در open_basedir) که باعث میشدند پیامهای تشخیصی قبل از مقداردهی اولیه نمایش داده شوند، به ازای هر درخواست حذف شدند.
- رفع مشکلات کد PHP که میتواند منجر به وقفههای زمانی و خطاهای مهلک شود، مانند موارد مربوط به کنترلکنندههای فراخوانی و خرابیهای پردازش دانلود.
- برای جلوگیری از اولین آسیبپذیری در کد نسخههای قدیمیتر PHP، میتوانید فراخوانی longjmp() را در هندلر خارج از حافظه با _exit() جایگزین کنید.
- علاوه بر این، میتوانید مقدار پارامتر max_input_nesting_level را در php.ini کاهش دهید و درخواستهای چندبخشی را مسدود کنید، همانطور که در اطلاعیه اولیه نشان داده شده است.
وضعیت رفع آسیبپذیریها در توزیعها را میتوان در این صفحات ارزیابی کرد: Debian, Ubuntu، سوزه، RHEL، جنتو، آرچ،
فدورا، فریبیاسدی.
ضمیمه ۱: این آسیبپذیریها با استفاده از مدلهای هوش مصنوعی GPT-5.6 و Gemini 4 Argon شناسایی شدند. OpenAI ابزار php2shell-checker را برای آزمایش وبسایتها و فایلهای اجرایی محلی برای یافتن آسیبپذیریها منتشر کرده است، اما این ابزار فقط شماره نسخه PHP برگردانده شده توسط سرور HTTP یا دستور "php -v" را بررسی میکند، بدون اینکه تجزیه و تحلیل دقیقی ارائه دهد.
بهروزرسانی ۲: نویسندهی یک نمونهی اولیه از آسیبپذیری آزادسازی دوگانه گزارش داد که این مشکل در PHP 8.5.12 هنوز وصله نشده و این سوءاستفاده همچنان ادامه دارد. نمایندگان PHP پیش از این اظهار داشتند که این آسیبپذیری ارتباطی با وصلههای آتی ندارد و یک مشکل واقعی نیست. با این حال، نویسندهی این سوءاستفاده ادعا کرد که این یک آسیبپذیری کاملاً متفاوت است.
منبع: opennet.ru
