CodeQL

可以做白箱分析

使用

基本概念

  1. 安裝 codeql 與 vs code extension
  2. 透過 codeql 產生 database
  3. 透過 vs code extension 查詢 codeql

安裝

安裝 codeQL cli 工具,不過還是建議在 docker 裡面編譯比較不會遇到問題

brew install codeql
pacaur -S codeql

使用 docker container

自定義專案

目標 Linux Kernel

Using CodeQL to help exploit a linux kernel UAF | jofra

目標 Glibc

分析 heaps bin 的類型

目標 log4j2

先找一個有興趣的 repo 下來,比如 apache log4j2,之前需要編譯需要的工具比如 maven,可以參考 官方文件,使用 docker 自己寫的 Dokcerfile 比較不會有編譯上的問題。

git clone https://github.com/apache/logging-log4j2.git

config toolchains jdk path,卻保這些路徑都有

# cp toolchains-sample-mac.xml ~/.m2/toolchains.xml
cp ./toolchains-sample-linux.xml ~/.m2/toolchains.xml
vim ~/.m2/toolchains.xml

如果直接用上面寫好的 Dockerfile 只需要從這個步驟下來,據說可以 vim pom.xml 然後找到 <modules> 留下兩個包, core 與 api 會比較快,不過還沒測試成功。

mkdir -p codeql-db
docker run --rm -it -v $(pwd)/codeql-db:/codeql-db codeql-docker

接下來可以生成 database,基本上只要確定 core 有成功編譯就可以了

生成 Database

假設透過前面的 Dockerfile 產生好目標,進去 docker 輸入

codeql database create ./codeql-db/db1 --language="java" \
	--source-root=./logging-log4j2 --overwrite \
  --command="mvn package -Dmaven.test.skip=true"

對 CodeQL Database 進行查詢

透過 vs code 的 codeQL 載入 database ,但是我們需要先建立一個包產生 qlpack.yml

codeql pack init

或者直接使用 ql 用好的語法庫

git clone https://github.com/github/codeql

然後我們在 codeql/java/ql/src 底下建立一個檔案,之後 codeql 就可以運作了

import java
select "hello"

如何透過 CodeQL 分析漏洞

CWE coverage for C and C++ — CodeQL query help documentation

Data flow analyzing

基本需要確定 taint analysis 所需要的 sink source 點,可以進行資料流分析

問題

透過類似 SQL 的語法下去查詢 code 之間的關聯性

Fortify 與 codeql 的差異?

參見


CodeQL Taint Analysis Whitebox Static Analysis