CodeQL三大核心模块:
DataFlow模块、Smtm模块、Expr模块
DataFlow模块主要常用的就是taintedTracking和hasflow,flowto,漏洞挖掘我们肯定是需要用到这个模块的
Stmt模块常用于ast分析,就是ifStmt,TryStmt之类的代码分支,这个我个人觉得语法太麻烦,还不如pmd的xpath规则简单易懂方便编写
Expr模块最常用,例如MethodAccess,Method,call,callable,ClassInstanceExpr之类的一大堆类也是常用的,在定义sink ,source之类的必须要用到
而这个RemoteFlowSource是DataFlow下的一个子类。他的结构就是一个抽象类然后很多子类继承他,返回的内容就是一个子类筛选后的集合。
然后他的代码结构是这样的
其中有一些加了deprecated,在后面版本中要被废弃的一些方法。然后一些常见的获得参数的source都在SpringWebRequest类里
然后其他的一些框架的获得参数的方法都有自己命名的类,比如spring,struts2等
而真正的相关的一些框架的参数和方法的定义都在semmle/code/java/dataflow/framework目录下。
所以很会规则关于source的定义常常是一句话:
override predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource }
看多了规则的编写,你就会发现,他们整个逻辑的结构是一个抽象类 然后分类处理。其中部分的库中的class可能会有一个library关键词,不过这个在后面的codeQL版本中会废弃,仅仅表示这个类在qll文件中加载。不能在主文件中直接编写
本文始发于微信公众号(xsser的博客):CodeQL静态代码扫描规则编写之RemoteFlowSource
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论