反序列化漏洞研究综述
doi: 10.12399/j.issn.2097-163x.2025.01.002
汪松1,2 , 丁婉蒙1,2 , 李宇薇1,2 , 沈毅1,2 , 李阳1,2 , 潘祖烈1,2
1. 国防科技大学电子对抗学院,安徽合肥 230037
2. 安徽省网络空间安全态势感知与评估重点实验室,安徽合肥 230037
基金项目: 国家自然科学基金资助项目(62202484)
Deserialization vulnerabilities: a review
WANG Song1,2 , DING Wanmeng1,2 , LI Yuwei1,2 , SHEN Yi1,2 , LI Yang1,2 , PAN Zulie1,2
1. College of Electronic Engineering, National University of Defense Technology, Hefei 230037 , China
2. Anhui Key Laboratory of Cyberspace Security Situation Awareness and Evaluation, Hefei 230037 , China
摘要
随着互联网技术的高速发展,应用程序与服务之间的数据交换日趋攀升。序列化机制为跨平台数据传输和交互提供了便利,在网络编程、数据持久化和分布式系统等应用程序中应用广泛,由其产生的反序列化漏洞问题也逐渐引发关注。攻击者注入精心构造的恶意对象以利用该漏洞实现远程代码执行等恶意行为,造成数据泄露、系统崩溃、服务中断等后果,严重威胁应用安全和用户隐私安全。因此,亟须对反序列化漏洞的原理及检测等相关研究进行系统性梳理和分析。介绍了反序列化漏洞背景和发展历史,以典型案例来阐述反序列化漏洞的实现原理,提炼了反序列化漏洞检测的一般方法,对学术界和工业界相关研究工作的原理进行了剖析。最后,根据相关技术的发展现状,讨论分析了反序列化漏洞未来可行的研究方向。
Abstract
With the rapid development of Internet technology, the data exchange between applications and services is increasing. The serialization mechanism provides convenience for cross platform data transmission and interaction, and is widely used in applications such as network programming, data persistence, and distributed systems. However, deserialization vulnerabilities caused by them have gradually attracted attention. Attackers inject maliciously crafted objects and then exploit these vulnerabilities to achieve remote code execution and other malicious behaviors, leading to data leakage, system crash, service interruption and other consequences, seriously threatening application security and user privacy security. Therefore, it is urgent to systematically sort out and analyze the principles and detection of deserialization vulnerabilities. This review introduced the background and development history of deseriali-zation vulnerabilities, explained the implementation principles of deserialization vulnerabilities through specific cases, extracted general methods for detecting deserialization vulnerabilities, and analyzed the principles of related research work in academia and industry. Finally, based on the current development status of relevant technologies, feasible future research directions of deserialization vulnerabilities detection methods in the future were discussed and analyzed.
0 引言
序列化机制允许应用程序将对象转换成字节流的形式,而反序列化机制利用字节流重新构建原始对象。序列化机制在服务端和客户端的数据交互、跨平台数据传输、数据持久化存储等方面发挥着关键作用,但带来便利的同时,序列化机制也带来了安全问题。未知来源的不可信数据被反序列化为恶意对象后,可能会触发应用程序内部的函数调用链,恶意对象所携带的敏感信息一旦流入调用链末端的安全敏感函数中,将会引发反序列化漏洞,并为拒绝服务(denial of service,DoS)、远程代码执行(remote code execution,RCE)等恶意行为提供可行的攻击入口。这种不安全的反序列化打破了原有的数据传输信任边界并拓展了攻击范围。
反序列化漏洞允许攻击者在没有任何身份验证的情况下执行远程代码,这意味着攻击者可以轻易地控制受漏洞影响的系统。这种类型的漏洞往往可能导致严重的安全后果(如数据泄露、系统崩溃、服务中断等),甚至完全接管目标系统。由于反序列化漏洞严重性,OWASP(open Web application security project)将不安全的反序列化列为 2017 年十大最关键的Web应用程序安全风险[1]。近几年,各类应用程序遭受反序列化攻击的事件不断增多。2021年12月7日,Java应用常用的日志工具库Log4j2被曝出含有严重漏洞,漏洞仅披露5天后,美国网络安全公司Cloudflare观察到400次/s利用Log4j2漏洞的攻击尝试,以及共计数百万次对易受该类型攻击系统的扫描[2]。漏洞被披露11天后,攻击者利用该漏洞成功攻击比利时国防部计算机网络并使其瘫痪,发言人随后证实了该攻击行为,并提到其邮件系统已经停机数日。此后网络上不断出现由此漏洞导致的僵尸网络攻击、挖矿木马攻击和多平台勒索等一系列问题。因此,反序列化漏洞具有很高的研究价值。
与传统的安全漏洞相比,反序列化漏洞的利用方式和攻击手段较为新颖,漏洞利用方式多样,由其间接导致的漏洞种类众多,这提高了检测和防御反序列化漏洞的难度。在实际开发中,为了避免引入反序列化漏洞,开发者需要确保所有从外部接收的数据都经过严格的验证,但这在复杂应用程序中难以实现。现有的安全防护机制例如WAF(Web application firewall)等难以有效区分正常的反序列化操作和恶意操作之间的差异[3],导致其无法完全防御反序列化漏洞攻击。此外,许多安全研究人员和开发者对其了解还相对有限,在进行软件开发时,没有充分意识到反序列化操作可能带来的安全风险,缺乏应有的防范意识和经验,从而制造了潜在的反序列化安全隐患。
当前学术界和工业界针对反序列化漏洞的检测工作,将其主要分为2大类:1) 基于静态分析;2) 基于动态分析。基于静态分析的漏洞检测工作[4-9]的目标是检测应用程序中触发反序列化漏洞的完整函数调用链,而基于动态分析的工作[10-15]的目标通常是生成实际注入对象,并利用模糊测试等技术引导注入对象到达链的安全敏感函数以实现链的验证。研究人员还开展了反序列化漏洞防御的研究[16-17]
虽然反序列化漏洞研究已经取得了初步进展,但是该领域尚未形成一个体系,且该领域的研究通常特定于某一种编程语言,提出的解决方法亟须进行科学的整理、归类、总结,以促进该领域的研究。因此,本文广泛调研了网络与信息安全领域顶级会议(USENIX Security)、软件工程领域顶级会议(international conference on software engineering,ICSE)、《网络与信息安全学报》等会议和期刊中关于反序列化漏洞的文献,对目前的研究工作进行梳理和总结,并对该领域未来潜在的研究方向进行了分析和讨论。希望本文的研究能够对学术界和工业界针对反序列化漏洞的进一步研究提供借鉴和思考。
本文的主要贡献有以下5个方面:
1) 对反序列化漏洞现有研究工作进行综述,深入调研了2014年至今的反序列化漏洞文献,依据反序列化漏洞“产生—检测—防御”的思路,对现有工作进行了系统性的梳理,为解决现有研究不成体系的问题提供了参考。
2) 从反序列化漏洞产生方面,深入分析了反序列化漏洞的原理,归纳总结了反序列化漏洞的发展历史,列举了反序列化漏洞的典型案例。
3) 从反序列化漏洞检测方面,提炼出了反序列化漏洞检测的一般框架,分别从静态分析和动态分析2个角度对目前反序列化漏洞的检测方法进行了深入分析。
4) 从反序列化漏洞防御方面,梳理了反序列化漏洞防御的现有研究,讨论分析了漏洞防御研究的思路和关键过程。
5) 从反序列化漏洞检测、自动利用与修复3个角度,讨论分析了反序列化漏洞未来潜在的研究方向。在反序列化漏洞的检测方法上,未来可以结合人工智能技术来提高检测方法的智能化水平;在反序列化的漏洞利用方面,未来可以提高利用过程的自动化程度。此外,反序列化漏洞的修复技术等也是非常有意义的研究方向。
1 反序列化漏洞背景
1.1 反序列化漏洞原理
为了更清晰地阐释反序列化漏洞的原理,本文首先对序列化、反序列化机制展开介绍,图1显示了Java序列化Person类的对象后生成的person.ser文件的内容,图的左侧是文件的16进制编码,第1行的aced代表序列化协议,0005代表序列化协议的版本;图2所示的代码调用Java的readObject方法对person.ser文件进行反序列化即可得到原始Person类的对象,输出结果如图3所示。
1使用Java生成的序列化文件的内容
Fig.1The contents of a serialized file generated using Java
2反序列化person.ser文件的代码
Fig.2The code to deserialize the file person.ser
3反序列化代码的输出结果
Fig.3The output of the code to deserialize
序列化机制可以将对象转换为字节流,而反序列化可以将序列化的字节流重新转换为对象,众多主流编程语言诸如Java、Python、PHP等都提供了对序列化机制的支持,并将其用于跨平台数据传输和数据持久化存储等场景。然而,对不受信任来源的数据进行反序列化会生成恶意的注入对象。该对象将在应用程序中的一条完整的函数调用链中传递,使得该恶意对象携带的敏感信息流入该链末端的安全敏感函数。如果该敏感信息是用户可控的,安全敏感函数执行的敏感操作将导致反序列化漏洞的产生,并进一步引发DoS、RCE等恶意行为。
图4所示,以跨平台数据传输场景为例,在Windows平台运行的应用程序为了实现跨平台数据传输,将要存储或传输的对象序列化为字节流。作为接收方,运行在Linux平台的应用程序将收到的字节流进行反序列化,得到原始的对象,从而执行后续的正常业务逻辑。但如果接收方的应用程序过分信任外部输入而未对字节流进行必要的安全验证,那么攻击者可以通过修改对象中的敏感信息,将其序列化为恶意字节流并传递给接收方(如图5所示),接收方的应用程序反序列化该字节流将得到恶意注入对象,该恶意注入对象会劫持程序的执行流程,并遵循一条完整函数调用链(即gadget函数调用链,简称gadget链)的逻辑,依次调用gadget链中的每一个gadget函数,使得敏感信息流入安全敏感函数。安全敏感函数在接收敏感信息后会执行敏感操作并触发反序列化漏洞,从而导致恶意行为。
4正常反序列化流程
Fig.4The normal deserialization process
5反序列化漏洞原理
Fig.5The principle of deserialization vulnerability
1.2 反序列化漏洞研究发展历史
反序列化漏洞的研究经历了多个阶段,从反序列化漏洞产生与识别,到基于静态分析技术的反序列化漏洞检测,目前正朝着基于动态分析和静态分析技术相结合的反序列化漏洞检测与自动化验证阶段发展,同时,关于反序列化漏洞的防御研究也已初步开展。本节将按照反序列化漏洞的产生、发展、检测、自动利用、防御5个阶段详细展开介绍。
反序列化漏洞的产生最早可追溯到2009年。2009年,ESSER[18]提出,基于不安全的反序列化的代码重用攻击在基于PHP的Web应用程序中是可行的;2010年,ESSER[19]在Black Hat USA大会上首次提出了适用于PHP语言的POP(property-oriented programming)链攻击。2014年,DAHSE等[4]分析了对象注入漏洞如何通过POP链进行利用,并通过静态扫描检测对象注入漏洞。2015年1月,GABRIEL在AppSecCali2015大会上发表了一篇报告[20],详细描述了Java反序列化漏洞可利用Apache Commons Collections库实现远程任意代码执行,并提供了Payload生成工具——ysoserial[21],当时并未引起太大关注,因此被视为“2015年最被低估的漏洞”。2015年11月,FoxGlove Security安全团队成员BREENMACHINE,介绍了如何利用该Apache Commons Collections库中的Java反序列化漏洞实现远程代码执行[22],漏洞影响各大Java Web Server,包括当时最新版本的WebLogic、WebSphere、JBOSS等主流Java框架。受影响的各大Java应用厂商陆续发布了修复版本,Apache Commons Collections项目也对存在漏洞的类库进行了一定的安全处理。此后,反序列化漏洞逐渐进入了安全研究人员的视野。
自2016年开始,反序列化漏洞的产生数量呈现明显增长。2016年,Java中的Spring框架与RMI(remote method invocation)组件集成中的反序列化漏洞(CVE-2016-5385[23])造成成百上千台主机被远程访问。在2017年Black Hat USA大会上,研究人员MUÑOZ和MIROSH披露了Json反序列化库漏洞及利用[24]。2017年末,有黑客大批量使用Weblogic XMLDecoder反序列化漏洞(CVE-2017-10271[25])批量种植挖矿病毒进行黑产活动,使反序列化漏洞再次引起热议。在2018年APPSec USA会议上,KOJENOV[26]以反序列化为主题作报告。2021年,Apache Log4j 2远程命令执行漏洞(CVE-2021-44228[27])曝光,引发社会广泛关注,攻击者利用Java库中的反序列化漏洞,构造恶意数据触发反序列化过程,从而执行任意代码,国家信息安全漏洞共享平台(CNVD)对该漏洞的综合评级为“高危”,很多媒体称之为“核弹级”漏洞。自反序列化漏洞出现至今,除了PHP和Java程序以外,陆续曝出Python[28-29]、.NET[730-31]、Javascript[32]、Ruby和Android[33]等编程语言中也存在反序列化漏洞。
随着反序列化漏洞不断产生,针对不同目标应用程序的反序列化漏洞检测方法和工具[34-35]不断涌现,这一阶段对反序列化漏洞的检测主要以静态程序分析技术为主,数据流分析、污点分析等都发挥了各自的作用。例如,文献[6-8]利用数据流分析确定数据是否能够到达触发反序列化漏洞的安全敏感函数,以检测应用程序中完整的gadget链;GadgetInspector[5]和Tabby[6]等利用污点分析方法跟踪不受信任的输入数据在程序中的传播过程,生成调用图并查找gadget链。
在反序列化漏洞gadget链验证阶段,很多研究工作采用模糊测试这一动态程序分析技术方法[10-15]。这些工作通常针对待验证的gadget链进行建模以生成实际注入对象,并利用模糊测试引导注入对象到达gadget链的安全敏感函数以实现链的验证。
同时,针对反序列化漏洞的防御技术研究开始出现。2018年,CRISTALLI等[17]提出了一种基于可信执行路径的新型沙盒框架,以保护Java应用程序免受反序列化漏洞利用攻击;2024年,DAVID等[16] 提出了可以自动缓解PHP应用程序中反序列化攻击的系统QUACK。
从发展历史来看,反序列化漏洞研究呈现3个明显特征与趋势:一是反序列化漏洞研究围绕多种编程语言展开,其中以Java和PHP为主,还包括Python、.NET、Ruby、Android等编程语言;二是反序列化漏洞检测研究最初基于静态分析技术方法,目前正朝着基于动态分析和静态分析技术相结合的反序列化漏洞检测与自动化验证研究方向发展;三是目前大多数序列化漏洞检测及验证研究结合模糊测试的方法进行,而在模糊测试策略选择上,由以覆盖率引导的模糊测试方法向基于定向模糊测试方法转变。
1.3 反序列化漏洞典型案例
以编号为CVE-2021-21345的真实漏洞为例[36],该漏洞是热门Java反序列化工具库XStream[37]于2021年曝出的RCE漏洞。XStream的主要功能是基于序列化和反序列化实现Java对象和XML(extensible markup language)文档之间的相互转换。
该漏洞对应的gadget链的执行流程如图6所示。攻击者生成一个精心构造的PriorityQueue类对象并将其序列化生成字节流,受害主机在接收到该字节流后,会调用PriorityQueue类的readObject方法(反序列化入口点,见图6第2行)进行反序列化得到原始的PriorityQueue类对象。该对象会维持一个优先级队列,因此需要调用heapify方法(第4行)对队列中的元素进行优先级排序。排序的规则依照创建PriorityQueue时设置的比较器IndexOrderComparator,故代码执行至第7行以实现对队列中的2个元素进行比较。随后,受害主机将调用ResponseContext类的get方法(第11行)以根据给定的键(key)从响应上下文中检索对应的值。由于该例中序列化后的格式为XML格式,故利用XMLMultiPart类来对上下文信息中XML格式的内容进行处理,即第12行this.packet.getMessage()方法将得到XMLMultiPart的类对象。通过方法之间的前后调用,代码将执行到第17行。为了处理XML中与JAXB(Java architecture for XML binding)对象相关的内容,代码将执行JAXBA-ttachment类的getInputStream方法(第19行)。
6XStream中的漏洞CVE-2021-21345
Fig.6The vulnerability CVE-2021-21345 of XStream
随后,其通过writeTo方法(第22~24行)将JAXB对象序列化为XML,并将这个XML写入到给定的输出流中,这个方法是实现附件数据序列化(即代码31~39行的主要作用)并发送到客户端或服务端的关键步骤。最终,敏感信息流向了安全敏感函数Method.invoke()(第42行),敏感信息中指定了要通过Java反射机制调用的方法是ServerTableEntry类的verify方法,该方法可以理解为一个后门方法,verify方法中调用了Runtime.getRuntime().exec()方法,其参数activationCmd是要执行的命令,通过反射将activationCmd修改为“calc”即可弹出受害主机系统的计算器,从而导致RCE漏洞。
2 反序列化漏洞检测一般方法
图7所示,现有的反序列化漏洞检测框架的输入一般为应用程序的代码,输出是可利用的(即可以通过注入恶意对象形成反序列化漏洞)gadget链。检测流程一般分为2个阶段:静态分析和动态验证。
7反序列化漏洞检测通用框架图
Fig.7A general framework for deserialization vulnerability detection
2.1 静态分析阶段
静态分析阶段可分为3个步骤:入口点(source函数)识别、gadget函数片段的查找和source函数到sink函数的完整的gadget链构建。所谓入口点指的是编程语言自身提供的反序列化相关的函数和反序列化协议提供的函数,这些函数又称source函数,静态分析提取这些入口点用于后续的检测工作。
gadget函数片段是指一个gadget函数的序列,序列的头部是该序列的入口,一般是可以跳转到该函数的动态函数调用。动态函数调用是指在运行时动态地获取类的信息并调用其函数的机制,例如Java语言通过反射、动态代理等方式实现动态函数调用,该机制为应用程序的灵活性和扩展性提供了强大的支持。gadget函数序列的尾部是该片段的出口,通常是动态函数调用或者sink函数。除了动态函数外,按照顺序执行的非动态函数也将作为gadget函数序列。由于编程语言对动态特性的支持,仅考虑静态定义的类中的gadget函数会产生大量的漏报,可以在动态分析/验证阶段将动态生成的gadget函数囊括在内[12]。gadget函数片段的查找通常基于污点分析、控制流分析、数据流分析等方法实现。
source函数到sink函数的完整的gadget链构建步骤中,将gadget函数片段分为3种类型:以source函数作为起始gadget函数的片段、2次函数调用作为起始和结尾的片段、以sink函数作为结尾的片段,然后使用自底向上的搜索方式将gadget函数片段逐一链接起来,从而构造出所有候选的gadget链。自底向上的搜索方式指的是从sink函数开始反向搜索,以找到source函数为结束标志的调用链构建方式。由于source函数和sink函数之间可能存在的路径数量是指数级别的,在静态分析阶段非常容易引起路径爆炸问题,从而导致无法检测出完整的调用链。同名函数的候选数量十分庞大,自顶向下的搜索方式会多次分析同一函数,导致效率低下。此外,对于大型应用程序,其源代码中的类之间的各种关系十分复杂,类包含的函数数量众多,自顶向下的搜索方式会在大量无关的代码路径上浪费资源和时间,但自底向上的搜索方式从实际可能导致漏洞的sink函数开始,逆向追踪到序列化的入口点,可以有效确保检测的质量,提高检测的准确性和效率。
2.2 动态验证阶段
现有工作通常使用模糊测试[38-39]方法来完成动态验证。动态验证阶段遵循模糊测试的基本框架,可分为:种子生成、种子变异、种子优先级排序、模糊测试这4个步骤,动态验证阶段的输出通常是可利用的gadget链。在当前的应用场景下,模糊测试的主要功能是生成具体的、有效的注入对象并对静态分析阶段得到的可疑的gadget链进行验证。
在当前的应用场景下,模糊测试所使用的种子就是注入对象,由于gadget链的执行流程会存在多级嵌套的形式,为了能够生成有效的注入对象,一种方法是将gadget函数中涉及的类实例化以收集类的可用属性等相关信息,通过自定义的数据结构对待检测的gadget链进行建模,再将该数据结构转换为初始注入对象,即初始种子。
有了初始种子,在待测应用程序上执行初始注入对象以开启模糊测试的进程,模糊测试可以简单分为基于覆盖率引导的模糊测试和定向模糊测试2大类。采用基于覆盖率引导的模糊测试的工作通常会收集代码覆盖率等关键信息来指导模糊测试,因此在种子变异阶段会更加关注那些代码覆盖率更高的种子并提高这些种子的优先级,然后根据种子的属性类型不同进行相应的变异操作。而采用基于定向模糊测试的工作会通过自定义的函数来计算种子到sink函数的距离,并赋予离sink函数更近的种子更多的能量。从与应用场景的适配程度来看,定向模糊测试更适合完成这类起点(source函数)和终点(sink函数)都确定的注入对象生成的任务,但是距离这一度量如何定义十分重要,因为它关乎模糊测试的性能。
如果种子到达了sink函数并完成了完整的gadget链的执行,模糊器将会输出该调用链并将其作为是可以被利用以触发反序列化漏洞的调用链。至此,检测工作结束。
3 基于静态分析的反序列化漏洞检测
3.1 各类编程语言的序列化机制的特点
Java、Python、C#、PHP等主流的编程语言中都广泛存在反序列化漏洞,目前基于静态分析的反序列化漏洞检测的研究工作一般都特定于某种语言,不同的编程语言提供了不同的序列化和反序列化机制。Java语言中的序列化涉及ObjectInputStream和ObjectOutputStream类,它允许实现了Serializable接口的对象转换为字节流。这种机制虽然功能强大,但易受到恶意构造的字节流导致的远程代码执行等攻击。Python语言使用pickle模块进行对象的序列化和反序列化,pickle模块可以序列化大多数Python对象,而无须实现特定的接口。然而,这也使得pickle模块容易受到攻击,因为它可以执行对象的__reduce__魔术方法,从而潜在地触发恶意代码。C#语言中,BinaryFormatter用于序列化和反序列化对象,它使用二进制格式存储对象的状态,这意味着它不像Java语言那样直接存储对象的方法或属性。尽管这种方法相对安全,但如果使用不当,仍然可能导致反序列化安全隐患。PHP的序列化机制允许保存对象的方法、属性和类名,这增加了灵活性,但也带来了风险——攻击者可能通过构造恶意的序列化字符串来触发特定方法或访问私有属性。
每种编程语言都有自己的安全机制和实践方法。Java提供了一些内置的安全机制,其中包括 java.io.Serializable接口和java.io.Externa-lizable接口。这些接口允许开发人员控制序列化和反序列化过程。Python语言提供了沙箱机制来隔离潜在的恶意代码执行,Python的沙箱是一个受限制的执行环境,它允许运行不受信任的Python代码,同时限制其访问系统资源和执行危险操作。这种机制在网络安全领域尤为重要,因为它可以隔离潜在的恶意软件,防止它们对计算机系统造成损害。在C#语言中,为了提高安全性,通常使用CAS(code access security)[40]机制来限制,确保只有具有足够权限的代码才能执行序列化和反序列化。此外,C#推荐使用DataContractSerializer[31]、Json.NET[41]等库进行序列化操作,这些库提供了更多的安全性控制。在PHP语言中,反序列化漏洞通常与unserialize()函数有关,因此PHP 7.0及以上版本引入了unserialize()函数的安全特性,可以通过设置allowed_classes参数来限制反序列化的类。
在安全实践中,针对不同语言和框架的反序列化安全问题,需要采取针对性的安全策略和防御措施。
3.2 基于静态分析的反序列化漏洞检测研究工作
gadget链是攻击者用来控制应用程序执行流以实现反序列化漏洞的关键,因此现有的基于静态分析的反序列化漏洞检测的核心在于查找完整的gadget链。文献[47-8]实现了改进的数据流分析以挖掘更多的gadget链,文献[5-6]利用污点分析方法检测污点参数的传播路径以实现gadget链的构建,文献[9]基于对源码的静态分析实现了自定义的调用图并基于特定的查询规则在调用图中查找完整的gadget链。这些工作的特点见表1所列,下文将对这些工作展开详细介绍。
1基于静态分析的反序列化漏洞检测研究工作
Tab.1 Research on deserialization vulnerability detection based on static analysis
文献[4]中使用数据流分析来系统地检测常见PHP应用程序中的gadget链,提出了一种过程间、字段敏感和对象敏感的数据流分析,并利用它来分析相关的面向对象编程的特征。该工作将给定应用程序中的每个PHP文件转化为抽象语法树,分析每个抽象语法树的函数和类的声明,并将抽象语法树转换为控制流图。在此过程中,抽象语法树会被分割为能够表示程序控制流的链接基本块。如果有新的基本块链接到当前基本块,当前的基本块就会被“模拟”,即分析器会模拟执行这个基本块中的代码。通过使用数据的抽象表示来从抽象语法树中推断当前基本块的数据流,并将数据流分析的结果存储在块的摘要中。在块模拟期间,若出现敏感的sink函数,则使用反向污点分析受影响的参数;若它源自未经验证的用户输入,则会根据sink函数的类型报告新的漏洞。由于该工作对动态的面向对象编程的特征处理得不够精确,从而存在误报和漏报的问题。
除了改进数据流分析外,研究人员也尝试了将其与模式匹配相结合。SHCHERBAKOV等 [7] 提出了第一个在.NET应用程序中检测和利用对象注入漏洞(object injection vulnerability,OIV)的方法SerialDetector,其包括检测阶段和半自动利用阶段。在检测阶段,SerialDetector首先将.NET程序集合作为输入,对其执行调用图分析以识别可以到达敏感sink函数的入口点;然后,它使用这些信息进行字段敏感的基于污点的数据流分析。该分析的核心在于基于方法摘要、指针别名和控制流图的高效即时重建的模块化过程间抽象解释,分析的目的是识别“攻击触发器”(即source函数),从而生成OIV模式,生成的模式的有效性取决于能够导致漏洞利用的gadget链在公开的gadget链列表中是否存在。在半自动利用阶段,SerialDetector 将生成的模式与公开可用的gadget函数列表进行匹配。当gadget链与模式匹配时,SerialDetector会在知识库中描述该gadget链,以生成不同格式的恶意负载来验证它们对目标应用程序的可利用性。
SerialDetector和文献[4]工作的关键区别在于 SerialDetector的分析在程序级别进行,以发现新的OIV模式,而文献[4]则通过众所周知的攻击触发器来针对 PHP 源代码。但SerialDetector的缺陷也十分明显,其漏洞检测严重依赖于已知的gadget链,而并非具有检测新的gadget链的能力。
值得注意的是,上述研究提出的改进数据流分析通常是针对特定编程语言的,存在无法扩展至其他编程语言的局限性,因此研究人员考虑将编程语言转换为通用中间语言再进行数据流分析,以解决这一局限性。SerialDetector应用了针对通用中间语言(common intermediate language,CIL)的基于污点的字段敏感的数据流分析,分析的核心是利用基于方法摘要、指针别名和控制流图的高效即时重建的过程间抽象解释。但SerialDetector的方法特定于通用中间语言的字节码,BUCCIOLI等[8]受到SerialDetector的启发,设计了一种直接作用于语言特征并能够输出潜在的反序列化攻击链的自动方法,提出了一个Java反序列化漏洞自动检测框架JChainz。JChainz直接作用于Java语言的构造(对象、方法、数据类型等),它设计了一种旨在发现链接Java类库的潜在攻击Java反序列化链的分析。JChainz的分析目标是构建一个表示类的调用者和被调用者的方法之间关系的调用图,从调用图中提取到感兴趣的sink方法且代表潜在攻击向量的链。JChainz主要包含2个部分:查找器和分析器。查找器根据Java字节码提取潜在攻击向量的source和sink方法,随后构造目标库的调用图,从中提取出可疑的gadget链。分析器会针对每一个可疑的gadget链构建数据依赖关系图,以确定gadget链中的类之间的输入数据流。最后,分析器应用类型传播算法来排除误报,选择候选攻击向量并输出可利用的gadget链。
还有一些研究引入了污点分析来进行gadget链的自动检测工作,HAKEN等[5] 在2018年Black Hat USA大会上发表了关于Java反序列化gadget链自动检测的研究方法GadgetInspector。它利用静态污点分析和简单的符号执行来挖掘目标应用程序的方法内/间的参数传播路径,然后执行广度优先搜索来查找可利用的gadget链。GadgetInspector首先枚举Java应用程序类路径上的所有类、方法及其元数据,使用这些信息建立了类继承层次结构和方法重写层次结构,通过逐级执行字节码和执行一些简单的符号执行,寻找含有“passthrough”数据流的方法。含有“passthrough”数据流的方法是指该方法的某个参数可由攻击者控制,使得该方法返回的对象也可由攻击者控制。然后,GadgetInspector枚举从方法参数到方法调用的数据流,构建应用程序的调用图,使用第一步中的类和方法层次结构,枚举所有gadget链的source方法。最后,使用构造的调用图,从搜索到的source方法开始,进行广度优先搜索,当遇到sink方法时,输出一条完整的gadget链。
尽管GadgetInspector是一项开创性的Java反序列化漏洞挖掘工作,但该工作存在较大改进空间,GadgetInspector对Java的多态性处理不够完整,导致其所构建的调用图不够全面,此外,GadgetInspector在过程间分析中存在精度损失问题,由此导致它的检测结果存在大量误报和漏报。武永兴等[9] 为了解决这些问题提出了GadgetResearch,GadgetResearch是一个“混合分析”(同时进行指针分析和污点分析)的gadget链挖掘方法。它利用变量类型声明构造调用图,根据调用图筛选出可能到达sink函数的source函数。GadgetResearch利用得到的source函数开展针对污点变量和指针的混合信息流分析,对隐式创建的对象标记污点,利用加载污点对象字段、将污点作为调用函数的对象、将污点作为调用函数的参数这3种污点转移规则构建混合信息流图。依照混合信息流图找出从source函数开始污点源流向sink函数的路径。实验结果表明GadgetResearch在ysoserial等数据集上的误报率和漏报率比GadgetInspector低。
此前的工作只能检索到源代码中的gadget链而无法检测第三方工具库中的gadget链,由于第三方库封装完整、使用便利,很多开发人员在项目中引入第三方库来提高开发效率,因此存在于第三方库中的gadget链数量众多,具有很高的研究价值。CHEN等[6]提出了基于代码属性图的Java应用gadget链检测工具Tabby,Tabby提供了对第三方库中的gadget链检测的支持。Tabby的工作流程如图8所示,Tabby包括3个部分:代码属性图构建、可控性分析、gadget链识别。Tabby的代码属性图是一个有向图,包含类节点和方法节点,包括extend(继承)、interface(接口)、has(包含)、alias(别名)、call(调用)5种边类型。代码属性图由3类图构成:对象关系图、精确调用图、方法别名图。对象关系图的创建需要分析的类节点和方法节点,并构建extend、interface、has 3种类型的边。对于精确调用图的构建,Tabby先构造方法调用图,并捕获当前方法体中的所有外部方法调用,以识别和建立当前方法中的方法调用关系。随后,Tabby应用可控性分析算法,分析变量的可控性并删除与方法调用图中不可控变量对应的方法调用边,从而得到精确调用图。在构建方法别名图的过程中,为了解决父类和子类的同名方法都具有相同的方法名称、返回值和方法参数数量,导致无法确定哪个方法调用能够直接触发反序列化漏洞的问题,Tabby设计了一个alias边,将当前方法与其父类中的方法连接起来,使得潜在的gadget链在代码属性图上连通,从而完成代码属性图的构建。Tabby从sink方法开始反向遍历代码属性图,逐一链接gadget链,一旦遍历到source方法,则确定当前gadget链为可利用的gadget链。
相较于GadgetInspector,Tabby充分处理了Java的多态性,构建了较为完善的调用图,并将其存入Neo4j数据库[46]中,使得分析结果可以反复利用。然而,Tabby仍存在一定问题,其缺乏生成有效负载以验证gadget链的能力,且无法检测涉及动态代理和反射机制的gadget链,这在第4节提到的研究JDD[15]中得到了充分解决。
8Tabby的整体工作流程
Fig.8Overall workflow of Tabby
4 基于动态分析的反序列化漏洞检测
由于Java、PHP等编程语言具备动态编程特性[47],如反射[48-50]、多态和代理[51]等,因而完全通过静态分析检测漏洞会带来误报多、效率低的问题。相较于静态分析,动态分析具有误报率低、自动化程度高的优点,而且可以用于漏洞利用载荷构造及验证,这是静态分析难以实现的。目前大多数序列化漏洞检测及验证研究结合模糊测试的方法进行,见表2所列。
在反序列化漏洞检测研究工作中,存在很多反序列化漏洞扫描工具。例如文献[10]设计和实现了一种检测PHP和Java反序列化漏洞的工具ObjectMap,通过分析HTTP请求中可能的插入点,生成一系列请求,并在插入点中包含伪造的有效负载,当有效负载被直接传递给服务器端的反序列化函数时,这些有效负载将迫使目标Web应用程序抛出错误。该工具生成一系列请求来寻找有效的对象注入点、检测有效负载是否可以直接传递给目标应用程序,以检验可能的反序列化漏洞。然而,该工具探索了恶意输入,但不能进一步利用或产生新的gadget链。类似的反序列化漏洞检测工具还有许多,例如Marshalsec[34]、Java Deserialization Scanner[35]等。
但此类Web漏洞检测工具Acunetix[52]、Burp Suite[53]、SonarQube[54]等难以直接验证漏洞利用链,而灰盒模糊测试可以解决该问题。当前基于灰盒模糊测试的反序列化漏洞检测与利用研究工作,通常首先利用静态分析技术得到可疑的gadget链,再采用基于变异的测试用例生成方法,生成具体的、有效的注入对象,对可疑的gadget链进行验证,模糊器最终将触发危险函数的gadget链作为可以被利用以生成反序列化漏洞的调用链。
2基于模糊测试的反序列化漏洞检测研究工作
Tab.2 Research on deserialization vulnerability detection based on fuzzing test
在当前基于模糊测试的反序列化漏洞检测研究工作中,根据模糊测试策略,可以将其分为基于覆盖率引导的模糊测试和定向模糊测试2类。采用基于覆盖率引导的模糊测试的工作通常会收集代码覆盖率等关键信息来指导模糊测试,以引导测试覆盖尽可能多的代码路径。例如CAO等[13] 基于覆盖率引导对象生成策略,设计实现了GCMiner,它包含3个模块:图的构造、链的识别和链的验证。在图构造阶段,GCMiner将1个目标Java应用程序作为输入,在静态分析时生成调用图,以捕获显式的方法调用,并通过类层次分析(class hierarchy analysis,CHA)[55]添加额外的覆盖关系来构造反序列化感知调用图(deserialization-aware call graph,DA-CG)以识别隐式方法调用,最终构造DA-CG,以获取更多的gadget链,该方案使用了Java代码静态分析工具Tabby[6],来提取DA-CG构建方法之间的调用和重写关系;对于链识别,GCMiner将DA-CG存储到图形数据库中,其使用了图形数据库Neo4j来执行定制的查询脚本,并通过图形遍历搜索可疑的gadget链;在链验证阶段,GCMiner首先通过实例化目标链的入口点所属的类以生成一个初始注入对象,然后根据DA-CG提供的关系信息,通过动态绑定对初始注入对象的属性值进行修改,确保注入对象能够到达危险sink点。为了验证给定gadget链的危险sink点是否会受到生成的注入对象的影响,GCMiner采用了基于生成的覆盖率引导Java模糊框架JQF[56],一旦注入对象到达安全敏感调用站点,待测gadget链将被确认为可利用的gadget链。
然而,在实际过程中,上述以覆盖率引导的模糊测试解决方案在程序路径上耗费太多精力,而一些路径无法到达sink点,而基于定向模糊测试的工具能够快速地测试设定的目标位置是否可能存在漏洞。
对于PHP应用程序的反序列化漏洞研究,PARK等[12] 设计实现了第一个POI漏洞自动化利用工具FUGIO,FUGIO的架构如图9所示。其核心在于触发识别的POI漏洞时,识别出可用的gadgets组成的POP链,并为识别出的可利用POP链进行模糊测试生成输入对象。FUGIO的程序分析包括静态分析和动态分析2个阶段。在静态分析阶段,FUGIO收集类名、包含的属性和成员方法、调用者与被调用者关系、成员函数体中的数据流等;在动态分析阶段,它收集静态分析器收集不到的额外信息;然后,在其构建的深度有界调用树上进行粗粒度的程序间污点分析,以修剪不必要的POP链,并执行深度限定的宽度优先搜索枚举可能的链。基于静态和动态分析获取的信息,POP链识别器输出一个可用的POP链列表和一个用于执行模拟测试的输入。在模糊测试阶段,FUGIO采用属性树生成注入对象,并使用一些启发式规则对种子进行变异,给定一个输入和一个POP链,FUGIO在输入上构造反馈驱动的模糊测试从而生成利用对象。该方案在应用于Java反序列化漏洞检测与验证时,可能会存在计算空间过大的问题,这是因为Java应用程序可能会集成数百个具有各自依赖的库,包含数量巨大的类和方法,在构建调用树时会导致深度和宽度过大而造成巨大的计算空间。
9FUGIO的架构
Fig.9Architecture of FUGIO
对于Java应用程序的反序列化漏洞研究,RASHEED等[11] 提出了一种混合分析方法SerHybrid来检测潜在的Java反序列化漏洞。SerHybrid首先通过静态分析从给定的Java库中获取指向图、本地堆分配、堆访问路径,然后在动态分析阶段,它使用静态分析的结果并利用Java单元测试生成测试用例的Randoop[57]框架以构建对象,并验证是否能观察到source到sink的方法执行路径。然而,SerHybrid所采用的堆访问路径无法推断出隐式控制流,这使该方法具有局限性。CAO等[14] 设计了一种基于定向模糊测试的解决方案ODDFuzz,该工作基于污点分析搜索出的可能导致反序列化漏洞的gadget链,应用了一种结构感知的种子生成方法来保证测试用例的有效性,并采用混合反馈和步进式的变异策略来指导定向模糊测试,以生成实际的注入对象进行验证。具体来说,在静态分析阶段,ODDFuzz首先计算路径上所有方法的静态摘要,摘要用于识别可利用的gadget链,通过深度优先搜索策略和最大长度阈值静态搜索可能的gadget链,且在进行污点分析时,只有当调用函数被污染时,才对调用语句进行类层次分析。在动态分析阶段,ODDFuzz设计了一种结构感知的种子生成方法,实例化gadget链中的类,并利用反射动态收集每个类的可用属性,以构造属性树;然后,遍历树的主干,将其转换为模糊测试的初始注入对象。在种子优化方面,CAO等[14]提出了一种混合反馈驱动的种子优化方法,考虑了种子距离和gadget覆盖率2种反馈度量;在种子变异方面,其利用JQF框架,将参数位级突变对应于注入对象的属性级突变,然后采用步进种子变异策略,有效地引导种子到达gadget链中的sink函数。然而,上述的工作通常采用自顶向下的静态方法来广泛地检查从source到sink的潜在路径,这种搜索经常会发生指数级路径爆炸;其次,ODDFuzz并没有考虑到在每个gadget链中应该满足的约束条件,从而导致不正确的payload产生。
为此,CHEN等 [15] 设计了一个基于gadget片段摘要技术和自底向上的检测方案JDD,并通过分析和建模,使静态分析引擎具备模拟Java语言动态特性的能力。该研究设计了一种新型数据结构来表征程序执行时的条件约束,以利用定向模糊测试技术进行高效的payload生成和输入变异,实现端到端的调用链检测和可利用性验证。具体来说,JDD的工作流程分为gadget链检测和可利用注入对象生成2个阶段。在gadget链检测阶段,JDD首先识别程序的入口点,然后构建gadget片段并进行数据流分析,记录“基于gadget片段的摘要”。在完成对gadget片段的搜索后,JDD执行自底向上的搜索,从而构建所有潜在的gadget链,该搜索策略将搜索复杂度从指数级优化为多项式级别以解决路径爆炸的问题。在可利用注入对象生成阶段,JDD首先提取gadget链的约束,然后通过一种新的数据结构注入对象构造图(injection object construction diagram,IOCD)以更好地表示注入对象字段之间的数据流依赖关系,进而通过IOCD增强的定向模糊测试进行gadget链验证。
在使用动态分析方法检测反序列化漏洞的研究工作当中,还有其他未使用模糊测试的动态分析方法,如SRIVASTAVA等 [58] 提出的Crystallizer,首先使用轻量级静态分析构建候选gadget链,然后再利用动态分析模块自底向上为链中的每个gadget实例化对象,最终创建一个有效负载,以发现更多的gadget链。
5 反序列化漏洞的防御
在反序列化漏洞防御方面,为了解决与Java应用程序中不受信任数据的反序列化相关的安全问题,CRISTALLI等[17]提出了一种基于可信执行路径的新型沙盒框架,以保护Java应用程序免受此类攻击。该沙盒框架系统分2个阶段运行,分别为学习阶段和检测阶段。在学习阶段,该系统设计了一个基于堆栈跟踪对象的以应用程序为中心的模型,该模型仅考虑与操作系统交互的本地方法相关的堆栈跟踪,为了根据执行路径定义合法的反序列化行为,该系统通过提供适当的输入集来刺激反序列化过程,从而动态收集受监视应用程序的堆栈跟踪。随后,该框架会拦截应用程序调用的所有本地方法。对于每次调用,它会向后检查相应的堆栈跟踪,直到到达反序列化入口点并提取执行路径,然后将此信息保存到称为沙盒策略的持久存储中,这将构成检测恶意行为的基线。在检测阶段,当用户输入触发反序列化事件时,系统根据沙盒策略执行一次检查:当应用程序调用本地方法时,系统会拦截它并检查在学习阶段是否已经观察到了执行的整个堆栈跟踪,以确保应用程序仅执行受信任的执行路径,从而保护应用程序免受不可信数据的反序列化攻击。
此外,针对PHP应用程序中的反序列化攻击,DAVID等[16] 提出了可以自动缓解PHP应用程序中反序列化攻击的系统QUACK,QUACK的分析流程如图10所示。QUACK建立在“通过静态观察反序列化后对象的使用方式,可以推断出反序列化对象的预期类型”的理论之上,它的分析流程包括输入包分析阶段和反序列化保护阶段。在输入包分析阶段,QUACK执行静态分析识别要进行反序列化的函数调用,首先构建调用站点上所有可用类的可靠过近似,从而考虑到PHP类加载逻辑的动态特性。随后采用过程间、上下文敏感和流敏感算法来跟踪反序列化对象的使用方式来过滤可用类的列表,构建允许的类的最终列表,然后将其提供给反序列化 API。在反序列化保护阶段,QUACK从每个反序列化调用站点的可用类集开始,根据从代码收集的对象使用模式应用过滤步骤来推断允许的类集,静态地收集程序代码中在反序列化后操作对象的所有语句,并将运行时可用的类列表构造一个过滤器,然后使用安全的API调用生成器重写每个调用站点来计算并应用允许的类约束,从而生成受保护的应用程序。
10QUACK分析流程
Fig.10The analysis process of QUACK
6 反序列化漏洞的未来研究方向
6.1 反序列化漏洞检测引入人工智能技术
在反序列化漏洞检测的一般步骤中,许多环节都可以引入人工智能技术来提升效率和准确性。未来研究人员可以通过训练机器学习模型来识别反序列化相关的函数和反序列化协议提供的函数。这些模型从已有的漏洞数据集中学习入口点的特征,并在新的代码库中自动检测这些特征。如果入口点的识别涉及源代码的文本分析,可以利用自然语言处理(natural language processing,NLP)技术来识别函数名、注释或代码模式,从而更准确地识别入口点。
gadget函数片段的查找过程中,对于复杂的控制流图和数据流图,研究人员可以考虑运用深度学习算法来挖掘潜在的gadget函数序列,例如通过训练模型理解程序结构并预测哪些函数片段可能构成攻击链的一部分,也可以利用图嵌入技术将程序的控制流图和数据流图嵌入到向量空间中,然后使用神经网络模型来识别潜在的gadget函数序列。此外,该查找过程也可以考虑应用深度学习模型用于分析控制流路径,预测哪些路径更可能包含gadget函数片段。
gadget链构建阶段中,研究人员可以使用图神经网络 (graph neural network,GNN)[59]来表示和分析代码的依赖关系,从而更好地构建gadget链;可以考虑应用遗传算法、模拟退火等现代优化算法来搜索最优的gadget链,智能化地选择和剪枝可能的调用链路径,减少路径爆炸问题,同时提高发现真实gadget链的概率。此外,研究人员可以尝试利用强化学习来构建gadget链,通过定义合适的奖励函数来引导搜索过程,以找到最可能导致漏洞的调用链。
动态验证阶段中,研究人员可以考虑应用生成对抗网络(generative adversarial networks,GAN)[60]或变分自编码器(variational lossy autoencoder,VAE)[61]等深度生成模型来生成更有效的初始种子和变异种子;也可以尝试将强化学习应用于种子变异过程,通过不断迭代试错学习最优变异策略,使得生成的注入对象能更高效地触发sink函数,同时降低无效测试用例的数量;还可以利用机器学习方法对种子进行优先级排序,基于历史数据预测哪些种子更有可能导致漏洞触发等。
6.2 反序列化漏洞自动利用
现有的工作将关注重点放在了引起反序列化漏洞的gadget链上,但对漏洞利用自动化生成的支持不足,设计框架检测到了gadget链后,还需要安全人员根据框架生成的注入对象手动将流向sink函数的敏感信息替换为恶意信息,未来的研究可以致力于开发更加智能和自动化的漏洞危害性评估技术,分析漏洞特征,生成针对特定漏洞的利用代码,评估漏洞的严重程度,从而达到减少人工干预以及降低误报和漏报的目的。
大语言模型已经展现出强大的代码生成能力。针对反序列化漏洞,可以微调开源大模型,使其理解反序列化过程中的数据结构、类层次结构和函数调用关系。通过对目标应用的特定反序列化逻辑的学习,使模型能够生成能够绕过安全防护、触发漏洞的精心设计的序列化payload,从而在得到可利用的反序列化gadget链的基础上,进一步确定了该链的实际可利用性。此外,强化学习算法可以让智能体在模拟环境中学习最佳动作序列,以达到特定的目标状态。在这个场景下,智能体代表payload生成器,其行动包括修改payload的属性值或结构。目标状态可以定义为成功触发sink函数或者满足其他漏洞利用条件。通过不断试错和反馈,智能体将逐渐学会生成最有可能触发漏洞的payload。
在静态分析阶段,可以结合符号执行或抽象解释技术,通过分析源代码或二进制代码的语义,了解目标反序列化逻辑的约束条件,并将这些条件转化为数学公式或逻辑表达式。使用SMT(satisfiability modulo theories)求解器[62]寻找满足这些约束的payload值,生成的payload就更有可能触发漏洞。而在模糊测试阶段,漏洞利用生成技术可以根据前一轮测试的结果动态调整payload生成策略。例如,当发现某些类型的属性值更容易触发gadget函数调用时,模糊测试工具能够优先变异这些部分,甚至尝试利用GAN来创造新颖、复杂的payload结构。
相对于检测到gadget链后的手动生成漏洞利用的过程,反序列化漏洞自动化利用生成技术的发展将有效提高反序列化漏洞检测的效率,并使漏洞检测的结果更加精确,可以帮助开发团队更快地理解漏洞原理、重现问题,并迅速制定和实施补丁方案,降低企业因漏洞遭受攻击的风险。
6.3 反序列化漏洞自动化修复
未来反序列化漏洞的自动化修复将趋向于一体化和智能化。首先,智能检测框架在识别出潜在的可利用gadget链之后,将进一步深化分析,依据预设的安全规范和编程语法规则智能生成针对性的修复方案,利用人工智能算法训练模型直接生成安全补丁代码。这一过程有望实现实时反馈至软件生命周期的开发与运维流程中,一旦检测到漏洞,即可快速应用自动化修复,并即时编译部署修复后的版本。其次,未来的解决方案还将融合运行时保护技术,通过诸如RASP(runtime application self-protection)[63]等手段在检测到恶意反序列化活动时动态启动防御措施,阻止漏洞被利用。而在软件开发初期,通过AI辅助编程工具实时指导开发者遵循安全编码实践,从根本上减少反序列化漏洞的引入。此外,体系将构建具备自适应能力的安全策略引擎,随着新型漏洞利用模式的出现,能够及时更新检测规则和修复模板,使整个安全生态得以持续优化和完善。在此基础上,亦有可能借助元编程技术实现运行时动态调整程序行为,提供无须重新编译的虚拟补丁,为暂时无法实施源代码修复的情况提供临时安全防护。
未来反序列化漏洞的自动化修复将朝着覆盖软件全生命周期、快速响应、精准定位与修复以及具备高度智能化和自适应能力的方向发展,旨在打造一个全方位、高效且可持续改进的安全闭环系统。
6.4 其他研究方向
1) gadget函数片断扩充。在原有反序列化漏洞被开发者修复后,原漏洞对应的gadget链中可能存在能够被替代的gadget函数,攻击者会使用新的函数替代原调用链中的部分gadget函数,从而派生出新的调用链,导致漏洞的修复不够彻底,威胁应用程序安全。未来可以考虑利用已知的gadget函数片段来扩充检测框架的数据集,以发现这些潜在的调用链,从而提高检测的有效性和覆盖范围。
2) 新型反序列化漏洞研究。随着编程语言和框架的不断更新,新的反序列化漏洞可能会出现。因此,未来的研究可能会更加注重对新型反序列化漏洞的挖掘和发现,以揭示这些漏洞的成因和潜在危害。此外,编程语言中通常存在十分通用的框架来帮助开发者提高开发效率,例如Java语言的热门框架Spring、SpringBoot和C#语言的.NET框架的强大应用生态等,如果在这些框架中出现了反序列化漏洞,那么其导致的受到安全威胁的应用数量将十分庞大,因此框架本身的反序列化漏洞具有很高的研究价值。
3) 跨平台、跨语言的反序列化漏洞研究。目前,反序列化漏洞的研究主要集中在特定的编程语言和平台上。由于序列化与反序列化是实现多平台之间通信和对象持久化存储的重要手段,且现代应用程序经常需要在多个平台和环境之间进行数据交换,因此,对涉及跨平台、跨语言的反序列化漏洞进行深入研究,可以帮助发现和预防潜在的反序列化漏洞,应对不同应用场景下的安全挑战。
7 结束语
随着各大编程语言的框架与技术的不断更新迭代,反序列化漏洞的危害也逐渐放大,但开发人员和企业对于反序列化漏洞的认识还不够深刻,现有的检测方法还存在改进空间。本文从反序列化漏洞的原理、一般方法、现有工作的检测原理出发,对其研究现状进行归纳与总结,揭示了反序列化漏洞的危害巨大,并提出了对于未来该领域研究方向的见解。希望本文可以为反序列化漏洞领域的研究提供参考,推动反序列化漏洞的进一步深入研究。
1使用Java生成的序列化文件的内容
Fig.1The contents of a serialized file generated using Java
2反序列化person.ser文件的代码
Fig.2The code to deserialize the file person.ser
3反序列化代码的输出结果
Fig.3The output of the code to deserialize
4正常反序列化流程
Fig.4The normal deserialization process
5反序列化漏洞原理
Fig.5The principle of deserialization vulnerability
6XStream中的漏洞CVE-2021-21345
Fig.6The vulnerability CVE-2021-21345 of XStream
7反序列化漏洞检测通用框架图
Fig.7A general framework for deserialization vulnerability detection
8Tabby的整体工作流程
Fig.8Overall workflow of Tabby
9FUGIO的架构
Fig.9Architecture of FUGIO
10QUACK分析流程
Fig.10The analysis process of QUACK
1基于静态分析的反序列化漏洞检测研究工作
2基于模糊测试的反序列化漏洞检测研究工作
WICHERS D, WILLIAMS J. Owasp top-10 2017[J]. OWASP Foundation,2017,3:4.
Cyber Safety Review Board. Review of the December 2021 Log4j event[R]. USA: CSRB,2022.
MESSINA G.10 steps to avoid insecure deserialization[EB/OL].(2018-03-29)[2024-08-18].https://www.infosecinstitute.com/resources/application-security/10-steps-avoid-insecure-deserialization.
DAHSE J, KREIN N, HOLZ T. Code reuse attacks in PHP:automated POP chain generation[C]//Proceedings of 2014 ACM SIGSAC Conference on Computer and Communications Security. New York: ACM,2014:42-53.
HAKEN I. Automated discovery of deserialization gadget chains[C]//Proceedings of Black Hat USA.[S.l.:s.n.],2018:48.
CHEN X C, WANG B Z, JIN Z,et al. Tabby:automated gadget chain detection for Java deseriali-zation vulnerabilities[C]//Proceedings of the 53rd Annual IEEE/IFIP International Conference on Depen-dable Systems and Networks.[S.l.]: IEEE,2023:179-192.
SHCHERBAKOV M, BALLIU M. SerialDetector:principled and practical exploration of object injection vulnerabilities for the Web[C]//Proceedings of 2021 Network and Distributed Systems Security Symposium.[S.l.:s.n.],2021:1-18.
BUCCIOLI L, CRISTALLI S, VIGNATI E,et al. JChainz:automatic detection of deserialization vulnera-bilities for the Java language[C]//Proceedings of International Workshop on Security and Trust Man-agement.[S.l.]: Springer,2022:136-155.
武永兴, 陈力波, 姜开达. 基于混合分析的Java反序列化利用链挖掘方法[J]. 网络与信息安全学报,2022,8(2):160-174. WU Yongxing, CHEN Libo, JIANG Kaida. Java deserialization gadget chain discovery method based on hybrid analysis[J]. Chinese Journal of Network and Information Security,2022,8(2):160-174.(in Chinese)
KOUTROUMPOUCHOS N, LAVDANIS G, VERONI E,et al. ObjectMap:detecting insecure object deseriali-zation[C]//Proceedings of the 23rd Pan-Hellenic Conference on Informatics. New York: ACM,2019:67-72.
RASHEED S, DIETRICH J. A hybrid analysis to detect Java serialisation vulnerabilities[C]//Procee-dings of the 35th IEEE/ACM International Conference on Automated Software Engineering. New York: ACM,2020:1209-1213.
PARK S, KIM D, JANA S,et al. FUGIO:automatic exploit generation for PHP object injection vulne-rabilities[C]//Proceedings of the 31st USENIX Secu-rity Symposium.[S.l.:s.n.],2022:197-214.
CAO S C, SUN X B, WU X X,et al. Improving Java deserialization gadget chain mining via overriding-guided object generation[C]//Proceedings of 2023 IEEE/ACM the 45th International Conference on Software Engineering.[S.l.]: IEEE,2023:397-409.
CAO S C, HE B, SUN X B,et al. ODDFuzz:disco-vering Java deserialization vulnerabilities via structure-aware directed greybox fuzzing[C]//Proceedings of 2023 IEEE Symposium on Security and Privacy.[S.l.]: IEEE,2023:2726-2743.
CHEN B F, ZHANG L, HUANG X Y,et al. Effi-cient detection of Java deserialization gadget chains via bottom-up gadget search and dataflow-aided payload construction[C]//Proceedings of 2024 IEEE Symposium on Security and Privacy.[S.l.]: IEEE,2024:150.
DAVID Y, CHRISTOU N, KELLAS A D,et al. QUACK:hindering deserialization attacks via static duck typing[C]//Proceedings of 2024 Network and Distributed System Security Symposium.[S.l.:s.n.],2024:240115.
CRISTALLI S, VIGNATI E, BRUSCHI D,et al. Trusted execution path for protecting Java applications against deserialization of untrusted data[C]//Procee-dings of the 21st International Symposium on Research in Attacks, Intrusions,and Defenses.[S.l.]: Springer,2018:445-464.
ESSER S. Shocking news in PHP exploitation[EB/OL].(2017-11-29)[2024-05-23].https://informatik.rub.de/wp-content/uploads/2021/11/hackpra09_fu_esser_php_exploits1.pdf.
ESSER S. Utilizing code reuse/rop in php application exploits[EB/OL].(2010-07-02)[2024-05-23].http://media.blackhat.com/bh-us-10/presentations/Esser/BlackHat-USA-2010-Esser-Utilizing-Code-Reuse-Or-Return-Oriented-Programming-In-PHP-Application-Exploits-slides.pdf.
GABRIEL L. Marshalling pickles[EB/OL].(2009-11-02)[2024-05-23].https://frohoff.github.io/appseccali-marshalling-pickles.
Ysoserial[EB/OL].(2017-11-29)[2024-05-23].https://github.com/frohoff/ysoserial.
BREENMACHINE. What do WebLogic, WebSphere, JBoss, Jenkins, OpenNMS,and your application have in common?This vulnerability[EB/OL].(2015-11-06)[2024-05-23].https://b.y41.cn/YqZ.
CVE-2016-5385[EB/OL].(2016-07-19)[2024-05-23].https://www.cve.org/CVERecord?id=CVE-2016-5385.
MUÑOZ A, MIROSH O. Friday the 13th JSON attacks[C]//Proceedings of Black Hat USA.[S.l.:s.n.],2017.
CVE-2017-10271[EB/OL].(2017-10-19)[2024-05-23].https://www.cve.org/CVERecord?id=CVE-2017-10271.
KOJENOV A. Deserialization what how and why not[EB/OL].(2018-10-12)[2024-05-23].https://appsecus2018.sched.com/event/F04J/deserialization-what-how-and-why-not.
CVE-2021-44228[EB/OL].(2021-12-10)[2024-05-23].https://www.cve.org/CVERecord?id=CVE-2021-44228.
JAMIESON B. Deserialization,what could go wrong?[EB/OL].(2016-10-12)[2024-05-23].https://insom-niasec.com/downloads/publications/Deserialization%20%20%20What%20Could%20Go%20Wrong.pdf.
LOUSQUI D. Explaining and exploiting deseriali-zation vulnerability with python[EB/OL].(2017-09-23)[2024-05-23].https://dan.lousqui.fr/explaining-and-exploiting-deserialization-vulnerability-with-python-en.html.
FORSHAW J. Are you my type?Breaking. NET through serialization[EB/OL].(2012-10-01)[2024-05-23].https://media.blackhat.com/bh-us-12/Briefings/Forshaw/BH_US_12_Forshaw_Are_You_My_Type_WP.pdf.
BRODERICK L. Deserialization risks in use of Binary For-matter and related types[EB/OL].(2024-08-08)[2024-05-23].https://learn.microsoft.com/en-us/dotnet/standard/serialization/binaryformatter-security-guide.
LEKIES S, KOTOWICZ K, GROß S,et al. Code-reuse attacks for the Web:breaking cross-site scripting mitigations via script gadgets[C]//Proceedings of 2017 ACM SIGSAC Conference on Computer and Communications Security. New York: ACM,2017:1709-1723.
PELES O, HAY R. One class to rule them all:0-day deserialization vulnerabilities in android[C]//Procee-dings of the 9th USENIX workshop on Offensive Technologies.[S.l.:s.n.],2015:1-12.
Marshalsec[EB/OL].(2021-12-11)[2024-05-23].https://github.com/mbechler/marshalsec.
Java Deserialization Scanner[EB/OL].(2021-12-07)[2024-05-23].https://github.com/federicodotta/Java-Deserialization-Scanner.
CVE-2021-21345[EB/OL].(2021-03-22)[2024-05-23].https://www.cve.org/CVERecord?id=CVE-2021-21345.
WONG E Y C, CHAN A T S, LEONG H V. Xstream:a middleware for streaming XML contents over wireless environments[J]. IEEE Transactions on Software Engineering,2004,30(12):918-935.
MANÈS V J M, HAN H S, HAN C,et al. The art,science,and engineering of fuzzing:a survey[J]. IEEE Transactions on Software Engineering,2019,47(11):2312-2331.
MILLER B P, FREDRIKSEN L, SO B. An empirical study of the reliability of UNIX utilities[J]. Communications of the ACM,1990,33(12):32-44.
SMANS J, JACOBS B, PIESSENS F. Static verifi-cation of code access security policy compliance of. NET applications[J]. Journal of Object Technology,2006,5(3):35-58.
Json. NET[EB/OL].(2012-01-01)[2024-05-23].https://www.newtonsoft.com/json/help/html/introduction.htm.
DAHSE J, HOLZ T. Simulation of built-in PHP features for precise static code analysis[C]//Procee-dings of 2014 Network and Distributed System Secu-rity Symposium.[S.l.:s.n.],2014:23-26.
BRUNETON E, LENGLET R, COUPAYE T. ASM:a code manipulation tool to implement adap-table systems[J]. Adaptable and Extensible Compo-nent Systems,2002,30(19):1-12.
Dnlib[EB/OL].(2021-06-23)[2024-05-23].https://github.com/0xd4d/dnlib.
LAM P, BODDEN E, LHOTÁK O,et al. The soot framework for Java program analysis:a retrospective[C]//Proceedings of 2011 Cetus Users and Compiler Infastructure Workshop.[S.l.:s.n.],2011:1-8.
MILLER J J. Graph database applications and concepts with Neo4j[C]//Proceedings of 2013 Southern Associ-ation for Information Systems Conference.[S.l.:s.n.],2013:141-147.
SUI L, DIETRICH J, EMERY M,et al. On the soundness of call graph construction in the presence of dynamic language features:a benchmark and tool evaluation[C]//Proceedings of Programming Lan-guages and Systems:the 16th Asian Symposium.[S.l.]: Springer,2018:69-88.
LI Y, TAN T, XUE J L. Understanding and ana-lyzing Java reflection[J]. ACM Transactions on Software Engineering and Methodology,2019,28(2):1-50.
FOOTE B, JOHNSON R E. Reflective facilities in Smalltalk-80[J]. ACM Sigplan Notices,1989,24(10):327-335.
SMITH B C. Reflection and semantics in LISP[C]//Proceedings of the 11th ACM SIGACT-SIGPLAN Symposium on Principles of Programming Languages.[S.l.:s.n.],1984:23-35.
FOURTOUNIS G, KASTRINIS G, SMARAGDAKIS Y. Static analysis of Java dynamic proxies[C]//Proceedings of the 27th ACM SIGSOFT International Symposium on Software Testing and Analysis. New York: ACM,2018:209-220.
Acunetix. Less time on web application and API security,more time on innovation[EB/OL].(1997-08-01)[2024-05-23].https://www.acunetix.com.
MAHAJAN A. Burp suite essentials[M]. Birmingha: Packt Publishing Ltd,2014.
CAMPBELL G A, PAPAPETROU P P. SonarQube in action[M]. New York: Manning Publications Co.,2013.
DEAN J, GROVE D, CHAMBERS C. Optimization of object-oriented programs using static class hierarchy analysis[C]//Proceedings of 1995 European Con-ference on Object-Oriented Programming.[S.l.]: Springer,1995:77-101.
PADHYE R, LEMIEUX C, SEN K. JQF:coverage-guided property-based testing in Java[C]//Proceedings of the 28th ACM SIGSOFT International Symposium on Software Testing and Analysis. New York: ACM,2019:398-401.
PACHECO C, ERNST M D. Randoop:feedback-directed random testing for Java[C]//Proceedings of Com-panion to the 22nd ACM SIGPLAN Conference on Object-Oriented Programming Systems and Appli-cations Companion. New York: ACM,2007:815-816.
SRIVASTAVA P, TOFFALINI F, VOROBYOV K,et al. Crystallizer:a hybrid path analysis framework to aid in uncovering deserialization vulnerabilities[C]//Proceedings of the 31st ACM Joint European Software Engineering Conference and Symposium on the Found-ations of Software Engineering. New York: ACM,2023:1586-1597.
SCARSELLI F, GORI M, TSOI A C,et al. The graph neural network model[J]. IEEE Transactions on Neural Networks,2008,20(1):61-80.
GOODFELLOW I, POUGET-ABADIE J, MIRZA M,et al. Generative adversarial nets[C]//Proceedings of the 27th International Conference on Neural Infor-mation Processing Systems. Cambridge: MIT Press,2014:2672-2680.
VAHDAT A, KAUTZ J. NVAE:a deep hierarchical variational autoencoder[C]//Proceedings of the 34th Conference on Neural Information Processing Systems.[S.l.:s.n.],2020:19667-19679.
CLARKE E M, HENZINGER T A, VEITH H,et al. Handbook of model checking[M]. Berlin: Springer,2018.
ČISAR P,ČISAR S M. The framework of runtime application self-protection technology[C]//Procee-dings of 2016 IEEE the 17th International Symposium on Computational Intelligence and Informatics.[S.l.]: IEEE,2016:000081-000086.