
Choccy是一個用於監控GitHub倉庫更新並自動對其進行CodeQL分析掃描的項目。
運行前需要自行配置好代碼編譯環境,CodeQL環境:
分別下載CodeQL二進制和庫https://github.com/github/codeql-cli-binaries/releases ,https://github.com/github/codeql/tags
解壓後與Choccy二進製文件放在同一目錄下,即:
$ tree . -L 1
.
├── choccy
├── codeql
└── codeql-codeql-cli-v2.19.4
主要配置和功能都在Web界面,命令行參數只有兩個:
-addr string
监听地址和端口 (default "0.0.0.0:80")
-token string
系统Token
程序第一次運行時會在自身所在目錄創建choccy_data文件夾用於保存數據,如果不指定token將會隨機生成並輸出到命令行,該項目本身有潛在的任意命令執行和文件讀取等功能,所以如果服務開放於公網請務必設置強密碼。
需要先進入web目錄編譯前端,編譯golang後端時會自動嵌入前端資源文件。
cd web
npm install
npm run build
cd ..
go build -o choccy main.go
# mac上交叉编译
# CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o choccy_linux_amd64 main.go
# CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -o choccy_windows_amd64.exe main.go
# CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -o choccy_darwin_amd64 main.go 使用前配置好CodeQL環境,最好也在设置中配好GitHub Token,否則可能會被GitHub api限制訪問。设置-其他- CodeQL附加命令行选项中的--ram 2048是允許CodeQL使用的最大內存,單位為MB,請根據自己系統的配置酌情調高,否則可能影響掃描速度或造成掃描失敗。
目前支持GitHub倉庫的Release掃描、默認分支掃描、原有CodeQL數據庫掃描,GitHub會對很多倉庫自動編譯CodeQL數據庫(可以通過接口https://api.github.com/repos/<owner>/<repo>/code-scanning/codeql/databases查看),這會省去配置本地編譯環境的步驟和本地編譯數據庫的時間,所以掃描模式優先選擇原有數據庫,以java-sec-code這個項目為例:

查詢套件是一系列查詢語句的集合,可以點擊菜單欄中的查询套件進行查看和編輯,這裡可以先選預置的java_security.qls 。
然後點擊項目右側的加入扫描队列,這會立即創建一個任務,對項目進行版本檢測和掃描。

在任务選項卡中,可以看到當前的任務執行情況及執行日誌:

執行完成後,可以在分析结果選項卡中看到具體的掃描結果,結果的展示完整復刻了vscode中CodeQL插件的展示效果,還做了一些優化,其中包含漏洞信息,漏洞位置,對應規則ID,漏洞的完整調用鏈路,漏洞上下文代碼,點擊超鏈接可以跳轉到GitHub倉庫對應的代碼位置。

項目被添加之後,默認會每週拉取最新版進行一次掃描,這可以在设置-其他-定时扫描Cron表达式進行配置:

另外,设置-环境-环境变量可以配置系統訪問GitHub時的代理等。

可以向Packs目錄中放入自己寫的查詢庫或查詢語句,放置完成後可以到查询包選項卡查看:


查詢套件是一系列CodeQL規則的集合,可以在查询套件選項卡中進行編輯和查看:

語法參考官方文檔:https://docs.github.com/zh/code-security/codeql-cli/using-the-advanced-functionality-of-the-codeql-cli/creating-codeql-query-suites
在数据库頁面,點擊右上角的加號圖標,將本地數據庫打包為zip壓縮包,然後上傳,等待上傳並導入完成(上傳期間不可關閉該頁面)
(上傳功能並未採用分塊傳輸,所以要求服務器可用內存需大於文件大小)


在任务頁面,點擊右上角的加號圖標,選擇數據庫和查詢套件即可,項目名稱默認和數據庫名一致

在任务頁面,選中右上角的加號圖標,點擊从GitHub批量创建

搜索語句為對倉庫的檢索,語法參考:https://docs.github.com/en/rest/search/search?apiVersion=2022-11-28#搜索语句
扫描范围指的是按某種順序排序後,取出哪一部分進行掃描。如下截圖中,將按star數量逆序排序,並掃描第11和第12個倉庫

本工具僅面向合法的學習或研究行為。在使用本工具過程中,您應確保自己所有行為符合當地的法律法規。 如您在使用本工具的過程中存在任何非法行為,您將自行承擔所有後果,本工具所有開發者和所有貢獻者不承擔任何法律及連帶責任。 除非您已充分閱讀、完全理解並接受本協議所有條款,否則,請您不要安裝並使用本工具。 您的使用行為或者您以其他任何明示或者默示方式表示接受本協議的,即視為您已閱讀並同意本協議的約束。