2016 年 Java 应用程序及开发者受到反序列化漏洞的破坏性影响,而如今 .NET 生态系统也正在遭受同样的危机。新的问题存在于 .NET 代码库中处理反序列化的操作中,攻击者同样可以通过这个漏洞在服务器或相关计算机设备上进行代码注入。
我们知道,序列化指的是将对象转化为字节序列以便保存在内存、文件、或数据库中。而这个序列化过程主要是为了将对象的状态保存下来,在之后有需要之时可以重新创建对象。而与之相反的过程则被称为反序列化。而在这个过程中,如果没有对数据进行安全性检验,直接对不可信数据进行反序列化处理,那么攻击者可以通过构建恶意的数据输入,让反序列化构建的对象带来非预期的结果。
2015 - 2016 年的 Java 反序列化启示
自2011年开始,攻击者就开始利用反序列化问题发起攻击。 2015年上半年,两名研究员 Chris Frohoff 和 Gabriel Lawrence 发现 Apache Commons Collection 中的反序列化漏洞后,这个问题才真正开始让每个开发者头疼。 在2015年年底,Foxglove Security 的安全研究员,揭开了攻击者如何利用 Java 程序中的反序列化漏洞进行攻击。
研究调查显示,常见的 Java app 中均存在这个问题(如 WebLogic,WebSphere,JBoss,Jenkins 以及 OpenNMS)。攻击者可以利用漏洞进行恶意数据上传,而上传上去的数据会被序列化,然后存储到数据库或内存中,当 app 反序列化这些数据内容时,就会触发恶意代码,影响整个系统。
这个漏洞在 2016 年撼动了整个Java 生态系统,也影响到了 70 余个其他的 Java 库,甚至还让 PayPal 的服务器遭受影响。而大型的组织和机构,如 Apache, Oracle, Cisco, Red Hat, Jenkins, VMWare, IBM, Intel, Adobe, HP, 和 SolarWinds之类,都对自己的系统和产品进行彻底排查和漏洞修复。
Java 反序列化漏洞造成了严重的影响,还引发 Google工程师的 “在业余时间修复开源Java 库” 的活动,他们共计修复了2600多个项目,以减轻此漏洞带来的影响。尽管在谷歌的内部,这个漏洞的别名叫做 “疯狂小工具”(Mad Gadget),但对整个世界而言,反序列化漏洞问题是 Java 世界的一次浩劫。
反序列化问题同样影响 .NET 应用程序
目前,惠普软件的两名研究员 Alvaro Muñoz 和 Oleksandr Mirosh 发现,一个与此前Java 反序列化漏洞相似的问题也在 .NET 中重现了。
和 Java 应用程序一样,漏洞存在于 .NET 库中反序列化过程,处理序列化数据的方法中,而当目标计算机运行时这些恶意注入的代码就会执行。和 Java 世界同样,这些 .NET 漏洞在整个生态系统中并非全部存在。某些 .NET 库是不受影响的,开发时可以正常使用这些库。还有一些应用即便使用了受影响的库,也是安全的,因为程序员在应用中禁用了获取序列化数据的函数和方法。
在他们的研究报告中,Muñoz 和 Mirosh 将研究重点放在分析使用 JSON 存储数据的 .NET /Java 反序列化漏洞上。他们指出哪些应用程序是安全可靠的,开发人员应该如何在使用 JSON 数据时,避免遭受反序列化攻击。
许多常见 .NET 项目中存在的反序列化漏洞
这些漏洞不只是理论层面已经发现,在实际的应用中也已经证实会造成影响,研究人员发现在 .NET 数据管理后端框架 Breeze 中存在 JSON 反序列化漏洞 CVE-2017-9424; 还有 CVE-2017-9785,这是一个存在于 NancyFX 中的反序列化漏洞——基于 Ruby 的 轻量级 .NET web 框架。
而除了JSON 反序列化之外,还有一些 .NET 库中还存在着 XML 数据对象的反序列化问题。研究员发现DotNetNuke 这个流行的 .NET CMS系统中也存在 XML 反序列化漏洞。
如上所述,这些问题是由各种 .NET 库中的漏洞组合而成的,同时也是因为开发人员的不良编码实践导致的,他们没有意识到序列化数据并不一定是安全的。由此避免此类的安全问题除了修复 .NET库之外,还需要对开发者的编程习惯加以规范。
序列化过程很能影响产品的安全性的,开发时需要注意不能使用未加验证的数据。反序列化问题并非只出现在 Java 序列化之中,或者如 JSON,XML 之类特定的 .NET 数据格式中。所有序列化操作后都会重新创建对象,攻击注入的代码即可能被其他方法调用,触发任意代码执行。
今年8月初,研究小组也在美国拉斯维加斯举行的 Black Hat 和 DEF CON 安全会议上发表了他们的调查结果。