网络安全知识科普-影响深远的反序列化漏洞

来源:       发布时间:2018-08-23

 

  2015116日,FoxGlove Security安全团队的发布的一篇博客中介绍了如何利用Java反序列化漏洞,来攻击最新版的WebLogicWebSphereJBossJenkinsOpenNMS这些大名鼎鼎的Java应用,实现远程代码执行。然而事实上,博客作者并不是漏洞发现者。博客中提到,早在2015年的128号,Gabriel LawrenceChris FrohoffAppSecCali上给出了一个报告,报告中介绍了Java反序列化漏洞可以利用Apache Commons Collections这个常用的Java库来实现任意代码执行,当时并没有引起太大的关注,但是实际上这是2015年最被低估的漏洞。 

  确实,Apache Commons Collections这样的基础库非常多的Java应用都在用,一旦编程人员误用了反序列化这一机制,使得用户输入可以直接被反序列化,就能导致任意代码执行,这是一个极其严重的问题,博客中提到的WebLogic等存在此问题的应用可能只是冰山一角 

01.什么是反序列化?

  序列化就是把对象转换成字节流,便于保存在内存、文件、数据库中;反序列化即逆过程,由字节流还原成对象。Java中的ObjectOutputStream类的writeObject()方法可以实现序列化,类ObjectInputStream类的readObject()方法用于反序列化。比如你可以将字符串对象先进行序列化,存储到本地文件,然后再通过反序列化进行恢复。 

  可问题在于,如果Java应用可以对任意数据做了反序化处理,那么攻击者可以通过构造恶意输入,让反序列化产生非预期的对象,非预期的对象在产生过程中就有可能带来任意代码执行。所以这个问题的根源在于类ObjectInputStream在反序列化时,没有对生成的对象的类型做限制;假若反序列化可以设置Java类型的白名单,那么问题的影响就小了很多。 

  反序列化问题由来已久,且并非Java语言特有,在其他语言例如PHPPython中也有相似的问题。报告中所指出的并不是反序列化这个问题,而是一些公用库,例如Apache Commons Collections中实现的一些类可以被反序列化用来实现任意代码执。 

  WebLogicWebSphereJBossJenkinsOpenNMS这些应用的反序列化漏洞能够得以利用,就是依靠了Apache Commons Collections。这种库的存在极大地提升了反序列化问题的严重程度,可以比作在开启了ASLR地址随机化防御的系统中,出现了一个加载地址固定的共享库。 

02.反序列化漏洞攻击分析

  Java 是一种十分受开发者喜爱的的语言,而其中最重要的一点是其拥有完善的第三方类库,和满足各种需求的框架;但正因为很多第三方类库引用广泛,如果其中某些组件出现安全问题,那么受影响范围将极为广泛。Java的这个漏洞能够暴露或间接暴露反序列化 API ,导致用户可以操作传入数据,攻击者可以精心构造反序列化对象并执行恶意代码。 

  java序列化就是把对象转换成字节流,便于保存在内存、文件、数据库中;反序列化即逆过程,由字节流还原成对象。当反序列化的输入来源于程序外部,可以被用户控制,恶意用户便可以构造恶意的字节流,经反序列化之后得到精心构造的恶意对象。 

  也就是说一些java应用的数据在网络中传输,我们把里面的序列化数据抠出来,替换成我们的payload,应用程序接收之后把payload进行反序列化,构造的恶意功能(如命令执行)就被执行了。 

03.总结

  从上面的分析中我们可以看到序列化就是把对象转换成一种数据格式,如JsonXML等文本格式或二进制字节流格式,便于保存在内存、文件、数据库中或者在网络通信中进行传输。反序列化是序列化的逆过程,即由保存的文本格式或字节流格式还原成对象。 

  很多编程语言都提供了这一功能,但不幸的是,如果应用代码允许接受不可信的序列化数据,在进行反序列化操作时,可能会产生反序列化漏洞,黑客可以利用它进行拒绝服务攻击、访问控制攻击和远程命令执行攻击。 

版权所有:朝阳区教育委员会 京ICP备05038995号
北京市朝阳区现代教育技术信息网络中心(宣教中心)