本帖最后由 wsq 于 2024-6-11 23:42 编辑
基于代码审计的原理去思考,正则匹配阶段,ast阶段,ir,cfg图阶段,ql查询语言阶段。
联动这四个方向相互的优势去结合做适配好自动化代码审计,去进行处理好soure,sink,调用栈关系。 source,sink分析:这里的source和sink其实思路笔者采用的是利用第一阶段的正则匹配的思路去做,为什么不用其他阶段去做的原因,因为笔者追求的是非漏报,而后在联动调用栈分析达到完整的代码分析,而不是追求不误报。
基于这种状况去做的话,正则匹配应该是最优解。 2个方面: 1、代码开发简单。 2、不会出现ql,ir,cfg这种的依赖缺失构造不全的情况。 如如果是闭源代码的情况下,后面的几种就会出现很多坑点。
调用python去进行正则匹配分析,自动化提取出相关的参数入口点,以及参数变量,危险函数,即可。
source:如直接匹配常见的getParameter函数以及其他的参数函数即可匹配到常见是source函数
以及提取出里面的参数变量值
sink:同理也调用匹配常见的危险函数即可。 调用栈分析:原理思路1:参考了很多项目以及原理。 目前大多数还是以asm,soot,bcel的思路去做的类,函数,一层调用关系提取分析。 然后结合指针分析,或者jvm栈帧去追踪污点流,最后利用结合一些算法去产生一个完整的调用栈。 像gadgetinspector: 就是利用分析了相关的类,函数,调用关系等,然后利用jvm栈帧确定污点流,最后结合算法产生完整调用栈,输出一个完整的结果。
但是经过笔者实测这种方式的污点流追踪对于没有返回值赋值的会导致追踪不到,导致漏报。
基于上面分析的思路我们去可以进行仿写一个类似的工具,结合每个语言的开源解析代码去提取分析出相关的函数,类,调用关系,而后进行数据处理,获取到完整的调用栈。
优势:可批量挖掘,且工具可以自己DIY,如优化算法,优化source,sink限定。
缺点:开发难度会更高,需要关注污点的问题。 如net:net可以结合dnlib去解析dll代码提取出里面的方法,类,调用关系。 而后转深度算法去进行遍历,最后获取到一个完整的调用栈。
java同理:调用开源的java-callgraph获取到精准的类分析,方法分析,caller分析,而后在结合深度算法获取到一条完整的调用关系。
原理思路2:这种是笔者查看了一个开发的开源项目后,产生的一种思考。 一种多语言通解思路,开发插件,调用引擎的调用关系分析+深度算法 实现获取大量的调用关系。 优势: 1、可适配多种语言,只要引擎可支持该语言的调用分析,即可直接获取。 2、插件开发简单,不用去关注污点等问题了,直接调用引擎的巨大优势实现。 3、由于引擎的强大能力,因此不用担心断的问题。缺点:插件不能实现批量自动化挖掘。 如idea的调用关系分析 然后在去开发一个插件,而后转dot进行获取调用关系。
下面调用的方法 调用他的方法:
他调用的方法:
结合:然后结合sink,source的代码匹配出常见的危险函数后,在结合上面的调用栈,即可快速挖掘出一条有漏洞的调用链。
且还可以继续做限定,如匹配出哪些地方有source
然后结合获取到的调用栈 拼接一个有漏洞的点就可实现自动化出来了。 后言:有些老哥可能会说,可以直接利用已成熟的工具,如tabby,codeql,joern,soot,bytecodedl,doop这些思路去玩,但是经过笔者实测,这些相关工具对应非开源产品的处理不太友好。 当然也可能是笔者的问题,如果有老哥知道如何解决,望指教。 所以怎么说呢,结合起来用吧,如果是开源产品,挖掘链这种,利用这些工具也还行,但是对于闭源项目或是有缺的项目,或许基于自己的思路会更好。
|