点赞
评论
收藏
分享
举报
使用NGINX解决PHP-FPM漏洞
发表于2020-05-08 15:50

浏览 4.2k

最近报告的漏洞(跟踪为CVE-2019-11043)可能会影响使用PHP‑FPM执行PHP页面的网站。在NGINX支持的网站上,PHP‑FPM的使用尤其常见,因为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二进制文件中的内存损坏。有可能利用这种情况,并使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二进制文件,则可以采取几种缓解措施:

  1. 各种来源都建议向try_filesNGINX配置添加指令,以验证$uri变量是否解析为文件(PHP脚本),404 (Not Found)如果没有,则拒绝带有代码的请求:

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

    请注意,只有NGINX和PHP‑FPM在同一主机上共享相同的docroot时,此缓解措施才有效。

    PHP配置取决于上游应用程序的需求。请测试这样的更改以确认它们不会影响您的应用程序。

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

    编辑器–自发布此博客以来,F5安全团队发布了针对此漏洞的附加签名。有关详细信息,请参见F5 DevCentral。

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

    SecRule REQUEST_URI "@rx %0(a|A|d|D)" "id:1,phase:1,t:lowercase,deny"

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

使用其他PHP流程管理器

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

有关为WordPress(一种流行的,高流量,PHP驱动的应用程序)配置和操作NGINX Unit的说明,请参阅NGINX Unit文档。部署利用了在NGINX Unit 1.11.0及更高版本中支持提供静态文件的支持。

已修改于2023-03-08 13:48
本作品系原创
创作不易,留下一份鼓励
你猜我不猜

暂无个人介绍

关注



写下您的评论
发表评论
全部评论(1)

按点赞数排序

按时间排序

不错,写的非常好,用上了,感谢楼主
赞同

0

回复举报

发表于2020-05-08 17:06



回复南方
回复
关于作者
你猜我不猜
这家伙很懒还未留下介绍~
1
文章
0
问答
3
粉丝
相关文章
前言:随着现代应用架构的发展和演进,特别是容器云的盛行,越来越多的用户将7层流量的控制从前端网络的应用交付设备转向到了在每个应用,微服务前的软负载SLB上。典型的SLB,如nginx,部署位置可以在网络边界,在服务器的前端,在容器云中,以反代,微网关,sidecar的形式存在。因为业务在不断的变化,特别是随着devops文化的流行,业务变化的频率和业务对基础架构的诉求也在不断上升。因此,我们也在nginx上交付了越来越多的应用服务,其中就包括了大家熟悉的黑白名单功能。从现代的安全架构上来看,内网是不安全的,这件事情也得到了共识,从而出现了零信任架构,出现了无界的安全,出现了双模安全,基于每个应用的定制化精细化安全策略的诉求也就出现。那么如何基于每个应用或微服务,进行频率的控制是保证应用的稳定性,健壮性,可用性的关键。限流是一个很好的方法,但是静态的限流很容易被绕过,应用层的ddos攻击往往会压着访问频率,那么如果能够准确定位出每个客户端,每个session的请求频率,自动的把超出阈值的客户端加黑封禁一段时间,比如说3分钟,这样就可以实现自动化的黑白名单,保护服务的健壮性。当然,还有
点赞 1
浏览 4.2k
原文作者:felix_yujing原文链接:ingressnginx传递用户真实ip问题转载来源:CSDN背景业务应用经常有需要用到用户真实ip的场景,比如:异地登录的风险预警、访问用户分布统计等功能等。当有这种需求的时候,在业务上容器过程中,如果用到ingress就要注意配置了。通常,用户ip的传递依靠的是X-Forwarded-*参数。但是默认情况下,ingress是没有开启的。ingress的文档还比较详细,这里介绍一下可能用到的这3个参数:注:在文档顶栏的搜索框搜索forward字样就可以找到这3个参数1.use-forwarded-headers如果Nginx在其他7层代理或负载均衡后面,当期望Nginx将X-Forwarded-*的头信息传递给后端服务时,则需要将此参数设为true如果设为false(默认为false),Nginx会忽略掉X-Forwarded-*的头信息。false设置适用于Nginx直接对外或前面只有3层负载均衡的场景由于ingress的主配置是从configmap中获取的,更新参数则需要修改名为nginx-configuration的configm
点赞 0
浏览 7k
upstream-fair模块upstream-fair是比内建的负载均衡更加智能的负载均衡模块,一般google关键词nginx-upstream-fair可以找到相关资源和文章,这里不详述了。它采
点赞 0
浏览 5.6k