使用 NGINX 解决 PHP-FPM 漏洞 (CVE-2019-11043)

最近报告的漏洞(编号为 CVE-2019-11043)可能会影响使用 PHP-FPM 执行 PHP 页面的网站。 PHP-FPM 在 NGINX 支持的网站上使用特别常见,因为 NGINX 没有进程内 PHP 运行时。相反,NGINX 充当应用程序服务器和进程管理器(例如 PHP-FPM)的反向代理。

该漏洞存在于 PHP-FPM 本身,而不是 NGINX,因此唯一有保证的解决方案是升级到 PHP 版本的修补版本(或更高版本):PHP 7.1.33、PHP 7.2.24 或 PHP 7.3。 11.

漏洞的性质是什么?

NGINX 使用 FastCGI 协议与 PHP-FPM 进行通信。每个 FastCGI 消息都包含一组环境变量。其中之一 PATH_INFO 源自其他请求参数。如果其值意外为空,这最终可能会导致 PHP-FPM 二进制文件中的内存损坏。可以利用这种情况d 使 PHP-FPM 二进制文件在本地服务器上运行任意命令。

此漏洞可以由常见的 NGINX 配置触发,NGINX 在 fastcgi_split_path_info 指令中使用正则表达式将请求 URI 分为两部分。触发该漏洞的一种方法是将换行符 (%0a) 或回车符 (%0d) 嵌入到请求 URI 中,这样正则表达式就无法正确处理该字符。

缓解漏洞

如上所述,解决此漏洞的唯一方法是升级到 PHP 版本的修补版本(或更高版本):PHP 7.1.33、PHP 7.2.24 或 PHP 7.3.11。

如果您无法立即升级 PHP 二进制文件,您可以采取一些部分缓解措施:

  • 各种来源建议在 NGINX 配置中添加 try_files 指令,以验证 $uri 变量是否解析为文件(PHP 脚本)d 如果没有,则拒绝请求并返回代码 404(未找到):

    位置 ~ [^/]\.php(/|$) {
    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    try_files $uri =404;
    #…
    }

    请注意,只有 NGINX 和 PHP-FPM 在同一主机上共享相同的文档根目录时,此缓解措施才有效。

    PHP 配置根据上游应用程序的需求而有所不同。请测试此类更改,以验证它们不会影响您的应用程序。

  • 使用F5 BIG-IP ASM(应用程序安全管理器)来保护应用程序。现有的“命令执行”和“服务器端代码注入”签名集包括阻止大多数发现和利用此 PHP-FPM 漏洞的尝试的攻击签名。

    编辑 – 自本博客发布以来,F5 安全团队发布了专门针对此漏洞的附加签名。详情请参见F5开发中心。

  • 添加 ModSecurity 规则以阻止包含可疑 %0a 或 %0d 字符的请求:

    SecRule REQUEST_URI “@rx %0(a|A|d|D)” “id:1,phase:1,t:小写,拒绝”

    Wallarm 关于该漏洞的原始报告中描述了此解决方案;它可能会导致误报,并且攻击者仍然可能找到其他方法来利用该漏洞。

  • 使用不同的 PHP 进程管理器

    您可以使用 NGINX Unit 来运行 PHP 应用程序,而不是依赖 PHP-FPM。 NGINX Unit 是一个高性能、开源应用程序服务器和进程管理器,除了 PHP 之外,还支持多种语言和框架。它可以自动扩展 PHP 应用程序以响应负载,并同时运行使用不同 PHP 运行时的应用程序。我们免费提供二进制文件、源代码和 Docker 映像。

    请参阅 NGINX 单元文档,了解有关配置和操作 NGINX 单元的说明它适用于 WordPress,这是一个流行的、高流量的、由 PHP 驱动的应用程序。该部署利用了 NGINX Unit 1.11.0 及更高版本中对提供静态文件的支持。


    评论

    发表回复

    您的电子邮箱地址不会被公开。 必填项已用 * 标注