Paper-02-QUASOQ
提出了对java反序列化挖掘工具Gadget Inspector的改进方法:
Gadget Inspector会产生假阴性,因为它使用广度优先搜索算法(BFS)来遍历调用图。该BFS没有考虑多个Gadget链可能共享节点,这导致仅搜索通过同一节点的多个Gadget链中的一个。因此,我们使用深度优先搜索算法,多次遍历单个节点,以避免这个问题。
使用BFS列出所有路径
BFS会逐层扩展搜索,确保在找到所有路径时,路径长度是递增的。
- Source -> B -> E -> Sink
- Source -> C -> F -> Sink
使用DFS列出所有路径
DFS会尽可能深地搜索每一条路径,直到到达汇节点或无法继续前进为止。
- Source -> B -> A -> D -> E -> Sink
- Source -> B -> E -> Sink
- Source -> C -> F -> E -> Sink
- Source -> C -> F -> Sink
gadget链可以抽象为source->gadget core->sink。子链gadget core->sink称为core chain。子链source->gadget core称为边链。在一个目标程序中,gadget core总是稀疏的,core chain总是唯一的。因此,我们简化了小工具链的发现,发现的子链的边缘链。可以将gadget链的搜索简化为边链(HashSet.readObject()->LazyMap.get()),节省了大量的成本。
为了消除静态分析中的误报,本文提出了一种匹配的动态验证机制,提出了一种基于Java序列化协议和反射机制的匹配动态验证机制。这种动态验证可以动态地生成与每个gadget链相对应的对象。这种方法称为GCGM(Gadget Core Growth Method),它基于gadget链整理类列表,并根据gadget core自底向上生成对象。GCGM的实现依赖于Java反射机制,该机制可以基于类名获取所有方法和属性。GCGM动态生成的对象将被序列化,并注入恶意行为以生成字节流,该字节流可由实体化门户验证readObject()。GCGM将根据静态分析结果为每个边链生成一个对象,其工作原理如下:
1.根据gadget链获取手动构造的gadget核心对象作为当前对象,该gadget链不包含恶意行为。
2.获取gadget链中当前对象之上的节点的类名,作为clazz。
3.使用反射获取clazz的构造函数。
4.以当前对象作为参数调用clazz的构造函数来构造一个新对象。
5.将新对象设置为当前对象。
6.重复步骤2-5。
伪代码如下所示:
本文设计了一种基于序列化协议的验证方法。这项工作是基于序列化字节流的高度结构化性质。下图显示了两个序列化字节流的比较。图像的左侧显示了与gadget链相对应的字节流,右侧显示了与相应的边缘链相对应的字节流。不同之处在于与core chain相对应的字节流。这允许我们修改字节流,将不完整的边链添加到gadget链中。它具有以下几个步骤:
1.得到静态分析结果,对每条边链进行预处理.
2.将边链作为参数传递到GCGM中,以生成相应的边对象。
3.通过将核心链作为参数传递来生成探测对象。此探测对象包含一个非法的命令,不能被exec.exec()执行。
4.将边缘对象和探针对象序列化为字节流。
5.通过修改字节流,将探针对象的非法命令注入边缘对象的字节流中。
6.获取的字节流被格式化,非法命令将被触发,检测器将捕获特定的异常。
实验结果:
验证Apache Commons Collections 3.1 • Commons Beanutils 1.92 • Apache Commons Collections4 4.0 • Jython Standalone 2.5.2.
Rev Gadget: A Java Deserialization Gadget Chains Discover Tool Based on Reverse Semantics and Taint Analysis
文章先介绍了当今静态分析常用框架和软件,在相关研究中,Shawn Rasheed等人提出了一种结合静态分析和模糊测试的混合方法,通过堆抽象来指导Java库中序列化漏洞的模糊测试,从而快速有效地检测漏洞。Sicong Cao等人则提出了一种新的gadget链发现方法GCMiner,能够捕获显式和隐式方法调用,以识别更多的gadget链,并采用覆盖导向的对象生成方法来生成有效的注入对象。此外,ODDFUZZ是一种新颖的混合解决方案,首先通过轻量级静态污点分析识别可能导致反序列化漏洞的候选gadget链,然后通过有向灰盒模糊测试探索这些候选链并生成有效的测试用例。在静态分析方面,Soot框架被广泛应用于Java字节码的分析,生成控制流图和程序依赖图,以便于后续的漏洞分析。Neo4j作为图数据库,能够方便地存储和查询图数据,进一步支持对软件漏洞的挖掘。
这篇文章主要解决了Java反序列化漏洞的自动化发现问题,提出了一种新的工具Rev Gadget,用于识别和分析Java程序中的gadget链,从而帮助开发者和安全专家更有效地检测和防范反序列化漏洞。
传统的gadget chain的发现方法从入口方法开始,寻找可能触发危险方法的路径。本文定义了一个反向语义,从危险方法开始,反向搜索调用路径,通过污点分析,验证调用链的数据是否可以传递。
1.定义方法谓词语义,分析程序获取入口方法和危险方法。
反序列化链中的进入方法和危险方法具有一定的普遍性。例如,入口方法是可序列化的方法,而危险方法是可以执行命令的方法。通过收集和分析现有的小工具链,总结出一个列表的进出方法和危险的方法。
一个程序是否有可利用的gadget链,首先需要判断它是否有入口方法或危险方法。如果不存在,则无需进行后续分析。CodeQL是一个静态分析工具,它提供了一个谓词定义函数,可以用来过滤程序中的方法,以获得目标方法。本节分析了入口方法和危险方法的特征,定义了方法谓词语义,以判断程序中是否存在入口方法和危险方法
2.定义反向语义并分析程序以获得潜在的小工具链。
反向语义是指方法的反向调用语义。小工具链由一系列顺序的方法调用组成,例如A→B→C,即A调用B,B调用C。反向语义是调用序列的反向过程。例如,我们定义C的反向语义,以引用最终可以通过0个或多个中间方法(即所示小工具链中的A和B方法)调用到C的方法。
利用CodeQL强大的静态分析功能,实现了逆向语义的定义。图3是反向语义分析的总体过程。具体来说,首先定义直接调用危险方法的方法节点A,然后定义调用方法节点A的方法节点B,以此类推,递归定义后续的方法节点。最后,可以得到所有直接或间接调用危险方法节点的节点,如图3的反向语义部分所示,其中红色节点是危险方法节点,蓝色节点是直接或间接调用危险方法的节点,绿色节点是找到的入口方法节点。
3.使用污点分析来分析小工具链的入口参数是否可控。
污染分析用于确定受污染的数据是否可以从受污染的源传输到目标源。在上一步中,我们得到了gadget chains图。污点源是小工具链中类的成员变量,目标源是危险方法的参数。使用污点分析,您可以确定小工具链是否可用,并进一步过滤结果,从而提高检测的准确性。
定义污点分析规则后,对反向语义挖掘出的Gadget链进行污点分析。首先,对反向语义发现得到的Gadget链信息进行污点分析,得到Gadget链中所有类的成员变量。然后使用污点分析依次对污点源数据执行污点数据,以确定污点数据是否可以被传输到目标源。如果没有,继续分析下一个污点源。当所有的污点源都不能被传递到目标源时,这表明小工具链不可用。
实验结果:
在Apache-commons-collection 4.0上
LLM-Assisted Static Analysis for Detecting Security Vulnerabilities
本文综述了IRIS方法在安全漏洞检测中的应用,IRIS是一种神经符号方法,旨在将大型语言模型(LLMs)与静态分析相结合,以提高软件安全漏洞的检测能力。传统的程序分析工具在实际应用中效果有限,主要是因为它们依赖于人工标注的规范,而IRIS通过利用LLMs推断污点规范和进行上下文分析,减少了对人工规范和检查的需求。
文章列举了当今静态分析存在的一系列问题,并附带参考文献。
在评估方面,研究团队构建了一个新的数据集CWE-Bench-Java,该数据集包含120个经过人工验证的真实Java项目中的安全漏洞。与现有的静态分析工具CodeQL相比,IRIS在检测漏洞方面表现更为出色,使用GPT-4能够识别55个漏洞,比CodeQL多出28个,并且在平均误报率上也有5个百分点的改善。此外,IRIS还发现了6个现有工具无法检测到的未知漏洞。
IRIS将检测到的代码路径和周围的上下文编码到一个简单的提示中,并使用LLM将其分类为真或假阳性。
在高级别上,IRIS将Java项目P、要检测的漏洞类C和大型语言模型LLM作为输入。IRIS静态地分析项目P,检查特定于C的漏洞,并返回一组潜在的安全警报A。每个警报伴随有从污染源到易受C攻击的污染接收器的唯一代码路径(即,该路径是未净化的)。
在评估方面,研究团队构建了一个新的数据集CWE-Bench-Java,该数据集包含120个经过人工验证的真实Java项目中的安全漏洞。与现有的静态分析工具CodeQL相比,IRIS在检测漏洞方面表现更为出色,使用GPT-4能够识别55个漏洞,比CodeQL多出28个,并且在平均误报率上也有5个百分点的改善。此外,IRIS还发现了6个现有工具无法检测到的未知漏洞。
IRIS有四个主要阶段:
首先,IRIS构建给定的Java项目,并使用静态分析来提取所有候选API,包括调用的外部API和内部函数参数。
其次,IRIS查询LLM,将这些API标记为特定于给定漏洞类C的源或接收器。
第三,IRIS将标记的源和接收器转换为可以馈送到静态分析引擎(例如CodeQL)的规范,并运行漏洞类特定的污点分析查询以检测项目中该类的漏洞。此步骤在项目中生成一组易受攻击的代码路径(或警报)。
最后,IRIS通过自动过滤误报对生成的警报进行分类,并将其呈现给开发人员。
本文的创新点主要体现在以下几个方面:
- 神经符号方法的引入: IRIS采用了一种神经符号的方法,将大型语言模型(LLMs)与静态分析相结合。这种方法不仅利用了LLMs在代码生成和理解方面的强大能力,还通过静态分析进行全仓库的推理,从而提高了安全漏洞检测的准确性和效率。
- 污点规范的推断: 传统的静态分析工具如CodeQL依赖于人工标注的规范,这导致了规范的缺失和误报的增加。IRIS通过LLMs自动推断污点源和污点汇的规范,减少了对人工干预的需求。这种动态推断机制使得IRIS能够适应不同项目的特定需求,提高了检测的灵活性。
- 上下文分析技术: IRIS引入了一种上下文分析技术,通过将代码上下文和路径敏感信息编码到提示中,增强了LLMs的推理能力。这种方法能够更准确地识别潜在的安全漏洞,降低了误报率,减轻了开发人员的工作负担。
- CWE-Bench-Java数据集的构建: 为了评估IRIS的性能,研究团队构建了一个新的数据集CWE-Bench-Java,包含120个经过人工验证的安全漏洞。这一数据集不仅为IRIS的评估提供了基础,也为后续研究提供了宝贵的资源。
A Hybrid Analysis to Detect Java Serialisation Vulnerabilities
本文提出了一种将静态分析与模糊化相结合的混合方法来检测序列化漏洞(serialisation vulnerability).方法的新奇在于它使用堆抽象来指导Java库中的漏洞模糊化。这将指导Fuzzing快速有效地生成结果,并自动验证静态分析报告。
第一步是运行静态分析以检测连接具有动态接收器的异构化调用站点的调用图链。我们还寻找数据流从封装对象的动态汇通过堆访问路径。
在第二步中,我们使用静态分析的结果和动态技术FUZZING,以构建实际的输入对象。通过构造,这些对象的具体化触发了动态接收器的调用,其中用户输入是从流中读取的,这可以被认为是被污染的。
Tabby: Automated Gadget Chain Detection for Java Deserialization Vulnerabilities
这篇文章介绍了一个名为Tabby的新框架,它用于自动化检测Java反序列化漏洞中的“gadget链”,创新点:
基于图的数据结构(Code Property Graph, CPG):
- Tabby利用代码属性图(CPG)来存储程序的语义信息,这使得静态分析的结果可以被重复利用,并且支持后续的查询和分析。它将多种程序表示(如抽象语法树AST、控制流图CFG、数据流图DFG等)整合到一个统一的超级图中.
结合Soot框架和Neo4j图数据库:
- Tabby结合了Soot框架进行静态分析和Neo4j图数据库来存储由Tabby生成的完整语义信息,这提高了查询性能并使得分析更加高效。
控制流分析技术:
- 文章提出了一种新的静态分析技术,通过控制流分析来自动识别可能导致Java反序列化漏洞的gadget链。采用深度优先算法
Automated Discovery of Deserialization Gadget Chains
主要介绍了gadget inspector工具的创造
0 条评论