前言:
在2019年9月26日,php官方發布了一則漏洞公告,此次漏洞公告中官方披露了一個遠程代碼執行漏洞,該漏洞是因PHP-FPM中的fpm_main.c文件的env_path_info下溢而導致的。
該漏洞存在于PHP-FPM + nginx組合使用并采用一定配置的情況下。該漏洞PoC已在2019年10月22日公布,PHP與Nginx組合使用的情況較為廣泛,攻擊者可利用該漏洞遠程執行任意代碼,所以危害性較大。
PHP-FPM組件介紹
PHP-FPM(FastCGI流程管理器)是另一種PHP FastCGI實現,具有一些其他功能,可用于各種規模的站點,尤其是繁忙的站點。
立即學習“PHP免費學習筆記(深入)”;
對于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配置。
(學習推薦:java視頻教程)
漏洞描述
該漏洞是PHP-FPM中的fpm_main.c文件的env_path_info下溢導致,在sapi/fpm/fpm/fpm_main.c文件中的第1140行包含pointer arithmetics,這些pointer arithmetics假定env_path_info的前綴等于php腳本的路徑。但是,代碼不會檢查這些假設是否被滿足,缺少檢查會導致”path_info”變量中的指針無效。
這樣的條件可以在標準的Nginx配置中實現。如果有這樣的Nginx配置:
location?~?[^/].php(/|$)?{ ????????fastcgi_split_path_info?^(.+?.php)(/.*)$; ????????fastcgi_param?PATH_INFO???????$fastcgi_path_info; ????????fastcgi_pass???php:9000; ????????... ??}
攻擊者可以使用換行符(編碼格式為%0a)來破壞`fastcgi_split_path_info`指令中的regexp。regexp損壞將導致空PATH_INFO,從而觸發該錯誤。
這個錯誤會導致代碼執行漏洞。在后面的代碼中,path_info[0]的值設置為0,然后再調用FCGI_PUTENV。攻擊者可以使用精心選擇的URL路徑長度和查詢字符串,使path_info精確地指向_fcgi_data_seg結構的第一個字節。然后將0放入其中則‘char* pos’字段向后移動,然后FCGI_PUTENV使用腳本路徑覆蓋一些數據(包括其他快速cgi變量)。
使用這種技術,攻擊者可以創建一個偽PHP_VALUE fcgi變量,然后使用一系列精心選擇的配置值來執行代碼。
影響產品:
在2019-09-26更新之前下載的PHP-FPM,且必須為Nginx + php-fpm?的服務器使用如下配置,會受到影響。
location?~?[^/].php(/|$)?{ ????????fastcgi_split_path_info?^(.+?.php)(/.*)$; ????????fastcgi_param?PATH_INFO???????$fastcgi_path_info; ? ????????fastcgi_pass???php:9000; ????????... ??}
修復建議
如果業務不需要以下配置,建議用戶刪除:
fastcgi_split_path_info?^(.+?.php)(/.*)$; ????????fastcgi_param?PATH_INFO???????$fastcgi_path_info;
推薦教程:java視頻教程