PHP 遠程代碼執行漏洞安全通告

發布時間 2019-10-24

漏洞編號和級別


CVE編號:CVE-2019-11043,危險級別:高危,CVSS分值:官方未評定


影響版本


當Nginx + php-fpm 的服務器有如下配置的時候,都會出現RCE漏洞


  location ~ [^/]\.php(/|$) {

       fastcgi_split_path_info ^(.+?\.php)(/.*)$;

       fastcgi_param PATH_INFO       $fastcgi_path_info;

       fastcgi_pass   php:9000;

       ...

 }

}


當啟用了上述 Nginx 配置后,以下 PHP 版本受本次漏洞影響,另外,PHP 5.6版本也受此漏洞影響,但目前只能Crash,不可以遠程代碼執行:


PHP 7.0 版本

PHP 7.1 版本

PHP 7.2 版本

PHP 7.3 版本


漏洞概述


PHP-FPM(FastCGI流程管理器)是另一種PHP FastCGI實現,具有一些其他功能,可用于各種規模的站點,尤其是繁忙的站點。


對于PHP 5.3.3之前的php來說,PHP-FPM是一個補丁包,旨在將FastCGI進程管理整合進PHP包中。如果你使用的是PHP 5.3.3之前的PHP的話,就必須將它patch到你的PHP源代碼中,在編譯安裝PHP后才可以使用。而PHP 5.3.3已經集成php-fpm了,不再是第三方的包了。PHP-FPM提供了更好的PHP進程管理方式,可以有效控制內存和進程、可以平滑重載PHP配置。


在9 月 14 日至 18 舉辦的 Real World CTF 中,國外安全研究員 Andrew Danau 在解決一道 CTF 題目時發現,向目標服務器 URL 發送 %0a 符號時,服務返回異常,疑似存在漏洞。


9 月 26 日,PHP 官方發布漏洞通告,其中指出:使用 Nginx + php-fpm 的服務器,在部分配置下,存在遠程代碼執行漏洞。并且該配置已被廣泛使用,危害較大。


Nginx 上 fastcgi_split_path_info 在處理帶有 %0a 的請求時,會因為遇到換行符 \n 導致 PATH_INFO 為空。而 php-fpm 在處理 PATH_INFO 為空的情況下,存在邏輯缺陷。攻擊者通過精心的構造和利用,可以導致遠程代碼執行。


漏洞驗證


POC:https://github.com/neex/phuip-fpizdam。


修復建議


PHP已于10月12號發布該漏洞補丁,請參考以下鏈接安裝補?。?


https://bugs.php.net/patch-display.php?bug_id=78599&patch=0001-Fix-bug-78599-env_path_info-underflow-can-lead-to-RC.patch&revision=latest


由于漏洞利用需要Nginx+php-fpm環境,用戶默認安裝的配置不受影響,為確保安全,建議您檢查本地 Nginx 配置文件

CentOS默認目錄為/etc/nginx/nginx.conf


確認是否存在上述風險配置,如果存在,建議您找到并刪除如下配置項:


fastcgi_split_path_info ^(.+?\.php)(/.*)$;

fastcgi_param PATH_INFO       $fastcgi_path_info;


參考鏈接


https://github.com/neex/phuip-fpizdam