一、CodeQL简介
CodeQL是一种基于静态分析的程序分析工具,由GitHub开发和维护。截止到此刻,CodeQL在Github上已经有超过6100个Star。它可以用于发现代码中的漏洞、代码质量问题和安全问题。CodeQL使用了一种特殊的编程语言QL(查询语言),可以帮助开发人员进行更加高效和精确的代码分析。
CodeQL的核心思想是使用数据流分析技术去发现代码中的潜在安全问题和漏洞,它可以在编译时或者运行时对代码进行分析,找出潜在的程序缺陷和安全隐患。CodeQL不仅支持多种编程语言,而且提供了大量的现成代码库和规则,使开发人员可以快速地构建和扩展自己的代码分析平台。
二、CodeQL环境搭建
2.1 引擎安装
引擎不开源,可以直接下载二进制文件使用。https://github.com/github/codeql-cli-binaries/releases 下载已经编译好的codeql执行程序,本次下载windows平台是安装包。添加codeql环境变量。
查看codeql命令,验证安装是否成功。
2.2 SDK安装
https://github.com/github/codeql 下载代码仓库。
2.3 Vscode开发插件安装
Vscode插件搜素codeql,并且配置codeql的引擎路径。
2.4 验证开发环境
CodeQL的处理对象并不是源码本身,而是中间生成的AST结构数据库,所以我们先需要把我们的项目源码转换成CodeQL能够识别的CodeDatabase。本次使用开源靶场项目java-sec-code(https://github.com/JoyChou93/java-sec-code)。
1、 下载靶场源代码到本地,创建数据库。Java语言需要编译,db-ql为数据库名称。
codeql database create db-ql --language=java --command=“mvn clean install”
2、 Vscode添加数据库db-ql
3、 选择sdk中的\ql\java\ql\src\Security\CWE\CWE-078\ExecTainted.ql文件,运行ql查询语句查找源代码中的命令注入漏洞。
查看结果可以看到检测出四处命令注入,可以看到代码行数,能够追踪代码流程图,点击可以跳转到对应的源代码文件中。
4、 使用analyze命令可以导出excel格式的漏洞。
codeql database analyze “G:\java\SecExample-main\webgoat-ql”
“G:\java\CodeQL\ql\java\ql\src\Security\CWE\CWE-078\ExecTainted.ql”
–format=csv --output=result.csv
三、CodeQL检测原理
3.1 数据库生成原理
它的工作流程大致是,在javac编译目标代码时,通过Extractor与其进行交互。Extractor会根据每一个java文件的内容生成一个trap文件,后续再根据trap文件生成实际的数据库。同时它会将处理的每一个java文件拷贝一份保存在数据中,便于后续展示查询结果时能看到代码的上下文。
VSCode中可以看到抽象语法树(AST)
3.2 QL查询语法
基本语法
CodeQL的查询语法有点像SQL,如果你学过基本的SQL语句,基本模式应该不会陌生
CodeQL的查询语法有点像SQL,如果你学过基本的SQL语句,基本模式应该不会陌生
import java
from int i
where i = 1
select i
QL查询的语法结构为:
from [datatype] var
where condition(var = something)
select var
类库
常使用的类库
查看一个获取调用方法和类的案例
谓词
和SQL一样,where部分的查询条件如果过长,会显得很乱。CodeQL提供一种机制可以让你把很长的查询语句封装成函数。
这个函数,就叫谓词
设置source和sink
在代码自动化安全审计的理论当中,有一个最核心的三元组概念,就是(source,sink和sanitizer)。
source是指漏洞污染链条的输入点。比如获取http请求的参数部分,就是非常明显的Source。
sink是指漏洞污染链条的执行点,比如SQL注入漏洞,最终执行SQL语句的函数就是sink(这个函数可能叫query或者exeSql,或者其它)。
sanitizer又叫净化函数,是指在整个的漏洞链条当中,如果存在一个方法阻断了整个传递链,那么这个方法就叫sanitizer。
命令注入的查询语句
四、CodeQL靶场检测效果
使用java-sec-code、两个java靶场进行检测,能够检测出大部分漏洞。靶场检测结果如下显示。
五、CodeQL集成方案
CodeQL可以通过流水线集成到研发流程中,提升应用安全管控能力。
pipeline {
agent any
stages {
stage('Checkout') {
steps {
git branch: 'main', url: 'https://github.com/my-org/my-repo.git'
}
}
stage('Build') {
steps {
sh './gradlew build'
}
}
stage('CodeQL analysis') {
steps {
withEnv(['PATH+MAVEN=/usr/local/maven/bin']) {
sh 'codeql database create --language=java --source-root=$(pwd) my-db'
sh 'codeql database analyze my-db --results-dir=my-results -j auto /opt/codeql-java/ql/src/codeql-suites/java-security/java-security.qls'
}
archiveArtifacts '**/my-results/**'
}
}
}
}