深入浅出Joern(一)Joern与CPG是什么?
从人们开始探索代码扫描这件事情开始,市面上就在不断地诞生着各种各样的工具,经过了几年的演变以及发展,对于白盒代码扫描这件事情来说,大家的观念也在逐渐趋同。
无论是基于IR(Intermediate Representation)、AST(abstract syntax trees)、CFG(control flow graphs)、PFG(program dependence graphs),又或者是其他的什么中间态。白盒代码扫描工具都在这个基础上做模拟执行、污点传播等等方案来分析挖掘漏洞。
而随着CodeQL的概念逐渐被大家接受之后,现在的代码扫描工具越来越趋近于将底层和上层拆解开来,由底层的引擎将代码统一化处理,然后使用者在上层通过编写规则或者语句就可以。主流的CodeQL、Checkmarx其实都使用了类似的方案。今天要说的Joern也是如此。
今天介绍的Joern有什么特殊的呢?
首先CodeQL本身不开源只能使用,偏偏微软还做了商业化限制,以微软喜欢秋后算账的风格来讲,实在无法确定深入研究CodeQL是否值得。
除此之外,市面上的很多白盒扫描工具其实是非静态的,扫描的时候不但需要配置复杂的运行环境,而且本身可能依赖编译过程,无论是自己使用还是商业化这都非常不实用。
个人认为白盒工具有着几个很重要的点
- 静态扫描,静态扫描的优势和便利程度才是白盒比较优势的一环,毕竟白盒不是灰盒,如果对编译环境和运行环境有依赖那为什么不使用更准确的灰盒
- 扫描速度,虽然这点是很多商业化白盒软件的通病,但无论在哪家公司的DevSecOps中,最终目标肯定是把安全检测加载上线前,那么无论是1分钟、3分钟还是5分钟,扫描速度会是第一优先级,比如CheckMarx动辄几小时的扫描肯定是不现实的
- 可diy性,当然对于大部分人来说这点其实并不是很重要,但能对引擎进行深入改造会是优化开发非常重要的一点,joern是开源的,在这方面他有很大的优势
- 可拓展性,市面上大部分的白盒扫描工具动辄支持几十种语言,比如说snoarqube这种,但实际上大部分拓展语言只支持非常简单的正则拓展,我一直觉得现代白盒软件很重要的一条路就是走通用性,这也是比较有名的一些白盒工具都选择的路,在白盒扫描过程中会刻意将统一结构拆分出去再做分析扫描。
今天介绍的joern的其实就是这类工具的一员,他最大的特点其实就是开源。