前言:
在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 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;
推薦教學:伺服器安全教學
以上是關於php遠端程式碼執行漏洞的介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!