ช่องโหว่ใน 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;
}

คุณสามารถติดตามวิธีแก้ปัญหาได้ในชุดการแจกจ่ายในหน้าเหล่านี้: debian, RHEL, อูบุนตู, SUSE/เปิดSUSE, FreeBSD, โค้ง, Fedora. เพื่อเป็นการหลีกเลี่ยงปัญหา คุณสามารถเพิ่มการตรวจสอบการมีอยู่ของไฟล์ PHP ที่ร้องขอหลังบรรทัด “fastcgi_split_path_info” ได้:

try_files $fastcgi_script_name =404;

ปัญหาเกิดจากข้อผิดพลาดเมื่อจัดการพอยน์เตอร์ในไฟล์ ซาปิ/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

เพิ่มความคิดเห็น