CodeQL教程
0x00 前言
近期在学习静态代码审计的部分内容,找到了一个强大的神器CodeQL,但是中文的学习资源和手册都不是很完善,所以在这里吧个人的学习进行记录和分享,同时汇总一些大师傅们的分析文章及资源。
0x01 CodeQL简介
CodeQL是一款帮助开发者自动化安全检查的分析引擎,同时也能够帮助安全研究人员进行变种函数分析。
在CodeQL的世界,所有的代码都被视作数据来处理。安全漏洞、bugs、以及其他错误都可以生成查询模型来针对性的从代码提取出的数据库进行查询。
借助CodeQL,我们可以通过:定义sink、source来构建风险模型、CodeQL污点跟踪,来快速通过目前已知的基础漏洞来发现一些0day。
根据Lenny师傅的博客(https://lenny233.github.io/)描述和见解,CodeQL可以视作两大模块:
CLI可以理解为是扫描的主引擎,所有的分析功能都被集成于这个二进制工程内且并不开源。
该项目是QL语言的具体实现,可以理解为是定义好的扫描规则,QL为CodeQL的使用者提供了封装好的常用方法、对象、模块等。
0x02 CodeQL-CLI
官方提供的CLI是封装好的二进制文件,直接从github上下载即可。
同时Vscode也提供了一个CodeQL的插件,方便开发者边便捷使用。
具体的安装方式就不再做过多赘述,已经有很多大师傅把这里写的很详细了。
具体的使用方式同样也不再多加描述,详细用法去读取CodeQL手册,这里记录几个最常用的命令:
创建QL数据库:
CodeQL database create -s <CodePath> <DatabasePath> --language=<Language> --command='xxx'
进行分析:
CodeQL database analyze <database> <queries> --format=<format> --output=<output>
对于Cpp、Java这类需要编译的语言,CodeQL同样需要编译后才可以创建数据库,所以对应的环境依赖需要配置好(gcc/java/mvn…)
0x03 QL
由于CLI并不是开源的,所以我们也没有办法去关注整个代码审计的数据库具体的AST生成过程等流程。因此在CodeQL中,起到关键作用的就是QL规则文件了。
以java-sqlinject为例,看官方的QL库是如何写的:
import java
import semmle.code.java.dataflow.FlowSources
import SqlInjectionLib
import DataFlow::PathGraph
from DataFlow::Node query, DataFlow::PathNode source, DataFlow::PathNode sink
where queryTaintedBy(query, source, sink)
select query, source, sink, "Query might include code from $@.", source.getNode(), "this user input"
from用来声明变量,where来编写限制表达式,最后select用于输出。
已有资源分析
每次在学习一个新鲜的东西,第一时间都是去找各位师傅的博客和分享。所以第一部分先把国内各位大师傅的博文都撸一遍,站在巨人的肩膀上再去啃官方手册文档。
先知社区
先知上共有四篇文章:
- 入门教程:https://xz.aliyun.com/t/7657 包含了安装和基础使用。
- 官方习题:https://xz.aliyun.com/t/7979 学习官方题目解题思路。
- 实战利用:https://xz.aliyun.com/t/7482 fastjson利用链路实战。
- 追求细节:https://xz.aliyun.com/t/7789 CodeQL污点分析。
然后总结一下几篇文章内的学习到的感悟:
入门教程没有什么好说的,这个也是大多数博文重复的内容。简单的描述了安装、语法、以python-django项目为例的查询。
官方习题师傅只写了第四题,看了一下前三题都是C的js的…所以先跟着师傅学习一下java的这题,师傅把https://securitylab.github.com/ctf/codeql-and-chill 的官方解题流程翻译的比较容易理解了一些。