CodeQL学习实践
CodeQL简介
CodeQL是一个非商业的开源代码自动化审计工具,Github收购后,开源了CodeQL的规则部分,所以收集了大量的规则,安全工程师可以依赖CodeQL的规则实现对多种开发语言项目的代码审计工作
CodeQL原理
CodeQL将代码转化成可查询数据库,代码被视为数据,漏洞、bug、错误,被建模为可针对从代码中提取的数据库执行查询. Extractor 模块对源代码工程进行关键信息分析提取,构成一个关系数据库.对于编译型语言,Extractor 会监控编译过程,编译器每处理一个源代码文件,它都会收集源代码的相关信息,如语法信息、语意信息、控制流、数据流。对于解释性语言,Extractor 则直接分析源代码,得到类似的相关信息。分析后的数据导入CodeQL database.
CodeQL安装
解析引擎安装
https://github.com/github/codeql-cli-binaries/releases
下载
https://github.com/github/codeql-cli-binaries/releases/download/v2.13.3/codeql.zip
#Windows 加入系统path
#Linux cd /usr/bin sudo ln -s /root/Codeql/codeql/codeql codeql source /etc/profile
SDK安装
git clone https://github.com/github/codeql.git
创建一个目录
codeql 和 sdk保存到该目录,可以重名为pl(这个很重要,要不然会出一些奇葩错误)
codeql配置环境变量
vscode安装codeql插件,配置好引擎路径
创建数据库
codeql database create d:\database\codeqltest --language=java --source-root=源码路径 --command="mvn clean install"
mac:codeql database create /Users/***/Desktop/codeql/databases/codeql_demo --language="java" --command="mvn clean install -DskipTests --file pom.xml" --source-root=/Users/***/Downloads/micro_service_seclab-main
导入数据库
打开sdk的工作空间,创建test.ql,执行hello world,代表 CodeQL 开发环境和靶场数据库环境均成功准备完毕
自动化扫描 codeql database analyze databasepath codeql/codeql-repo/codeql-main/java/ql/src/experimental/Security/CWE --format=csv --output=result.csv
语法学习
语法结构
from [datatype] var where condition(var = something) select var
参考代码
import java from int i where i = 1 select i
常用类库参考代码
import java from Method method where method.hasName("getStudent") select method.getName(), method.getDeclaringType()
谓词参考
import java predicate isStudent(Method method) { exists(|method.hasName("getStudent")) } from Method method where isStudent(method) select method.getName(), method.getDeclaringType()
- predicate 表示当前方法没有返回值;
- exists 表示子查询,是 CodeQL 谓词语法里非常常见的语法结构,它根据内部的子查询返回 true or false,来决定筛选出哪些数据
污点分析
污点分析可以抽象成一个三元组<sources,sinks,sanitizers>的形式:
source :漏洞污染链条的输入点,代表直接引入不受信任的数据或者机密数据到系统中;
sink:漏洞污染链条的执行点,代表直接产生安全敏感操作、违反数据完整性或者泄露隐私数据到外界、违反数据保密性,比如 SQL 注入漏洞,最终执行 SQL 语句的函数就是 sink (query、exeSql );
sanitizer:即无害处理,代表通过数据加密或者移除危害操作等手段使数据传播不再对软件系统的信息安全产生危害,即净化函数,简单说就是在整个的漏洞链条当中,如果存在一个方法阻断了整个传递链,那么这个方法就叫sanitizer。
https://blog.csdn.net/weixin_39190897/article/details/128435897