static-analysis:把 CodeQL、Semgrep 與 SARIF 串成可複用的 SAST 工作流

前言

在倉庫裏做安全掃描,常見做法是各自裝一套 CodeQL 或 Semgrep,記一堆 CLI 參數,再把多份 JSON/SARIF 手工合併。模型輔助編碼時,更容易出現「漏關 telemetry」「規則集未經確認就掃」「構建失敗卻當成無漏洞」這類流程問題。

Trail of Bits 在 skills 市場裏提供的 static-analysis 插件,把深度分析(CodeQL)、快速模式掃描(Semgrep)和結果處理(SARIF)寫成一組 Agent Skill,並附帶固定腳本與工作流命令。下面介紹它是什麼、能做什麼,以及如何安裝與調用。

這是什麼

static-analysis 是 Trail of Bits Skills Marketplace 裏 Code Auditing 類的一個插件,定位爲「靜態分析工具包」:用 CodeQL、Semgrep 做漏洞發現,並用 SARIF 解析與合併統一結果形態。

維護方與出處:倉庫 trailofbits/skills;插件 README 標註作者爲 Axel Mierczuk、Paweł Płatek。CodeQL 與 Semgrep 相關實踐與 Trail of Bits Testing Handbook 中的靜態分析章節對齊。

插件內包含三個 Skill(名稱即技能標識):

Skill 作用
codeql 過程間污點與數據流等深度安全分析
semgrep 基於規則集的快速模式掃描
sarif-parsing 解析、彙總、去重各工具輸出的 SARIF

官方 Skill 目錄分別爲:

  • plugins/static-analysis/skills/codeql
  • plugins/static-analysis/skills/semgrep
  • plugins/static-analysis/skills/sarif-parsing

核心功能

CodeQL(codeql Skill)

面向需要構建數據庫、跑查詢包的場景,強調「庫質量」與「顯式查詢套件」,而不是默認套件靜默過濾。

已文檔化的能力包括:

  1. 爲 Python、JavaScript/TypeScript、Go、Java/Kotlin、C/C++、C#、Ruby、Swift 等語言建庫並分析。
  2. 通過顯式 .qls 引用查詢包(如 security-extended、Trail of Bits、Community 等),輸出 SARIF/CSV。
  3. 生成 data extension,覆蓋項目自定義 API 的 source/sink。
  4. 構建後運行 check_db_quality.py、分析前校驗 verify_query_suite.py,避免「零告警等於安全」的誤判。
  5. 掃描模式:run all(security-and-quality + security-experimental)與 important only(高精度子集)。

無人值守構建可走工作流 /static-analysis:codeql-build,例如:

/static-analysis:codeql-build {"target": "/abs/path", "lang": "cpp"}

工作流會按構建方法階梯(autobuild、自定義命令、多步、no-build)嘗試,並在質量門檻未達標時返回明確狀態。

Semgrep(semgrep Skill)

面向快速全庫或規則集驅動的第一次靜態掃描。設計要點是把「命令生成」交給腳本,減少模型手寫 CLI 時漏掉安全約束。

  1. 檢測語言與 Semgrep Pro 是否可用(Pro 用於跨文件污點分析)。
  2. 從內置與第三方規則集(文檔要求包含 Trail of Bits、0xdea、Decurity 等)組計劃,第三步必須經用戶明確批准後再執行。
  3. 通過 scripts/run-scans.sh 批量執行掃描;強制 --metrics=off,輸出寫入獨立 OUTPUT_DIR。
  4. 用 merge_sarif.py 合併爲 results/results.sarif;支持 run-all 與 important-only 兩種模式。

若不需要規則集審批閘門、希望端到端一鍵跑完,可用工作流:

/static-analysis:semgrep-scan {"target": "/abs/path", "mode": "run-all"}

該命令對目標目錄只讀(無 --autofix),寫入僅限輸出目錄;若輸出目錄與掃描目標相同則拒絕執行。

SARIF(sarif-parsing Skill)

用於已有掃描產物時的後處理:理解 SARIF 2.1.0 結構、從 rule 繼承 severity(CodeQL 依賴此行爲)、用 jq 或 Python(pysarif、sarif-tools)做查詢,以及多文件聚合與去重、CI 集成模式。

腳本與工作流

組件 說明
workflows/semgrep-scan.js 對應 /static-analysis:semgrep-scan,階段:Detect → Select → Scan → Report
workflows/codeql-build.js 對應 /static-analysis:codeql-build,階段:Detect → Build → Assess
skills/semgrep/scripts/run-scans.sh 根據選定規則集生成 semgrep 命令、克隆第三方規則倉庫、批跑並寫 scans.json
skills/semgrep/scripts/merge_sarif.py 合併分片 SARIF

