什麼是 CodeQL?
CodeQL 是開發人員用來將安全性檢查自動化,以及安全性研究人員用來執行變異分析的分析引擎。
在 CodeQL 中,程式碼會當作資料。 安全性弱點、錯誤(bugs)和其他錯誤會被表示為查詢,這些查詢可以在從程式碼提取的資料庫上執行。 您可以執行 GitHub 研究人員和社群參與者撰寫的標準 CodeQL 查詢,或撰寫自己的查詢以用於自訂分析。 尋找潛在錯誤 (bug) 的查詢會直接在來源檔案中醒目提示結果。
在本單元中,您將了解 CodeQL 靜態分析工具,以及其如何使用資料庫、查詢套件和查詢語言套件來執行變異分析。
變異分析
變異分析是將已知安全性弱點當作種子,以在您程式碼中找出類似問題的流程。 這是安全性工程師用來識別潛在弱點的技術,並確保這些威脅可在多個程式代碼基底之間正確修正。
使用 CodeQL 查詢程式碼,是執行變異分析最有效率的方式。 您可以使用標準 CodeQL 查詢來識別種子弱點,或撰寫自己的自訂 CodeQL 查詢來尋找新的弱點。 接著,您可以開發或逐步改進查詢,以自動尋找相同錯誤 (bug) 的邏輯上的變體,這些變體在使用傳統手動技術方法時可能會被遺漏。
CodeQL 資料庫
CodeQL 資料庫包含從特定時間點單一語言的程式代碼基底擷取的可查詢數據。 資料庫包含程式碼的完整階層表示法,其中包括抽象語法樹狀結構、資料流程圖和控制流程圖的表示法。
每個語言都有專屬資料庫結構描述,定義用來建立資料庫的關聯。 模式提供了擷取流程中進行的初始語彙分析與 CodeQL 查詢評估器的實際複雜分析之間的介面。 例如,結構描述可指定每個語言建構都有一個資料表。
針對每個語言,CodeQL 程式庫會定義類別,在資料庫資料表上提供抽象層。 這會提供資料的物件導向檢視,其可讓您更輕易地撰寫查詢。
例如,在 JAVA 程式的 CodeQL 資料庫中,有兩個主要資料表:
-
expressions資料表,包含一列,對應於在建置流程中分析的原始程式碼中的每個運算式。 -
statements資料表 (包含一列在建置流程中所分析原始程式碼的每個陳述式)。
CodeQL 程式庫會定義類別,在每個資料表 (和相關輔助資料表) 上提供抽象層:Expr 和 Stmt。
查詢套件
CodeQL 查詢套件可讓您根據查詢的檔名、元數據屬性或磁碟或 QL 套件中的位置來選取查詢。 針對您想要在 CodeQL 分析中經常使用的查詢,建立查詢套件。
查詢套件可讓您將多個查詢傳遞至 CodeQL,不必個別指定每個查詢檔案的路徑。 查詢套件定義會儲存在副檔名為 .qls 的 YAML 檔案中。 套件定義是一連串的指示,其中每一個指示都是 YAML 對應,(通常) 含有單一索引鍵。 指示會依照在查詢套件定義中顯示的順序執行。 在執行套件定義中的所有指示後,結果是一組選取的查詢。
預設查詢套件
CodeQL 有兩個內建查詢套件:
-
default:這些是 GitHub 上的 CodeQL 程式碼掃描中預設執行的查詢,可透過程式碼掃描的預設設定取得。 此查詢套件中的查詢非常精確,並且傳回的程式碼掃描結果中誤判率很低。 相對於security-extended查詢套件,預設的套件會傳回更少的低信賴度程式碼掃描結果。 -
security-extended:此套件包含default套件中的所有查詢,以及精確度和嚴重性稍低的額外安全性查詢。 在程式代碼掃描的預設設定中可以使用,並在查詢套件的下拉式清單中列為「擴充」選項。 相對於default查詢套件,此套件可能會傳回更多數目的誤判程式碼掃描結果。
程式碼掃描的預設設定會使用 default 查詢套件。 您可以選取溢位圖示來檢視 CodeQL 組態,然後選取 [編輯] 按鈕來變更此設定。 在 [掃描設定] 下,您可以選擇上述兩個選項之一做為查詢套件。
CodeQL 套件
CodedQL 套件可用來組織 CodeQL 分析中使用的檔案,以便您可以輕鬆建立、共用、依賴和執行 CodeQL 查詢和程式庫。 檔案內含查詢、程式庫檔、查詢套件和重要中繼資料。 透過 CodeQL 套件和 CodeQL CLI 中的套件管理命令,您可以發佈自訂查詢並將其整合到程式碼庫分析中。
CodeQL 套件有三種類型:查詢套件、程式庫套件和模型套件。
- 查詢套件的設計目的是要執行。 發佈查詢套件時,除了查詢來源之外,該套件組合還包含每個查詢的所有可轉移相依性和預先編譯的表示法。 這可確保套件中查詢的有效率且一致的執行。
- 連結庫套件是設計成供查詢套件使用(或其他連結庫套件),且不包含查詢本身。 程式庫不會單獨編譯。
- 模型套件可用來展開程式碼掃描分析,以包含預設不支援的相依性。 模型套件目前處於 Beta 版,且可能會變更。 在 Beta 版期間,模型套件可用於存放庫層級的 Java 分析。 如需建立您自己的模型套件的詳細資訊,請參閱「建立 CodeQL 模型套件」。
CodeQL 套件結構
CodeQL CLI 可用來使用 pack init 命令來開發和發佈套件。 此命令會建立所需的目錄結構和檔案,包括其根目錄中稱為 qlpack.yml 的主要檔案。 每個 qlpack.yml 檔案中的中繼資料會告訴 CodeQL 如何編譯套件中的任何查詢、套件相依的程式庫,以及尋找查詢套件定義的位置。
CodeQL 套件的內容 (CodeQL 分析中使用的查詢或程式庫) 會包含在與 qlpack.yml 相同的目錄中,或其子目錄中。
包含 qlpack.yml 檔案的目錄可作為 CodeQL 套件內容的根目錄。 也就是說,對於套件中的所有 .ql 和 .qlls 檔案,CodeQL 會相對於包含 qlpack.yml 檔案的根目錄,解析所有的匯入語句。
以下為範例 qlpack.yml 檔案:
name: codeql/java-queries
version: 0.0.6-dev
groups: java
suites: codeql-suites
extractor: java
defaultSuiteFile: codeql-suites/java-code-scanning.qls
dependencies:
codeql/java-all: "*"
codeql/suite-helpers: "*"
如需建立及發佈您自己的 CodeQL 套件的詳細資訊,請參閱「發佈和使用 CodeQL 套件」。[1]