Kerentanan dalam php-fpm yang memungkinkan eksekusi kode jarak jauh di server

Tersedia rilis korektif PHP 7.3.11, 7.1.33 dan 7.2.24, di mana dihilangkan еская kerentanan (CVE-2019-11043) dalam ekstensi PHP-FPM (FastCGI Process Manager), yang memungkinkan Anda mengeksekusi kode Anda dari jarak jauh di sistem. Untuk menyerang server yang menggunakan PHP-FPM bersama dengan Nginx untuk menjalankan skrip PHP, ini sudah tersedia untuk umum kerja mengeksploitasi.

Serangan ini dimungkinkan dalam konfigurasi nginx di mana penerusan ke PHP-FPM dilakukan dengan memisahkan bagian-bagian URL menggunakan “fastcgi_split_path_info” dan mendefinisikan variabel lingkungan PATH_INFO, tetapi tanpa terlebih dahulu memeriksa keberadaan file menggunakan “try_files $fastcgi_script_name” direktif atau “if (!-f $) document_root$fastcgi_script_name)". Masalahnya juga dimanifestasikan dalam pengaturan yang ditawarkan untuk platform NextCloud. Misalnya, konfigurasi dengan struktur seperti:

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

Anda dapat melacak penyelesaian masalah dalam kit distribusi di halaman ini: Debian, RHEL, Ubuntu, SUSE/bukaSUSE, FreeBSD, Lengkungan, Fedora. Sebagai solusinya, Anda dapat menambahkan tanda centang terhadap keberadaan file PHP yang diminta setelah baris “fastcgi_split_path_info”:

coba_files $fastcgi_script_name =404;

Masalah ini disebabkan oleh kesalahan saat memanipulasi pointer dalam suatu file sapi/fpm/fpm/fpm_main.c. Saat menetapkan pointer, diasumsikan bahwa nilai variabel lingkungan PATH_INFO harus berisi awalan yang cocok dengan jalur ke skrip PHP.
Jika direktif fastcgi_split_path_info menentukan pemisahan jalur skrip menggunakan ekspresi reguler sensitif baris baru (misalnya, banyak contoh menyarankan penggunaan "^(.+?\.php)(/.*)$"), maka penyerang dapat memastikan bahwa nilai kosong ditulis ke variabel lingkungan PATH_INFO. Dalam hal ini, eksekusi lebih lanjut adalah menulis path_info[0] ke nol dan memanggil FCGI_PUTENV.

Dengan meminta URL yang diformat dengan cara tertentu, penyerang dapat menggeser penunjuk path_info ke byte pertama dari struktur “_fcgi_data_seg”, dan menulis nol pada byte ini akan menyebabkan pergerakan “char* pos” penunjuk ke area memori yang terletak sebelumnya. Selanjutnya disebut FCGI_PUTENV akan menimpa data dalam memori ini dengan nilai yang dapat dikontrol oleh penyerang. Memori yang ditentukan juga menyimpan nilai variabel FastCGI lainnya, dan dengan menulis datanya, penyerang dapat membuat variabel PHP_VALUE fiktif dan mencapai eksekusi kodenya.

Sumber: opennet.ru

Tambah komentar