可以做白箱分析
使用
基本概念
- 安裝 codeql 與 vs code extension
- 透過 codeql 產生 database
- 透過 vs code extension 查詢 codeql
安裝
安裝 codeQL cli 工具,不過還是建議在 docker 裡面編譯比較不會遇到問題
brew install codeql
pacaur -S codeql
使用 docker container
- CodeQL Container by Microsoft | Docker Hub
- github microsoft/codeql-container
- r888800009/codeql-example
自定義專案
- 須確保含有
Makefile
或build.ninja
等常見編譯檔案
目標 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