代码审计是使用静态分析发现源代码中安全缺陷的方法,辅助开发或测试人员在软件上线前较为全面地了解安全问题,防患于未然,因此一直以来都是学术界和产业界研究的热点,并已成为安全开发生命周期 SDL 和 DevSecOps 等保障体系的重要技术手段。
奇安信代码卫士团队基于自主研发的国内首款源代码安全检测商用工具,以及十余年漏洞技术研究的积累,推出“缺陷周话”系列栏目。每周针对 CWE、OWASP 等标准中的一类缺陷,结合实例和工具使用进行详细介绍,旨在为广大开发和安全人员提供代码审计的基础性标准化教程。
1、不安全的反序列化:XStream
通常客户端向服务端发送XML格式请求的数据时,在服务端对数据处理时并不是直接对数据进行处理,而是将XML转换成程序中可操作的对象。在转换时需要用到XStream,XStream可以将对象序列化成XML或将XML反序列化为对象。在使用XStream进行反序列化时,如果程序中没有校验用户输入就进行反序列化处理,那么攻击者可以通过构造恶意输入,让反序列化产生非预期的对象,非预期的对象在创建过程中可能会引发任意代码执行等问题。本文以JAVA语言源代码为例,分析“不安全的反序列化:XStream”漏洞产生的原因以及修复方法。详见 CWE ID 502: Deserialization of Untrusted Data (http://cwe.mitre.org/data/definitions/502.html)。
2、未初始化值用于赋值操作的危害
攻击者可使用“不安全的反序列化:XStream”漏洞,通过修改序列化之后的数据字段,进行提权、越权操作或者替换缓存服务器中的数据,恶意修改服务器数据,严重的可导致远程代码执行问题。
从2019年1月至2019年6月,CVE中共有38条漏洞信息与其相关。部分漏洞如下:
CVE | 概述 |
---|---|
CVE-2019-7091 | ColdFusion版本Update 1,Update 7,Update 15对不受信任的数据进行了反序列化。成功利用可能导致任意代码执行。 |
CVE-2019-4279 | IBM WebSphereApplication Server 8.5和9.0可能允许远程攻击者使用来自不受信任来源的特制序列化对象在系统上执行任意代码。 |
CVE-2019-10912 | Symfony在2.8.50,3.4.26之前的3.x,4.1.12之前的4.x和4.2.7之前的4.2.x,可以缓存可能包含错误用户输入的对象。在序列化或反序列化时,这可能导致删除当前用户有权访问的文件。 |
3、示例代码
示例源于 WebGoat-8.0.0.M25 (https://www.owasp.org/index.php/Category:OWASP_WebGoat_Project),源文件名:VulnerableComponentsLesson.java。
3.1 缺陷代码
上述示例代码是获取到用户输入的 XML 数据并将该数据反序列化为对象,在第54行获取用户输入的 XML 字符串 payload,第57行使用 dom
解析器来构造 XStream 对象 xstream
,第58行使用 Contact
类加载器作为 XStream 的类加载器,第60行将 Contact.class
配置给 XStream,XStream 可以识别 Contact
类的注解。在第87行调用 fromXML
方法将 XML 字符串 payload 反序列化为 Contact 类的对象 expl
。
当以下 XML 文档传入 fromXML
中,将执行 ProcessBuilder
对象实例化,并调用 start()
方法从而运行 Windows 计算器。
<contact> <dynamic-proxy> <interface>org.company.model.Contact</interface> <handler class="java.beans.EventHandler"> <target class="java.lang.ProcessBuilder"> <command> <string>calc.exe</string> </command> </target> <action>start</action> <handler> </dynamic-proxy></contact>
使用代码卫士对上述示例代码进行检测,可以检出“不安全的反序列化:XStream”缺陷,显示等级为高。在代码行第87行报出缺陷如图1所示:
图1:"不安全的反序列化: XStream" 检测示例
3.2 修复代码
在上述修复代码中,在第61行调用 allowTypeHierarchy
方法为反序列化类 Contact
添加安全权限避免不安全的反序列化。
使用代码卫士对修复后的代码进行检测,可以看到已不存在“不安全的反序列化:XStream”缺陷。如图2所示:
图2:修复后检测结果
4、如何避免不安全的反序列化:XStream
(1) 采用白名单策略,只允许白名单上的对象生成,不允许生成未经定义的对象。
(2) 对序列化对象执行完整性检查和加密处理,防止被恶意篡改和创建恶意对象。
(3) 反序列化过程之前执行严格的类型限制。
推荐阅读
【缺陷周话】第 24期:在scanf 函数中没有对 %s 格式符进行宽度限制
*奇安信代码卫士团队原创出品。未经许可,禁止转载。转载请注明“转自奇安信代码卫士 www.codesafe.cn”。