آسیب پذیری در php-fpm که امکان اجرای کد از راه دور بر روی سرور را فراهم می کند

در دسترس نسخه های اصلاحی PHP 7.3.11، 7.1.33 و 7.2.24 که در آن حذف شده است بحرانی آسیب پذیری (CVE-2019-11043) در پسوند PHP-FPM (FastCGI Process Manager) که به شما امکان می دهد کد خود را از راه دور بر روی سیستم اجرا کنید. برای حمله به سرورهایی که از PHP-FPM به همراه Nginx برای اجرای اسکریپت های PHP استفاده می کنند، از قبل در دسترس عموم قرار گرفته است. کارگر بهره برداری.

این حمله در پیکربندی‌های nginx امکان‌پذیر است که در آن ارسال به PHP-FPM با جدا کردن بخش‌هایی از URL با استفاده از “fastcgi_split_path_info” و تعریف متغیر محیطی PATH_INFO انجام می‌شود، اما بدون بررسی وجود فایل با استفاده از “try_files $fastcgi_script_name” دستورالعمل یا "if (!-f $) document_root$fastcgi_script_name)". مشکل هم هست ظاهر شد در تنظیمات ارائه شده برای پلتفرم NextCloud. به عنوان مثال، پیکربندی هایی با ساختارهایی مانند:

مکان ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^ (. +؟ \. php) (/.*) $؛
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass php:9000;
}

می توانید حل مشکل را در کیت های توزیع در این صفحات دنبال کنید: دبیان, ریل, اوبونتو, SUSE/openSUSE, FreeBSD, قوس, کلاه نمدی مردانه. به عنوان یک راه حل، می توانید یک بررسی برای وجود فایل PHP درخواستی بعد از خط "fastcgi_split_path_info" اضافه کنید:

try_files $fastcgi_script_name =404;

این مشکل به دلیل یک خطا در هنگام دستکاری نشانگرها در یک فایل ایجاد می شود sapi/fpm/fpm/fpm_main.c. هنگام تخصیص یک اشاره گر، فرض می شود که مقدار متغیر محیطی PATH_INFO باید حاوی پیشوندی باشد که با مسیر اسکریپت PHP مطابقت داشته باشد.
اگر دستور fastcgi_split_path_info تقسیم مسیر اسکریپت را با استفاده از یک عبارت منظم حساس به خط جدید مشخص کند (به عنوان مثال، بسیاری از مثال‌ها استفاده از "^(.+?\.php)(/.*)$" را پیشنهاد می‌کنند)، پس مهاجم می‌تواند اطمینان حاصل کند که مقدار خالی روی متغیر محیطی PATH_INFO نوشته می شود. در این مورد، در ادامه اجرا انجام شده نوشتن path_info[0] تا صفر و فراخوانی FCGI_PUTENV.

با درخواست یک URL فرمت شده به روشی خاص، یک مهاجم می‌تواند به تغییر نشانگر path_info به اولین بایت ساختار «_fcgi_data_seg» دست یابد و نوشتن صفر در این بایت منجر به حرکت «char* pos» می‌شود. اشاره گر به یک ناحیه حافظه که قبلاً قرار گرفته است. بعدی به نام FCGI_PUTENV داده های این حافظه را با مقداری که مهاجم می تواند کنترل کند، بازنویسی می کند. حافظه مشخص شده مقادیر سایر متغیرهای FastCGI را نیز ذخیره می کند و مهاجم با نوشتن داده های آنها می تواند یک متغیر ساختگی PHP_VALUE ایجاد کند و به اجرای کد خود دست یابد.

منبع: opennet.ru

اضافه کردن نظر