Web应用开源软件安全漏洞风险应急研究

2022-09-09 05:50王建东
电子技术与软件工程 2022年12期
关键词:序列化攻击者开源

王建东

(中国银联股份有限公司 上海市 201201)

Web应用程序是一种利用网络浏览器和网络技术在互联网上执行任务的计算机程序。各行各业的Web应用立足于发达的网络提供服务,实现系统互联。Web应用自身的Web技术特性以及天然的互联网可访问性,导致Web应用程序攻击面较大。而随着开源技术快速形成生态,企业用户引入开源技术已成大势所趋,Web应用中大量使用开源软件提升开发效率。不能忽略的是,使用开源软件可能会引入与应用系统业务无关的通用漏洞风险,应急人员一般对开源软件缺乏深入的理解,这为风险应急带来挑战。

1 问题背景

从Web应用角度看,与桌面应用相比,Web应用漏洞一旦公布,即面临漏洞被利用的现实风险,因为Web应用通常发布在互联网上,直接暴露于攻击者的面前。并且,Web应用使用大量的开源软件,大到Struts2、Spring等流行Web框架,小到XStream、jackson-databind等知名数据解析工具,各类开源软件都可能引入与系统无关的通用漏洞,导致风险应急工作繁重复杂。

从开源软件角度看,开源软件漏洞的披露与商业软件大不相同。商业软件通常在漏洞修复后由相关厂商点对点通知客户进行打补丁,这具有强烈的非公开性;或者定期在服务网站上发布补丁,这具有稳定的可预期性。而开源软件这两个特性均不具备。开源软件漏洞一般由其作者在项目网站或页面发布,对所有人包括攻击者是公开可见的,而且不可预期,随时都可能出现漏洞风险提示,对风险应急工作的实效性要求很高。

当接收到风险应急通知,安全应急人员和专业开发人员在缺乏漏洞详细POC且风险提示信息有限的情况下,很难对应用系统是否受漏洞影响快速给出正确的判断,而这决定了下一步的处置策略。常见的做法是简单通过判断使用的开源软件版本是否落入受影响版本范围区间内,而非判断应用是否真正受漏洞影响,来最终决定是否需要进行处置。这种处理逻辑不需要安全背景知识,未发挥安全应急人员的专业价值。同时,由于不必要的升级处置,一方面影响了正常业务功能的投入与计划,另一方面可能扰乱生产运行稳定。

2 历史漏洞

根据以往的风险应急实践,我们分析了近5年流行的Java语言开源软件漏洞,如表1。这些漏洞都深刻影响着Web应用系统的整体安全。

表1:近5年流行的Java语言开源软件漏洞

