非常常见的几个类的差异
Method,MethodAccess,ConstrutorCall,Construtor,Call,RefType
常见的几个模块,一个dataFlow模块 ,一个TrackingTaintedConfig,一个java,一个smtm。
常见的大部分就在Java下,比如Method,MethodAccess,这2个的区别在于一个是方法的定义,一个是方法的调用。例如
Method method | method = sink.getNode().asExpr().(MethodAccess).getMethod()
这句话就像是一句废话… 一个表达式的方法是一个已经定义的方法
Sink.getNode()就是返回一个Expr(expression,即表达式)的节点,这个节点可能是任何的表达式。.asExpr()就是返回这个节点的表达式部分,也可以表示一个节点的全部的Expr集合。
再来看,.(MethodAccess)是codeql的强制类型转换语法,这里可以转换成任何的类型,以使用它的方法。这里的getMethod方法是用来获取这个表达式的方法部分。所以要强制转下类型。部分语法大家可能要官方文档,如果看不懂E文 我简单的做了一个机器翻译加上部分的人工翻译调整,github地址是https://github.com/xsser/codeql_chinese
这里Method,MethodAccess还有一个call 都是差不多的,尤其是call,callee,和method,很多都是一样的。可能就是继承的父类不一样,导致有些方法上的差异。Call和method可以混用 一般也没什么问题。
ConstrutorCall是构造方法的调用,比如new MyCustomFunction()的时候一些类似python里的__init__方法,而Construtor就是和Method一样了,只是定义的部分。
RefType就是类似抽象方法,接口,类这一些。Class, Interface
Vscode quick evalation的使用
Codeql是没有调试工具的,所以你不知道你写的代码是不是存在问题,那么你怎么检测和调试呢,方法就是quick evalation的使用。我们可以在对某个变量或者类进行单项的查询。
举个例子,我们编写一个conf类,而这个类的isSource谓语继承与RemoteInputSource。Demo代码如下
class TaintedPathConfig extendsTaintTracking::Configuration {
TaintedPathConfig() { this = "TaintedPathConfig"
override predicate isSource(DataFlow::Nodesource) { source instanceof RemoteFlowSource }
}
我们可以双击isSource或者RemoteFlowSource这个类型或者谓语,然后选择quick evalation,如下面两张图
然后我们可以获得这个数据库中的全部RemoteFlowSource的集合。如下图
本文始发于微信公众号(xsser的博客):Codeql规则编写入门
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论