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