18 jackson-databind远程代码执行 CVE-2019-14439 该漏洞可对CVE-2019-12384漏洞绕过,攻击者可以通过精心构造的请求包在受影响的 Jackson 服务器上进行远程代码执行。19 Fastjson远程代码执行 /有人在Freebuf发表了文章,公布了两个不在AutoType黑名单中可以被利用的类JNDIConfiguration和 OracleManagedConnectionFactory,1.2.61版本增加AutoType安全黑名单进行了修复。该漏洞是由于Apache Shiro cookie中通过 AES-128-CBC 模式加密的rememberMe字段存在问题,用户可通过Padding Oracle 加密生成的攻击代码来构造恶意的rememberMe字段,并重新请求网站,进行反序列化攻击。21 Apache Dubbo 20 Apache Shiro反序列化CVE-2019-12422(SHIRO-721)反序列化 CVE-2019-17564 当启用HTTP协议之后,Apache Dubbo对消息体处理不当导致不安全反序列化。jackson-databind中由于缺少某些xbean-reflect/JNDI黑名单类,如org.apache.xbean.propertyeditor.JndiConverter,可导致攻击者使用JNDI注入的方式实现远程代码执行23 Fastjson 22 jackson-databind远程代码执行 CVE-2020-8840远程代码执行 / Fastjson1.2.68及以下版本在AutoType关闭的情况下仍然可能绕过黑白名单防御机制,造成远程命令执行漏洞。Apache Struts框架在强制执行时,会对分配给某些标签属性(如id)的属性值执行二次OGNL解析。攻击者可以通过构造恶意的OGNL表达式,并将其设置到可被外部输入进行修改,且会执行OGNL表达式的Struts2标签的属性值,引发OGNL表达式解析,最终造成远程代码执行。25 XStream 24 Apache Struts2远程代码执行CVE-2019-0230(S2-059)远程代码执行 CVE-2020-26217 攻击者可以通过构造恶意的XML文档,绕过XStream的黑名单,触发反序列化,造成远程代码执行。26 Apache Struts2远程代码执行CVE-2020-17530(S2-061)S2-061是对S2-059的绕过, S2-059的修复补丁仅修复了沙盒绕过,但是并没有修复OGNL表达式的执行。漏洞利用依赖的核心类org.apache.commons.collections.BeanMap在commons-collections-x.x.jar包中。27 XStream任意文件删除/服务端请求伪造CVE-2020-26259、CVE-2020-26258 XStream对CVE-2020-26217处理并不彻底,虽然通过黑名单方法阻止了远程代码执行,但是仍然可以构造特定的序列化数据造成任意文件删除或服务端请求伪造。28 XStream多个高危漏洞CVE-2021-21341、CVE-2021-21342、CVE-2021-21343、CVE-2021-21344、CVE-2021-21345、CVE-2021-21346、CVE-2021-21347、CVE-2021-21348、CVE-2021-21349、CVE-2021-21350、CVE-2021-21351拒绝服务、服务端请求伪造、任意文件删除、任意代码执行等。29 XStream远程代码执行 CVE-2021-29505 攻击者构造特定的XML,绕过XStream的黑名单,最终触发反序列化造成任意代码执行。

