法国、德国、卢森堡和瑞典大学的研究人员深入研究了已知的 Java 反序列化漏洞,现在他们的发现重新浮出水面。简而言之,他们已经引起了人们对图书馆意外引入严重安全漏洞的方式的关注。
序列化用于将内存中的一个数据对象转换成一系列字节用于存储或传输。反序列化通过将数据流转回内存中的对象来逆转该过程。
在 Java 中,这是使用java.io.Serializable
接口实现的。但是反序列化并不一定是安全的,因为从字节流重构对象并不涉及构造函数——最初构建对象以使其具有它应该具有的任何功能和方法的蓝图代码。如果构造函数有任何验证检查,则不会运行。因此,反序列化可能会创建无效或具有更改数据的对象。
Java 反序列化错误可能相当严重。
例如,Java 反序列化使影响 Apache Log4j 日志库的远程代码执行漏洞Log4Shell成为可能。2016 年 11 月,一场勒索软件攻击通过Apache Commons Collections Deserialization 漏洞破坏了旧金山市交通局 (SFMTA) 运营的两千多台计算机。
此外,导致 1.477 亿美国人个人数据被盗的 2017 年 Equifax 黑客攻击的切入点来自 Apache Struts 中的 Java 反序列化缺陷。去年 7 月,出现了一个 Atlassian Jira 漏洞,在该漏洞中,能够连接到 Ehcache RMI 网络服务的攻击者“由于缺少身份验证漏洞,可以通过反序列化在 Jira 中执行他们选择的任意代码”。
在题为“Java 反序列化远程代码执行漏洞和漏洞的深入研究”的论文中,计算机科学家 Imen Sayar(图卢兹大学)、Alexandre Bartel(于默奥大学)、Eric Bodden(帕德博恩大学)和 Yves Le Traon(卢森堡大学)描述了他们如何检查19 个公开的Java 反序列化 RCE 漏洞所针对的软件库,以了解小工具(可利用的代码结构)如何被引入 Java 库,以及摆脱这些小工具的尝试有时会如何失败。
作者观察到,虽然序列化和反序列化很有用,但如果反序列化的数据来自不受信任的来源,则此过程会带来风险。“事实上,攻击者可以制作一个字节流,当在远程主机上反序列化时,可以通过链接称为小工具的 Java 代码序列来控制 Java 代码的执行流程,”他们解释说。
小工具一词在漏洞利用领域有一些特定的含义。在他们的论文中,作者使用这个词来指代攻击者可以访问的潜在可利用的 Java 方法。库可能包含可链接的小工具,因此它们可以按顺序操作。
利用反序列化漏洞可能涉及复杂的攻击链,或者可能像通过网络发出 GET 请求一样简单。
我们的主要结论是,修改一个类中一个看似无辜的细节——比如将其公开——已经可以引入一个小工具
研究人员研究了14 个库(一些具有多个版本)中的 19 个漏洞利用: beanshell
、clojure
、commons-beanutils
、commons-collections
、groovy
、rome
、js-rhino
、spring-beans
、spring-core
、spring-aop
、click-nodeps
、javax.servlet
、vaadin-server
和vaadin-shared
.
“在分析 19 个 RCE 漏洞时,我们已经确定了几种在库中引入小工具的方法:添加类、方法和接口,或者更改方法的签名,”论文中写道。“我们的主要结论是,对课堂上一个看似无辜的细节的修改——比如将其公开——已经可以引入一个小工具。”
鉴于小工具是创建反序列化漏洞利用所必需的,插入新小工具的代码修改显然并不理想。
在测试的库及其变体中,有 14 个已被修补以删除潜在的小工具。这可以通过多种方式完成,例如java.io.Serializable
从易受攻击的类中的接口列表中删除,完全删除易受攻击的类,或引入安全检查等技术。
评估的六个库(commons-beanutils1.9.4
、rome1.0
、spring-beans-3.0.0.RELEASE
、click-nodeps-2.3.0-RC1
、javax-servlet-api-4.0.1
和vaadin-shared-7.4.0.beta1
)被列为未修补。因此,如果您的应用程序包含其中任何一个,您可能需要考虑如何解决这个问题。然而,等待修复可能不是最好的选择。
研究人员总结说:“在研究此类库的补丁时,我们观察到用于删除小工具的时间在几个月到近 12 年之间变化,平均接近六年。” “因此,反序列化漏洞似乎还没有得到从业者应得的关注。”