Codeql规则编写入门

admin 2022年1月11日10:28:02评论448 views字数 1341阅读4分28秒阅读模式

非常常见的几个类的差异

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,很多都是一样的。可能就是继承的父类不一样,导致有些方法上的差异。Callmethod可以混用 一般也没什么问题。

 

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,如下面两张图


Codeql规则编写入门


Codeql规则编写入门

然后我们可以获得这个数据库中的全部RemoteFlowSource的集合。如下图

本文始发于微信公众号(xsser的博客):Codeql规则编写入门

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年1月11日10:28:02
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Codeql规则编写入门https://cn-sec.com/archives/481882.html

发表评论

匿名网友 填写信息