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

posted @ 2023-06-14 19:04  妇愁者纞萌  阅读(166)  评论(0编辑  收藏  举报