Java开源静态代码分析框架及工具介绍

举报
maijun 发表于 2023/06/17 10:46:50 2023/06/17
【摘要】 列出了部分面向Java语言的静态代码分析工具或者框架,主要指向如何自己实现Java静态代码分析框架的参考,不是直接拿来用的介绍。

本文列出部分Java开源的静态代码分析及验证工具,会不断完善(主要目的是为了 ① 自研静态代码分析框架,或者 ② 提升检查检查能力或者精度,或者 ③ 在企业内直接选择开源工具集成或者优化使用而收集的,部分小众,或者没有太大参考价值的,就不收集了)。

框架名称 开源协议 成熟度 类型 基础框架 基本算法 基本情况介绍
Soot LGPL-2.1 框架

是当前业界在 Java 程序分析领域使用最广泛的一种静态代码分析框架,而且生态非常好,社区非常活跃,当前很多有名的静态代码检查工具都是基于Soot开发的。是学习Java静态代码分析的不二之选,但是因为各种分析实现都是基于step实现,一定要嵌在执行流程中,这一点不是太友好。推荐指数:5颗星(业界最广泛的静态程序分析框架)
SootUp LGPL-2.1 框架

是用来替代Soot的静态程序分析框架,Soot的维护者们已经识别到Soot的局限性,因此开发了SootUp作为Soot的替代品,SootUp使用起来更加的轻量,支持的JDK版本更高,使用更加方便。只是有一点儿,就是推出的时间比较短,还需要进行打磨。推荐指数:5颗星(虽然时间短,但是是站在巨人的肩膀上起来的)
Wala EPL-2.0 框架

Wala是IBM 2006年开源的一个镜头代码分析框架,涉及到的静态代码分析相关的方方面面的内容,在Wala里面都有实现,而且作为一个第三方库使用时,我个人觉得是比Soot更方便的,因此一度我在执行相关的一些验证时,都是使用的Wala。Wala最大的劣势是相关文档比较少,生态比不上Soot。推荐指数:5颗星(使用方便,静态分析基础框架完整)
Tai-e

LGPL-3.0

GPL-3.0

框架

是南京大学李樾、谭添两位老师打造的一个面向Java静态代码分析工具,根据介绍,吸收了Soot、Wala、Doop 等工具的优点打造出来的,但是我一直没有时间来使用一把。推荐指数:5颗星(必须无脑推)
jacodb

Apache-2.0


框架

JacoDB通过ASM读取class文件的内容,将Java字节码中涉及到类、类层次结构、方法、字段等信息都存储到数据库(SQLite)中,从而对代码结构进行持久化处理,支持在其他的程序分析任务执行时直接加载。思路很不错,有点儿类似于Coverity的实现(Coverity 就是在编译捕获的时候将AST解析出来放到SQLite数据库里面的)。
Doop MIT 工具

基于Datalog实现的一款可以应用于Java的指针分析和污点分析的框架。虽然Datalog很早以前,就在《编译原理》相关的书籍上面有介绍(比如龙书),但是当前产业界基于Datalog的工具比较少,CodeQL(准确地说,LGTM)是基于Datalog的,但是引擎代码没有开源,因此该框架对于我们研究Datalog实现的程序分析有非常重要的参考价值。推荐指数:5颗星(开源的Datalog程序分析框架)
Spoon

CeCILL-C

MIT

工具

自己设计了一套Java源码的AST实现,并提供了遍历和分析的接口。不过我看它的源码,并不是很成熟,没办法和老牌的Java静态代码分析框架相比。推荐指数:3颗星(如果真的做程序分析,可以把这个工具排最后)
JavaParser

LGPL 3.0

Apache2.0

框架

Java Parser 是当前应用的最火的 Java 源码解析框架,协议非常友好,可以应用到商用工具上面,因此使用率非常高。支持 Java 语言生成 AST,在 AST 基础上进行类型推断分析和符号分析,支持修改 AST 从而生成新的 Java 文件内容,对最新的Java版本也支持良好,在 Java 的解析框架上,我最喜欢的就是这个。推荐指数:5颗星(API非常非常友好)
Eclipse JDT EPL-2.0 框架