30 XStream多个反序列化漏洞CVE-2021-39139、CVE-2021-39140、CVE-2021-39141、CVE-2021-39144、CVE-2021-39145、CVE-2021-39146、CVE-2021-39147、CVE-2021-39148、CVE-2021-39149、CVE-2021-39150、CVE-2021-39151、CVE-2021-39152、CVE-2021-39153、CVE-2021-39154任意代码执行、拒绝服务、服务端请求伪造等。31 Apache Shiro身份验证绕过 CVE-2021-41303 当在Spring Boot中使用Apache Shiro时,攻击者可以构造特定的HTTP请求绕过身份验证访问后台功能。32 Apache Log4j2远程代码执行 CVE-2021-44228 Log4j在记录日志的过程中会对日志内容进行判断,如果内容中包含了${,则Log4j会认为此字符属于可替换的变量,并且Log4j支持JNDI远程加载的方式替换变量值,可能导致JNDI注入。33 Spring Cloud Gateway远程代码执行CVE-2022-22947 该漏洞发生在Spring Cloud Gateway应用程序的Actuator端点,其在启用、公开和不安全的情况下容易受到代码注入的攻击。Spring Framework存在远程代码执行漏洞,在 JDK 9+ 上运行的 Spring MVC 或 Spring WebFlux 应用程序可能容易受到通过数据绑定的远程代码执行攻击。35 Apache Struts2远程代码执行34 Spring框架远程代码执行CVE-2022-22965 CVE-2021-31805(S2-062)由于对S2-061修复不完善,导致一些标签的属性仍然可以执行OGNL表达式。当Spring Security中使用RegexRequestMatcher进行权限配置,且规则中使用带点号的正则表达式时,未经授权的远程攻击者可通过构造恶意数据包绕过身份认证,导致配置的权限验证失效。37 Fastjson远程代码执行36 Spring Security身份认证绕过 CVE-2022-22978 CVE-2022-25845/CNNVD-202206-1037 Fastjson 1.2.83 之前版本存在安全漏洞,该漏洞源于容易绕过默认的AutoType 关闭限制来反序列化不受信任的数据,攻击者利用该漏洞可以攻击远程服务器。

3 影响评估

通过对历史漏洞分析,本文提出一种精细化漏洞影响评估方法,使得漏洞评估更加科学,使得应急工作更加高效。评估共有7个步骤,具体如下。

步骤1:是否使用了漏洞软件。Web应用是否引入了漏洞软件,未引入则表明未使用。否则,判断应用是否真正使用到该漏洞软件,若属无意引入实际不需要,则表明未使用,否则,判断为使用。若判断结果为未使用,则不受漏洞影响。否则,继续下一步。

步骤2:是否落在受影响版本范围内。若版本不在受影响范围内,则不受漏洞影响,否则,继续下一步。

步骤3:是否要求使用或支持存在漏洞的相关功能。若漏洞利用有要求,则判断Web应用是否使用或支持存在漏洞的相关功能,未使用则不受漏洞影响,否则,继续下一步。

步骤4:是否要求应用层面特定写法或配置。若漏洞利用有要求,则判断Web应用是否满足特定写法或配置,不满足则不受漏洞影响,否则,继续下一步。

步骤5:漏洞触发是否要求特定gadget。若有要求,则判断Web应用classpath环境下是否存在相关gadget,不存在则不受漏洞影响,否则,继续下一步。

步骤6:漏洞触发是否要求特定运行环境(如操作系统、jre等)。若有要求,则判断Web应用的运行环境是否满足,不满足则不受漏洞影响,否则,继续下一步。

步骤7:应用处理的数据是否可信。若可信,则不受漏洞影响,否则,受漏洞影响。

在应急实践中,某些Web应用在创建项目工程的过程中由于复用其他项目或者参考网络资料等可能误引入了实际功能不会使用到的开源软件,那么此种情况下,Web应用便不会受相关漏洞影响(步骤1),后续择机将冗余的软件移除即可。Apache Struts2 S2-052漏洞,若应用仅是使用Struts2核心功能包等,并未使用REST插件包,那么便不受该漏洞影响(步骤3);Apache Struts2 S2-055漏洞,应用即使使用了REST插件包,但若应用并未配置开启Jackson来处理JSON请求时,应用亦不会受该漏洞影响(步骤3)。Spring Security 身份认证绕过漏洞(CVE-2022-22978),若应用中没有配置带点号的正则表达式,则应用不会受该漏洞影响(步骤4),S2-057漏洞也要求特定配置。CVE-2019-12086、CVE-2019-12384、CVE-2020-8840等漏洞的触发均依赖相关gadget,若Web应用的classpath环境中不包含这些gadget,则无法触发漏洞,故不受漏洞影响(步骤5)。Spring框架远程代码执行(CVE-2022-22965)依赖JDK 1.9及以上,因此,若Web应用运行在低版本JDK上则不受影响(步骤6)。Apache Log4j2 远程代码执行漏洞(CVE-2021-44228)、Fastjson远程代码执行漏洞(CVE-2022-25845)等可以无条件利用的漏洞,若应用不打印或解析不可信数据,实际并不会受漏洞影响(步骤7)。

4 结束语

本文分析了Web应用开源软件安全漏洞风险应急特点,梳理了近5年主要的Java语言开源软件漏洞情况并进行归纳总结,根据应急实践,提出了一种精细化的漏洞影响性评估方法。通过此方法,可以使应急人员在风险应急高时效的要求下,科学、快速的判断出受漏洞影响的应用资产,进而进行处置,避免分散精力于实际并不受漏洞影响的应用,而此类应用可以在后续发布正常业务功能的时候再进行防御性升级。

猜你喜欢
序列化攻击者开源
基于微分博弈的追逃问题最优策略设计
五毛钱能买多少头牛
正面迎接批判
大家说:开源、人工智能及创新
开源中国开源世界高峰论坛圆桌会议纵论开源与互联网+创新2.0
Java 反序列化漏洞研究
开源计算机辅助翻译工具研究
有限次重复博弈下的网络攻击行为研究
作文训练微格化、序列化初探
Java序列化技术的探讨