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