是 Eclipse IDE 的 Java 的解析组件,对 Java 的支持度非常高,也非常及时,是跟随 Java 发布最紧密的组件之一。可直接用于开发基于AST的Java的规则,也可以作为其他工具解析Java代码的框架。我们已知的业界顶级的静态代码分析工具Coverity和Fortify,都是基于Eclipse JDT实现Java源码的解析的。推荐指数:4颗星(虽然东西不错,我喜欢JavaParser多一点点)
heros LGPL-2.1 框架 Soot IDE/IFDS 实现了一套面向Java语言的IDE/IFDS静态代码分析实现,支持多线程分析。虽然该框架实现时,和下面的IR进行了解耦,但是目前来看,heros也只在Soot上面使用成功。推荐指数:4颗星(可以基于该框架,熟悉IDE/IFDS实现,但是如果要基于IFDS算法构建自己的程序分析引擎,建议参考实现)
SPDS EPL-2.0 框架 Soot SPDS/WPDS 高效精确的别名分析和数据流分析框架。前面两个缩略词分别是 Synchronized Pushdown System 和 Weighted Pushdown System。是基于 PDS 的程序分析的实现,我搜相关的论文还是比较多的,但是相关的实现,并不多,而且有可能并没有相关的实现工具,该框架算是填补了这部分的空白,对我们学习程序分析有非常好的参考价值。推荐指数:5颗星(基于PDS的程序分析实现)
FlowDroid LGPL-2.1 工具 Soot IFDS 一款基于IFDS实现的面向Java语言的污点分析引擎,是当前已有的开源Java污点分析引擎中比较成熟的一款。我一直觉得,对于SAST工具:一分靠技术,九分靠运营,对FlowDroid结合公司内部实际情况,进行优化改造,不失是一款优秀的检查工具。推荐指数:5颗星(很多公司Java污点分析引擎都有FlowDroid的影子)
TaintAnalysis
工具 Soot/Heros IFDS 该工具,在 soot-oss 用户下,基于 Heros 做前向的污点分析,基于 Boomerang 做别名分析。和 FlowDroid 不同的是 FlowDroid 的别名分析采用后向的 IFDS 算法。该工具综合了 Soot、Heros、Boomerang 三个框架,可以学习 IFDS、SPDS 等相关的技术,对我们有非常好的参考价值,即使它开发的时间并不长。推荐指数:5颗星(综合了多种技术优势)
AppShark Apache-2.0 工具 Soot
字节跳动无恒实验室打造的一款面向Android程序的检查工具,基于Soot开发,工具自己实现了一个指针分析,数据流分析实现也比较规整,对于希望学习静态代码分析技术的同学来说,是个不错的工具。在字节内部,应该也是打磨过很长一段时间了,所以也可以直接使用该工具完成一些漏洞挖掘的事情。
QiLinPTA LGPL-2.1

Soot
一个Java指针分析框架,由薛老师(Jingling Xue's Home Page (unsw.edu.au))团队打造。
JBSE GPL-3.0


符号执行 一个面向Java语言的程序分析、验证、测试生成的框架,看着应该属于研究性质的项目,现在应该还在持续开发。
JayHorn

MIT

LGPL-2.1



Soot

模型检测?

符号执行

JayHorn是一个Java的模型检查工具,该工具以 Soot 的 Jimple IR 作为输入,生成 Horn clause,然后使用 Z3 求解器进行运算。
JBMC

BSD






PathFinder

Apache-2.0




符号执行

支持在Java bytecode上面做符号执行,支持不同的基本类型(包括int,long,double,boolean等),同时也支持字符串、数组和用户定义的类数据结构等。
JDart

Apache-2.0



PathFinder



java-ranger

Apache-2.0



PathFinder



coastal

Apache-2.0




Fuzzing?


PMD BSD 工具
AST 一款基于AST的静态代码分析框架。推荐指数:4颗星(可以基于该工具,继续补齐基于程序结构的检查能力)
SpotBugs LGPL-2.1 工具

基于ASM读取Java字节码,能有简单的数据流分析能力,但是扩展并不方便,但是已有很多规则,可以开箱即用。推荐指数:4颗星(规则开箱即用)
CheckStyle

LGPL-2.1

Apache-2.0

工具

提供了开箱即用的风格类检查规则,但是并不方便扩展,对于自研实现没有太大的参考价值。推荐指数:3颗星(规则开箱即用)


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。