资源

OneRASP 实时监控和防护 Java 反序列化攻击

Java 反序列化攻击是一个影响范围非常大且破坏力极强的 Java 缺陷,该缺陷在 10 个月前就已经被发现,直到 FoxGlove 最近发表的一篇博文才引起了大家的重视。

Java 世界里几个鼎鼎大名的开源库都普遍存在这个漏洞,例如:Apache Commons-Collections , Apache Xalan 和 Groovy 等,这些库被大多数 Java 程序引用,甚至包括常用 Java 应用服务器容器和开源框架如 Oracle Weblogic 、IBM的WebSphere ,JBoss,Jenkins 和 OpenNMS 等。这就是导致数以百万计的应用程序和服务器面临远程代码执行的最根本原因。

实际上反序列化的安全问题已提出了很多年。这个漏洞被 OWASP 称为“不可信的数据反序列化。”换言之,如果软件开发者认为序列化的数据是可以信任的就可能会出现这个漏洞。

Sonatype 的报告《 2014 年开源软件安全现状》从另一个角度证明了这个漏洞的影响程度:

1. Java 应用程序是第一攻击目标

2. 90% 的 Java 程序使用了开源软件或模块

3. 4400 万有漏洞的 Java 开源软件或模块被下载

导致漏洞的原因

漏洞存在的根本原因是 Java 序列化自身的缺陷。众所周知,序列化的目的是使 Java 对象转化成字节流,方便存储或者网络上传输。Java 对象分解成字节码过程叫做序列化,从字节码组装成 Java 对象的过程叫做反序列化,这两个过程分别对应于的 WriteObject 和 ReadObject 方法。问题在于 ReadObject 在利用字节流组装 Java 对象时不会调用构造函数, 也就意味着没有任何类型检查,用户可以复写 ReadObject() 方法执行任何想要执行的代码。

漏洞的危害

1. 序列化对象修改了对象或者父类的某个未加保护的关键属性,导致不可预料的后果。

2. 攻击者可以创建循环对象链,然后序列化。会导致反序列化无法结束, 空耗系统资源。

3. 黑客可以使程序在收到序列化对象流时选择存储在本地。由于没有任何校验机制,使得上传恶意程序成为可能。

Java 反序列化攻击解决办法

FoxGlove Security 提倡开发者不反序列化任何不信任的数据,他提到一种激进的做法那就是如果你足够勇敢可以尝试扫描并删除所有存在反序列化漏洞的 Java 类,这样就能根除这个漏洞。但是在实际的开发中这种解决方案几乎是不可行的,原因如下:

第一没有人敢于承担这种风险,大多数开发者对该问题成因和危害没有足够的认知。

第二应用对象的依赖关系很复杂,反序列化过程会导致很多关联对象被创建,所以扫描不能保证所有的问题类被发现。

OneRASP 最新推出的 Java 序列化攻击防护可以在不删除所有反序列化漏洞的 Java 类的情况下,即可对该漏洞进行完全的防护,欲了解更多,点击 OneRASP