DeSerSniffer 工具 是 FuzzChains Project 中的静态分析部分,可用Java中的反序列化漏洞检测。与以往的程序分析工具不同,DeSerSniffer (1.0 - 1.6 )直接从各类的ReadObject函数开始污点分析的流非敏感分析,并考虑到子类泛化分析,尽可能在 MaxNumberMaybeTaintedField 范围内,动态产生新的调用图和污点传播信息,当污点Value为Sink函数参数时,DeSerSniffer 认为当前参数对象中存在反序列化漏洞,且使用者可以在neo4j数据中查找可达的最短路径(可手动添加需要排除的路径),并生成 graphviz 图。
在2.0版本中,DeSerSniffer 改为 基于污点分析和流敏感的自底向上摘要算法,实现有效时间内的组件反序列化利用链检测(ysoserial 中单一组件测试时间平均为300s),在检测精度上与(1.0 - 1.6) 基本保持一致(有一些小bug)。
在私有的dev版本中,DeSerSniffer可以根据调用图,生成当前调用路径的属性树图。FuzzChains 可以根据属性树图构造合适的种子结构,并根据 DeSerSniffer 提供的 调用图信息,分析 Fuzzing过程中的调用图覆盖率信息,优先选择 调用图覆盖率高的种子。
联系方式: [email protected]
依赖信息:
sudo apt install graphviz
推荐使用容器部署的方式,
在 Soundness 版本中,会根据soot生成的facts尽可能分析当前分析对象的所有依赖组件和JDK运行环境信息。
优点: 在MaxNumberMaybeTaintedField参数限制下,会尽可能产生所有的调用边信息。
缺点: 时间慢、内存容易爆炸。
在 Unsoundness 版本中,并会根据soot生成的facts尽可能分析当前分析对象的所有依赖组件和JDK运行环境信息,分析的范围为分析对象和JDK运行环境中有用的组件(数据结构类型为主,如HashMap)。
优点: 分析快,占用资源少
缺点: 容易产生漏报。
MaxNumberMaybeTaintedField 直接影响了分析范围,由于Doop基于Soufflé实现的不动点计算,导致如果不设置 MaxNumberMaybeTaintedField 进行限制分析次数,会导致需要很长时间才能等待到 Soufflé 完成所有的关系计算。
Referencs:
Referencs:
Referencs:
- 论文
- github 链接
- 属性树算法设计与开发
1.0.0-dev 分支中有类似的算法实现,可以与 FuzzChains 联动,但对应的属性树只是个Demo,并不完善。
-
优化
- 在优化上,DeSerSniffer 的工作还有很多,但主要问题集中在算法会在更新调用图后,会重新计算新的指针分析和污点分析,内存开销很大,同时也导致大量的误报
-
适用于上下文敏感的分析算法 (放弃,需要修改整体框架)
- 当前 release 分支中的 DeSerSniffer 仅支持 Doop 中的 context-insensitive 分析方法
- 2.0 中采用的是函数摘要的算法
- 适用于2.0的对象结构图生成算法(初步,本地dev中)