在 GitHub 中探索 CodeQL
什麼是 CodeQL
CodeQL 是由 GitHub 開發的語意程式碼分析引擎,將程式碼視為資料。 CodeQL 不只是搜尋文字模式,而是瞭解程式碼的結構和意義,從而實現複雜的安全性和品質分析。
傳統的靜態分析工具經常會產生誤報,因為它們使用簡單的模式匹配。 CodeQL 的語義方法了解程式碼上下文、程式碼元素之間的關係以及應用程式中的資料流,從而實現更準確的漏洞檢測。
CodeQL 的主要特性
CodeQL 會將程式碼視為資料庫:
- 結構表示: 將原始程式碼轉換為擷取語法樹狀結構、控制流程圖和資料流程路徑的資料庫。
- 可查詢格式: 使用專用查詢語言使程式碼可查詢,類似於查詢傳統資料庫。
- 與語言無關的方法:支持多種編程語言,包括 C/C++、C#、Java、JavaScript/TypeScript、Python、Ruby、Go 和 Swift。
- 全面覆蓋: 不僅分析單個文件,還分析整個代碼庫及其所有互連。
CodeQL 可啟用精確的安全性分析:
- 變體分析: 識別出一個漏洞後,您可以編寫查詢來尋找整個程式碼庫中的類似問題。
- 資料流分析: 追蹤資料如何從來源 (使用者輸入) 到接收 (敏感作業) 在應用程式中移動。
- 污點追蹤:識別未受信任的資料何時到達敏感性作業,沒有充分驗證或清理。
- 控制流分析: 了解執行路徑和條件邏輯,以發現僅在特定條件下發生的漏洞。
CodeQL 的運作方式
CodeQL 分析牽涉到三個不同的階段,可將原始程式碼轉換成可採取動作的安全性發現項目:
階段 1:建立 CodeQL 資料庫
第一個步驟會擷取程式碼的結構化表示法:
- 程式碼提取: 在編譯期間或透過靜態分析來分析您的來源檔案。
- 資料庫建立: 建立一個代表程式碼結構的綜合資料庫,包括抽象語法樹、控制流程圖和資料依賴關係。
- 中繼資料擷取: 記錄檔案位置、行號、變數範圍、函數呼叫和類別階層。
- 優化: 為資料庫編製索引以進行高效查詢,即使在大型程式碼庫上也是如此。
該資料庫成為所有後續分析的基礎。 它創建一次,可以多次查詢,使迭代安全分析變得高效。
階段 2:執行 CodeQL 查詢
資料庫存在後,您可以執行查詢以尋找安全性問題:
- 標準查詢套件: GitHub 提供常見弱點的精選查詢集 (OWASP Top 10、CWE 標準)。
- 自訂查詢: 撰寫您自己的查詢,以尋找組織特定的安全模式或編碼標準違規。
- 查詢執行: CodeQL 引擎會針對資料庫執行查詢,搜尋符合弱點簽章的程式碼模式。
- 效能: 查詢執行速度很快,因為查詢是在索引資料庫上運作,而不是原始來源檔案。
查詢類別範例包括:
- 注入漏洞: SQL 注入、命令注入、跨站腳本。
- 驗證問題: 密碼策略薄弱、缺少身份驗證檢查、不安全的會話管理。
- 密碼學問題: 弱演算法、硬編碼憑證、隨機性不足。
- 資源管理: 記憶體洩漏、資源耗盡、資源消耗不受控制。
第 3 階段:解釋結果
最後階段以可操作的格式呈現調查結果:
- 結果排名: CodeQL 會依嚴重性、信賴等級和可利用性來排定調查結果的優先順序。
- 上下文信息: 每個發現項目都包括檔案位置、行號、受影響的程式碼片段和資料流程路徑。
- 補救指引: 結果包括弱點的說明和修正建議。
- 整合: 結果與 GitHub 安全性索引標籤、提取要求註釋和外部工具的 SARIF 檔案整合。
CodeQL 查詢語言
CodeQL 查詢是以宣告式語言撰寫,專為分析程式碼而設計:
查詢結構和語法
CodeQL 使用物件導向邏輯程式設計:
- 類別和述詞: 使用代表程式碼元素(函數、變數、表達式)的類別來定義您要搜尋的內容。
- 宣告式方法: 描述你想找到什麼,而不是如何找到它。
- 圖案搭配: 使用謂詞來比對程式碼模式和關係。
- 可組合性:透過組合更簡單的述詞條件建立複雜的查詢。
查詢結構範例:
import javascript
from SqlExecution sql, Source source
where source.flowsTo(sql.getAnArgument())
select sql, "SQL query vulnerable to injection from $@.", source, "user input"
此查詢會透過下列方式尋找 SQL 插入弱點:
- 識別 SQL 執行點。
- 尋找使用者輸入的來源。
- 追蹤從輸入到 SQL 執行的資料流程。
- 附帶情境說明的漏洞報告。
標準查詢程式庫
GitHub 提供了廣泛的查詢庫:
- 安全性查詢: 偵測 OWASP 十大漏洞、CWE 類別和特定語言的安全問題。
- 程式碼品質查詢: 尋找程式碼氣味、可維護性問題、效能問題和最佳實踐違規。
- 社區貢獻: 安全研究人員和開發人員貢獻的數千個查詢。
- 定期更新: GitHub Security Lab 不斷針對新興漏洞添加新查詢。
您可以使用這些查詢 as-is 或根據您的特定需求自訂它們。
GitHub 安全中的 CodeQL
CodeQL 與 GitHub 的安全性功能深度整合:
使用 CodeQL 進行程式碼掃描
自動化安全分析:
- 預設設定: 在存放庫設定中按一下即可啟用 CodeQL 掃描。
- 排程掃描:依據每次推送、提取要求或依排程自動掃描。
- 多語言支援: 自動偵測存放庫中的語言並執行適當的查詢。
- 結果展示: 安全發現項目會出現在 [安全性] 索引標籤中,並附有詳細說明。
提取要求整合:
- 內嵌註釋:安全性發現項目會直接顯示為提取要求中易受攻擊的程式碼行的註解。
- 封鎖檢查: 將 CodeQL 設定為合併前必須通過的必要檢查。
- 差異掃描:僅報告提取要求引入的新弱點,從而降噪。
- 開發者回饋: 開發人員在程式碼記憶猶新時立即看到安全問題。
GitHub Advanced Security
對於組織,GitHub Advanced Security 提供其他功能:
- 私有儲存庫掃描: 在私人存放庫上執行 CodeQL。
- 自訂查詢執行: 上傳並執行組織特定的查詢。
- 安全性概觀: 顯示所有存放庫的安全性狀態的儀錶板。
- 警報管理: 跨團隊分類、指派和追蹤安全性發現項目。
在 CI/CD 管線中使用 CodeQL
CodeQL 延伸至 GitHub 之外,可與各種 CI/CD 系統整合:
整合方法
GitHub Actions 整合:
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
with:
languages: javascript, python
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2
此工作流程:
- 為某些指定語言初始化 CodeQL。
- 建置應用程式 (或僅進行分析而不建置)。
- 執行安全性查詢。
- 將結果上傳至 GitHub 安全性索引標籤。
Azure Pipelines 整合:
CodeQL 可以使用命令列介面在 Azure Pipelines 中執行:
- 安裝 CodeQL CLI: 在您的管線中下載並安裝 CodeQL 套件組合。
-
建立資料庫: 在建置期間執行
codeql database create。 -
分析資料庫:
codeql database analyze使用選取的查詢套件執行。 - 匯出結果: 產生 SARIF 檔案,以便在 Azure DevOps 中視覺效果化。
其他 CI/CD 系統:
CodeQL CLI 支援任何 CI/CD 平臺:
- 詹金斯: 執行 CodeQL 分析作為建置步驟。
- GitLab CI/CD: 在具有 SARIF 輸出的 GitLab 管線中執行 CodeQL。
- CircleCI: 將 CodeQL 掃描整合到 CircleCI 工作流程中。
- 客製化系統: 從任何可以執行命令列工具的環境使用 CodeQL CLI。
安全閘門
使用 CodeQL 結果作為品質閘道:
- 失敗組建:將管線設定為在 CodeQL 發現高嚴重性弱點時失敗。
- 趨勢分析: 追蹤一段時間內的安全指標以衡量改進。
- 合規要求: 產生安全掃描的證據,以進行稽核和合規性認證。
- 自動補救: 偵測到特定漏洞時觸發自動化工作流程。
CodeQL 開發工具
CodeQL 提供用於建立和測試查詢的工具:
Visual Studio Code 擴充功能
VS Code 的官方 CodeQL 延伸模組提供:
- 查詢開發: 撰寫和測試具有語法醒目提示、自動完成和內嵌檔的 CodeQL 查詢。
- 本地資料庫分析: 針對從本機程式碼庫建立的資料庫執行查詢。
- 結果視覺化: 使用原始程式碼導覽和資料流程路徑查看查詢結果。
- 調試支援: 逐步執行查詢,以瞭解結果並最佳化效能。
命令行介面
CodeQL CLI 可啟用可編寫腳本的分析:
-
資料庫建立:
codeql database create將程式碼擷取為可查詢的格式。 -
查詢執行:
codeql database analyze執行查詢並產生結果。 -
測試查詢:
codeql test run根據測試案例驗證查詢。 - 包裝管理: 下載和管理標準查詢套件。
CodeQL 在安全性自動化方面的優點
將 CodeQL 整合到 DevSecOps 程式中可提供顯著的優勢:
開發人員生產力
早期發現:
- 左移安全性:在開發期間而不是在生產環境中尋找漏洞。
- 更快的補救:修正程式碼是新的且變更很小的問題。
- 學習機會: 開發人員從即時回饋中學習安全編碼實踐。
- 減少上下文切換: 安全性發現項目會出現在熟悉的開發工具中。
準確的結果:
- 低誤報: 語意分析產生比型樣比對更準確的發現。
- 上下文信息: 結果包括顯示漏洞如何發生的資料流路徑。
- 優先調查結果:專注於可利用的問題而不是理論問題。
- 變體發現: 尋找弱點模式的所有實例,而不僅僅是明顯的範例。
組織安全
全面覆蓋:
- 整個程式碼庫: 分析所有程式碼,包括第三方相依性和遺留元件。
- 多種語言: 跨多語言應用程式進行統一的安全分析。
- 一致的標準: 在所有儲存庫中套用相同的安全性規則。
- 歷史分析: 掃描現有的程式碼以建立安全性基準。
可擴展的安全性:
- 自動掃描: 每次提交都不需要手動安全審查。
- 持續監控: 定期掃描可偵測新揭露的漏洞。
- 安全即代碼: 將安全需求編纂為儲存在版本控制中的查詢。
- 知識分享: 查詢程式庫會擷取機構安全性知識。
合規性和治理
審計紀錄:
- 掃描歷史: 記錄所有帶有時間戳和結果的安全掃描。
- 尋找生命週期: 追蹤從偵測到修復的漏洞。
- 政策執行: 示範每個版本都會進行安全性掃描。
- 證據產生: 為審計師和合規框架生成報告。
如需 CodeQL 的詳細資訊,請參閱 CodeQL 概觀。
如需可用的工具,請參閱 CodeQL Tools。