淺談利用codeql進行java代碼審計分析(1)
0x00 前言
- 畢業的師兄推薦我來學習一下一款名叫codeql的代碼審計工具,作為目前剛問世不久的代碼審計工具擁有著巨大的優勢,它在github上作為一款免費工具供安全審計人員使用,同時還可以利用其特性創造屬于自己的編譯語言規則。
0x01 安裝步驟及環境配置
- 首先需要在官網下載并安裝Visual Studio Code

- 在此處搜索codeql插件并安裝

1,安裝插件(已完成)
2,檢查CodeQL CLI即核心程序
(直接在下載[https://github.com/github/codeql-cli-binaries/releases/latest/download/codeql.zip](https://github.com/github/codeql-cli-binaries/releases/latest/download/codeql.zip))
3,克隆工作車間Codeql starter
(直接下載https://github.com/Semmle/ql(更多的編寫例子)https://github.com/github/vscode-codeql-starter(單一的編寫例子作用不大)https://github.com/XiaoMi/galaxy-sdk-java.git也可以在cmd內利用 git clone +鏈接下載)
- 注:下載完后設置一個codeql-home文件夾,將兩個下載好的壓縮包解壓進此文件夾
- 快速啟用
1,在LGTM導入一個包
2,開啟查詢

- 打開擴展設置

- 修改執行路徑,填寫codeql cli的內的codeql.exe路徑
- 在工作區打開下載好的Codeql ql

- 然后是在環境變量內的path加入codeql命令(C:\Users\Administrator\Desktop\codeql-home2\codeql-win64\codeql)

- 下一步就是建立數據庫了(或導入數據庫)
0x02 相關命令
- 在codeql執行程序根目錄打開dos界面使用
codeql database create java-database -l=java -c="javac xxx.java"
codeql database create java-database(利用codeql 創建名為java-database的java數據庫)-l=java(編譯語言為java)-c="mvn clean install -file pom.xml"(利用命令進行編譯,不知道為什么用這個會報錯)-c="javac xxx.java"(將xxx.java編譯成xxx.class并生成codeql數據庫)--source-root=./xxx/xxx(設置路徑,若未設置則默認在codeql執行程序目錄下建庫)codeql database upgrade java-database(更新數據庫)codeql database analyze ./xx/x1 --format=csv --output=xx/x2.csv(利用xx/x1路徑庫對目標進行分析,并以csv的格式在xx/x2路徑輸出)
0x03 關于建庫
- 在這里做個失敗案例

- 結果就是無法創建成功,也試過利用webgoat構建,但也是同樣的問題,可謂是無所不用其極,但都是以失敗告終,而在閱讀了相關文檔以及github,csdn社區后也是一無所獲,對于像Java這類需要進行編譯才能創建ql庫的語言,目前能搜索到的相關資料是非常稀缺的,以上就是筆者目前遇到的問題,即無法正常創建一個java的ql庫。

- c/c++也無法正常建庫,而例如javascript與python語言則可以順利建庫。

- 而開發人員的解釋,則是他們還在解決這個問題,所以暫時還是不能正常建java庫的,雖然說的是MacOS的,可是我的win11貌似也不行。
不過最終我還是找到了解決方法,使用-c="javac xxx.java"對目標java文件進行編譯即可.
- 參考[7].3

- 但是要確保文件名和代碼的主函數名一致,否則也會報錯。(如果出現亂碼情況,請把windows的顯示語言轉換成English即可解決,就可以成功建立數據庫啦)

- 可以用命令利用BreakInSwitchCase.qlref生成csv報告

- 將建好的庫導入vscode

- 在該路徑增加一個demo.ql
- 即可開始編寫ql查詢語句,右鍵run query就能看到結果

- 下面再說明一下如何在LGTM中導入一個包的步驟

- 點擊這個小頭像


- 輸入URL例如
https://lgtm.com/projects/g/apache/kafka.再選擇需要的語言即可。 - 最快速的開啟方法是直接到lgtm網站進行編寫查詢:https://lgtm.com/query/6454096835092279761/

0x04 codeql審計代碼原理圖
- 可以參考綠盟這篇理解:https://cloud.tencent.com/developer/article/1645870

- 原理:編寫查詢語句找出代碼中的漏洞,codeql內的編譯器調用extractor將java代碼編譯成可查詢的數據流,并以數據庫的形式搭配ql庫與編寫的查詢語句進行查詢,得出結果并生成報告
0x05 漏洞分析
- 這里用試一下sql注入漏洞作為例子,由于無法正常建庫,所以這里用網站進行演示
源碼及查詢語句
/**
* @name Query built from user-controlled sources
* @description Building a SQL or Java Persistence query from user-controlled sources is vulnerable to insertion of
* malicious code by the user.
* @kind path-problem
* @problem.severity error
* @security-severity 8.8
* @precision high
* @id java/sql-injection
* @tags security
* external/cwe/cwe-089
* external/cwe/cwe-564
*/
import java
import semmle.code.java.dataflow.FlowSources
import SqlInjectionLib
import DataFlow::PathGraph
from QueryInjectionSink query, DataFlow::PathNode source, DataFlow::PathNode sink
where queryTaintedBy(query, source, sink)
select query, source, sink, "Query might include code from $@.", source.getNode(), "this user input"
- 在網站可以看到報告有兩處漏洞:
* 也可切換視圖為alert更為直觀地追蹤

0x06 總結
我目前還在學習codeql階段,有不少的紕漏還請大佬們多多包涵,寫這篇文章的目的主要是想為安全小白分享一下codeql這款工具,希望讀者看完后能有所收獲以及避開我踩過的坑,我會繼續學習新的安全知識,努力提升自己,將更多更優質的技術文章分享給大家,也請大佬們在評論區給小弟提些建議,后期我會在評論區及時回復您并且修改疏漏。
0x07 Reference
[1].官方文檔
1,https://codeql.github.com/docs/
2,https://lgtm.com/help/lgtm/generate-database
[2].利用codeql挖掘各類java漏洞
https://blog.csdn.net/haoren_xhf/article/details/115064677?spm=1001.2014.3001.5501
平臺csdn,作者淺入淺出0
[3].微軟的codeql文檔
https://docs.microsoft.com/zh-cn/windows-hardware/drivers/devtest/static-tools-and-codeql
[4].關于codeql一系列的學習筆記
http://www.myhack58.com/Article/html/3/8/2020/96814.htm
[5].codeql官方練習題
1,https://www.jianshu.com/p/f141c6c85c1d #新手練習
2,https://lab.github.com/githubtraining/codeql-u-boot-challenge-(cc++) #課程
[6].CodeQL Java 全網最全的中文學習資料及相關教學視頻
https://github.com/SummerSec/learning-codeql
[7].有關建立java庫的解釋
1,https://www.freebuf.com/articles/web/283795.html
2,https://paper.seebug.org/1324/ #轉載自Seebug Paper
3,https://blog.csdn.net/qq_38049062/article/details/116865812?spm=1001.2101.3001.6650.13&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7Edefault-13.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7Edefault-13.no_search_link
[8].codeql建java庫成功的案例
https://blog.csdn.net/qq_38049062/article/details/116865812?spm=1001.2101.3001.6650.13&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7Edefault-13.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7Edefault-13.no_search_link
[9].利用webgoat建立java庫 #轉自angelwhu_blog
https://www.angelwhu.com/paper/2019/12/30/CodeQL-introduction/#0x00-%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA
[10].github上關于codeql的問答模塊
https://github.com/github/codeql-cli-binaries/issues
[11].CodeQL跟蹤java數據流。
https://www.jianshu.com/p/338d14e723c0
[12].生成的報告形式
https://www.cnblogs.com/goodhacker/p/13544871.html
下一期我將分享關于語法規則的相關知識