Kerentanan PHP-fpm yang membenarkan pelaksanaan kod jauh pada pelayan

Available keluaran pembetulan PHP 7.3.11, 7.1.33 dan 7.2.24, di mana dihapuskan kritikal kelemahan (CVE-2019-11043) dalam sambungan PHP-FPM (FastCGI Process Manager), yang membolehkan anda melaksanakan kod anda dari jauh pada sistem. Untuk menyerang pelayan yang menggunakan PHP-FPM bersama-sama dengan Nginx untuk menjalankan skrip PHP, ia sudah tersedia secara umum bekerja mengeksploitasi.

Serangan itu mungkin dalam konfigurasi nginx di mana pemajuan ke PHP-FPM dijalankan dengan mengasingkan bahagian URL menggunakan "fastcgi_split_path_info" dan mentakrifkan pembolehubah persekitaran PATH_INFO, tetapi tanpa terlebih dahulu menyemak kewujudan fail menggunakan "try_files $fastcgi_script_name" arahan atau "jika (!-f $) document_root$fastcgi_script_name)". Masalahnya juga muncul dalam tetapan yang ditawarkan untuk platform NextCloud. Sebagai contoh, konfigurasi dengan struktur seperti:

lokasi ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^ (. +? \. php) (/.*) $;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass php:9000;
}

Anda boleh menjejaki penyelesaian masalah dalam kit pengedaran pada halaman ini: Debian, RHEL, Ubuntu, SUSE/openSUSE, FreeBSD, Arch, Fedora. Sebagai penyelesaian, anda boleh menambah semakan untuk kewujudan fail PHP yang diminta selepas baris "fastcgi_split_path_info":

try_files $fastcgi_script_name =404;

Masalahnya disebabkan oleh ralat semasa memanipulasi penunjuk dalam fail sapi/fpm/fpm/fpm_main.c. Apabila memberikan penunjuk, diandaikan bahawa nilai pembolehubah persekitaran PATH_INFO mesti mengandungi awalan yang sepadan dengan laluan ke skrip PHP.
Jika arahan fastcgi_split_path_info menentukan pembahagian laluan skrip menggunakan ungkapan biasa sensitif baris baharu (contohnya, banyak contoh mencadangkan menggunakan "^(.+?\.php)(/.*)$"), maka penyerang boleh memastikan bahawa nilai kosong ditulis kepada pembolehubah persekitaran PATH_INFO. Dalam kes ini, lebih jauh di sepanjang pelaksanaan dijalankan menulis path_info[0] kepada sifar dan memanggil FCGI_PUTENV.

Dengan meminta URL yang diformatkan dengan cara tertentu, penyerang boleh mencapai peralihan penuding path_info kepada bait pertama struktur "_fcgi_data_seg" dan menulis sifar pada bait ini akan membawa kepada pergerakan "char* pos" penunjuk ke kawasan memori yang terletak sebelum ini. Yang seterusnya dipanggil FCGI_PUTENV akan menulis ganti data dalam memori ini dengan nilai yang boleh dikawal oleh penyerang. Memori yang ditentukan juga menyimpan nilai pembolehubah FastCGI yang lain, dan dengan menulis data mereka, penyerang boleh mencipta pembolehubah PHP_VALUE rekaan dan mencapai pelaksanaan kod mereka.

Sumber: opennet.ru

Tambah komen