CodeQL CLI入門

bamb00發表於2020-08-22

一、CodeQL CLI 安裝和配置

1.下載CodeQL CLI 壓縮包

https://github.com/github/codeql-cli-binaries/releases

2.建立CodeQL目錄,如$HOME/codeql-home

3.建立CodeQL查詢的本地拷貝

 

CodeQL倉庫包含分析C/C++, C#, Java, JavaScript、python等所需的查詢和庫檔案。需要拷貝一份倉庫到codeql-home目錄,重新命名倉庫資料夾為codeql-repo

倉庫下載地址:https://github.com/github/codeql

  • go的倉庫地址:https://github.com/github/codeql-go/
  • 假設CodeQL倉庫目錄為$HOME/codeql-home/codeql-repo,那麼go的倉庫目錄可以設定為$HOME/codeql-home/codeql-go

4.解壓CodeQL CLI 壓縮包$HOME/codeql-home目錄

5.執行CodeQL

(1)通過直接執行$HOME/codeql-home/codeql/codeql來執行CodeQL

(2)將$HOME/codeql-home/codeql目錄新增到環境變數

二、建立CodeQL資料庫

命令:

codeql database create <database> --language=<language-identifier>

引數說明:

<database>:建立的資料庫的路徑,必須是不存在的資料夾

--language:如下

 

C/C++ cpp
C# csharp
Go go
Java java
JavaScript/TypeScript javascript
Python python

其它引數:

--source-root 指定資料庫建立時的原始檔根目錄,預設為當前目錄。

--command 指定語言的編譯命令,不要給python和JavaScript指定該命令。

非編譯型語言建立資料庫

codeql database create --language=javascript --source-root <folder-to-extract> <output-folder>/javascript-database

三、使用CodeQL CLI分析資料庫

命令:

codeql database analyze <database> <queries> --format=<format> --output=<output>

引數說明:

<database> 預分析的資料庫路徑

<queries> 要在資料庫上執行的查詢。可以指定一個或多個單獨的查詢檔案,指定將以遞迴方式搜尋查詢檔案的目錄,或者命名定義了一組特定查詢的查詢套件。

--format  分析生成的結果檔案的檔案格式

--output  分析結果的輸出路徑

還可以通過--threads指定執行查詢時要使用的執行緒數。預設選項是1

 

示例:

codeql database analyze <javascript-database> ../ql/javascript/ql/src/Declarations/UnusedVariable.ql --format=csv --output=js-analysis/js-results.csv

上述分析的結果會在新建立的資料夾js-analysis下的js-results.csv檔案中輸出

執行目錄中的所有查詢

您可以通過提供目錄路徑而不是列出所有單個查詢檔案來執行目錄中的所有查詢。路徑是遞迴搜尋的,因此子資料夾中包含的所有查詢也將被執行。

重要

您不應在執行database analyze時指定QL包的根目錄, 因為它包含一些並非為命令使用而設計的特殊查詢。相反,要執行各種有用的查詢,請執行LGTM.com查詢套件之一。

例如,要執行Functions 目錄中包含的所有Python查詢,您將執行:

codeql database analyze <python-database> ../ql/python/ql/src/Functions/ --format=sarif-latest --output=python-analysis/python-results.sarif

會生成一個SARIF結果檔案。通過--format=sarif-latest可確保結果根據CodeQL支援的最新SARIF規範進行格式化。

結果

您可以將分析結果儲存為多種不同格式,包括SARIF和CSV。

SARIF(資料分析結果交換格式)是定義輸出檔案格式的OASIS 標準。 SARIF 標準用於簡化靜態分析工具分享其結果的方式。 有關更多資訊,請參見SARIF概述

如果選擇將結果生成為CSV,則輸出的每條告警將包含以下資訊:

名稱 標識結果的查詢名稱。 Inefficient regular expression
描述 查詢的描述。 regular expression that requires exponential time to match certain inputs can be performance bottleneck, and may be vulnerable to denial-of-service attacks.
嚴重程度 查詢的嚴重性。 error
資訊 告警訊息。 This part of the regular expression may cause exponential backtracking on strings containing many repetitions of '\\\\'.
路徑 包含告警的檔案的路徑。 /vendor/codemirror/markdown.js
起跑線 觸發告警的程式碼開始的檔案行。 617
開始欄 起始行的列,用於標記告警程式碼的開始。第一列不包括在內。 32
終點線 觸發告警的程式碼結束的檔案行。與起始行相同時不包括在內。 64
結束欄 可能的話,在結束行的列中標記告警程式碼的結尾。否則,將重複結束行。 617

結果檔案可以整合到您自己的程式碼審查或除錯基礎結構中。例如,SARIF檔案輸出可通過IDE的SARIF檢視外掛在原始碼中的正確告警位置進行突出顯示。

在CodeQL CLI中使用自定義查詢

您可以通過編寫自己的查詢來標記特定的漏洞或錯誤,以達到自定義CodeQL分析的目的。

寫一個有效的查詢

在執行自定義分析之前,您需要編寫一個有效的查詢,並將其儲存在帶有.ql副檔名的檔案中有大量可用的文件可幫助您編寫查詢。有關更多資訊,請參閱學習CodeQL幫助中的CodeQL查詢

包含查詢metadata

查詢metadata包含在每個查詢檔案的頭部。它為使用者提供有關查詢的資訊,並告訴CodeQL CLI如何處理查詢結果。

使用database analyze命令進行查詢時,必須包括以下兩個屬性,以確保結果是正確的:

  • 查詢識別符號(@id):是一串小寫字母或數字,通過/-分隔構成的單詞序列,用於識別和分類查詢。
  • 查詢型別(@kind):標識查詢是告警(@kind problem)還是路徑(@kind path-problem)。

建立一個自定義的QL包

編寫自己的查詢時,應將它們儲存在自定義QL pack目錄中。QL包提供了一種在CodeQL analysis中用於組織檔案的方法。該自定義目錄的根目錄下必須包含一個在以qlpack.yml命名的檔案我們的自定義查詢應儲存在QL pack的根目錄或子目錄中。

對於每個QL包,該qlpack.yml檔案都包含告訴CodeQL如何編譯查詢,該包所依賴的庫以及在何處查詢查詢套件定義的資訊。有關此檔案中包含的內容的更多資訊,請參見“ 定製QL包”

 

相關文章