CodeQL笔记

看了一点点CodeQL,真的感觉懵懵懂懂的,需要对ast有一定的了解才能写出复杂的codeql。还是得多写啊!

个人理解

CodeQL这个东西,个人感觉想学的深还是得理解AST,理解他对代码构造的CFG。
比如,from Expr e 是创建了一个表达式节点,写过编译器的应该能理解一个Expr代表着什么,因此你就能在合适的地方使用合适的类型,找到合适的节点来处理它。先这样学着语法吧,熟能生巧。

语法笔记

java部分

  1. 拿到int类型

    1
    2
    3
    4
    from Variable v, PrimitiveType pt
    where pt = v.getType() and
    pt.hasName("int")
    select v
  2. 任意文件读(局部)

    1
    2
    3
    4
    5
    6
    from Constructor fileReader, Call call, Expr src
    where
    fileReader.getDeclaringType().hasQualifiedName("java.io", "File") and
    call.getCallee() = fileReader and
    DataFlow::localFlow(DataFlow::exprNode(src), DataFlow::exprNode(call.getArgument(0)))
    select src

    这里还是不太理解和另外一个任意读的例子有什么区别,主要是对codeql定义的参数的传递规则不太了解。

  3. 获得父类、接口等

    1
    2
    3
    4
    code: 
    class A {}
    interface I {}
    class B extends A implements I {}
    1
    2
    3
    4
    return: A、I、Object
    from Class B
    where B.hasName("B")
    select B.getASupertype+()
  4. 污点分析

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class WebAuditConfig extends TaintTracking::Configuration {
    WebAuditConfig() { this = "WebAuditConfig" }

    override predicate isSource(DataFlow::Node source) {
    // RemoteFlowSource具体作用还没研究透彻
    source instanceof RemoteFlowSource
    }

    override predicate isSink(DataFlow::Node sink) {
    sink instanceof Slink
    or
    sink instanceof UnsafeDeserializationSink
    }
    }

    需要继承TaintTracking::Configuration,需要定义isSource和isSink,还有isSanitizer等可自定义。

  5. isSource
    这里着重说isSource,定义准确的source我觉得真的是重中之重。
    比如,这里用定义spirgboot的source

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class ControllerAnno extends Annotation {
    ControllerAnno() {
    this.getType().hasQualifiedName("org.springframework.web.bind.annotation", "GetMapping")
    }
    }
    private class SpringBootSource extends RemoteFlowSource {
    SpringBootSource(){
    this.asParameter().getCallable().getAnAnnotation() instanceof ControllerAnno
    }
    override string getSourceType() { result = "SpringBoot input parameter" }
    }

    对于suorce的漏报,可以用isExtension加规则去掉,参考
    https://rmb122.com/2020/03/31/Codeql-%E8%B8%A9%E5%9D%91%E8%AE%B0%E5%BD%95-%E4%BA%8C/

  6. 定义某个方法

    1
    2
    3
    4
    5
    6
    class EXEC extends Method {
    EXEC() {
    this.hasName("exec") and
    this.getDeclaringType().getASupertype*().hasQualifiedName("java.lang", "Runtime")
    }
    }

    然后在sink里m instanceof EXEC就行

参考

https://www.anquanke.com/post/id/203674 (小型的审计ql脚本照他的demo写就行)
https://paper.seebug.org/1078 入门,带一丢丢原理

CWE是精华,直接拿来用照着写能挖很多很多开源项目CVE

Proudly powered by Hexo and Theme by Hacker
© 2021 LFY