官方說明:掃描階段由工作流直接調用 shell 腳本,退出碼與 findings 來自工具進程與 JSON,而非模型自報。

安裝與啓用

先向 Claude Code 或兼容市場添加 Trail of Bits 市場,再安裝 static-analysis 插件。

Claude Code:添加市場

/plugin marketplace add trailofbits/skills

瀏覽並安裝:

/plugin menu

安裝 static-analysis 插件(插件 README 寫法)

/plugin install trailofbits/skills/plugins/static-analysis

Codex CLI

codex plugin marketplace add trailofbits/skills
codex plugin list
codex plugin add <plugin-name>@trailofbits

將 <plugin-name> 替換爲市場中的插件名(與倉庫目錄 static-analysis 對應)。Codex 文檔稱可直接兼容 Claude 插件市場,無需額外 sidecar 元數據。

本地開發時,在倉庫父目錄執行 /plugins marketplace add ./skills 可掛載本地市場副本。

運行前需在本機安裝對應 CLI:Semgrep(semgrep --version)、CodeQL(codeql --version),以及文檔中用於腳本與合併的 jq、uv 等。未在官方文檔中單獨列出的 IDE 集成方式,此處不展開。

典型用法

1. 讓 Agent 按 Semgrep Skill 五步走(含審批)

在對話中說明要對某代碼庫做 Semgrep 安全掃描。Skill 會:

  1. 解析輸出目錄(默認 static_analysis_semgrep_1 遞增命名)。
  2. 檢測語言與 Pro 狀態。
  3. 展示規則集與模式,等待明確「同意/繼續」。
  4. 調用 run-scans.sh。
  5. 合併 SARIF 並彙報 scans.json 中的 failed、skipped。

目標路徑應使用絕對路徑;所有產物落在 $OUTPUT_DIR 下。

2. 工作流一鍵 Semgrep(無規則集審批)

適合已確認掃描範圍、只需只讀掃描的場景:

/static-analysis:semgrep-scan {"target": "/abs/path/to/repo", "mode": "run-all"}

mode 也可按 Skill 文檔選擇 important-only 等等價語義(以 references/scan-modes.md 爲準)。

3. CodeQL 全鏈路或僅構建

完整分析通常走:建庫 → data extensions → run-analysis 工作流;Quick Start 要求先確認 codeql、jq、uv 在 PATH 上。

僅把耗時的構建交給工作流時:

/static-analysis:codeql-build {"target": "/abs/path", "lang": "cpp"}

返回 no-method-succeeded 或 built-below-threshold 時,需在 Skill 流程裏繼續解讀日誌與質量腳本輸出,而不是直接當作掃描完成。

4. 多工具結果合併

Semgrep 路徑最終產物爲 $OUTPUT_DIR/results/results.sarif。若還有 CodeQL 或其他 SARIF 輸出,可啓用 sarif-parsing Skill 做 severity 解析、去重與 CI 側聚合。

適用場景與注意

適合:

  • 需要在 AI 輔助審計裏系統化跑 SAST,且希望規則集、metrics、輸出目錄有固定約束。
  • 同一倉庫既要 CodeQL 深度分析,又要 Semgrep 快速掃一遍,再統一成 SARIF。
  • 與同一市場裏的 variant-analysis、semgrep-rule-creator 等技能串聯(插件 README 已列出關聯)。

限制與坑:

  1. Semgrep 無 Pro 時跨文件污點能力受限,文檔建議此時考慮 CodeQL。
  2. CodeQL 對編譯型語言依賴構建;macOS Apple Silicon 上 exit 137 等需按參考文檔處理,不應默認 build-mode=none。
  3. 第三方規則集需要克隆倉庫;run-scans.sh 失敗時不應手工.subset 掃描冒充完整結果。
  4. /static-analysis:semgrep-scan 與 semgrep Skill 共用 references/,但前者跳過規則集審批;選型取決於你是否要在掃描前編輯規則列表。

插件自帶 hermetic 測試(tests/run_scan_tests.sh、tests/run_workflow_tests.sh),用於約束腳本與工作流行爲,本地改插件時可參考。

結尾

static-analysis 把專業 SAST 裏重複出現的步驟——選規則、關 telemetry、批跑、合併 SARIF、CodeQL 建庫與質量門禁——封裝進 Skill 與固定工作流,讓「讓模型掃一遍倉庫」更接近可審計的流程,而不是一次性 CLI 拼寫。

插件與 Skill 源碼:https://github.com/trailofbits/skills/tree/main/plugins/static-analysis
市場總覽:https://github.com/trailofbits/skills

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