semgrep

semgrep

熱門

使用平行子代理對程式碼庫執行 Semgrep 靜態分析掃描。支援兩種掃描模式——「全部執行」(完整規則集覆蓋)和「僅重要項目」(高可信度安全漏洞)。當可用時,自動偵測並使用 Semgrep Pro 進行跨檔案污點分析。當被要求掃描程式碼漏洞、使用 Semgrep 執行安全稽核、尋找錯誤或進行靜態分析時使用。會為多語言程式碼庫產生平行工作執行緒。

6336星標
545分支
更新於 2026/7/30
SKILL.md
唯讀
名稱
semgrep
描述

使用平行子代理對程式碼庫執行 Semgrep 靜態分析掃描。支援兩種掃描模式——「全部執行」(完整規則集覆蓋)和「僅重要項目」(高可信度安全漏洞)。當可用時,自動偵測並使用 Semgrep Pro 進行跨檔案污點分析。當被要求掃描程式碼漏洞、使用 Semgrep 執行安全稽核、尋找錯誤或進行靜態分析時使用。會為多語言程式碼庫產生平行工作執行緒。

Semgrep 安全掃描

使用自動語言偵測、透過 Task 子代理平行執行,並合併 SARIF 輸出,執行 Semgrep 掃描。

基本原則

  1. 一律使用 --metrics=off — Semgrep 預設會傳送遙測資料;--config auto 也會回傳資料。每個 semgrep 指令都必須包含 --metrics=off,以防止安全稽核期間的資料外洩。
  2. 使用者必須核准掃描計畫(步驟 3 是嚴格關卡) — 原始的「掃描此程式碼庫」要求不等於核准。必須呈現確切的規則集、目標、引擎和模式;在啟動掃描器之前等待明確的「是」/「繼續」。
  3. 第三方規則集是必要而非選用 — Trail of Bits、0xdea 和 Decurity 的規則能捕捉官方註冊表中沒有的漏洞。只要偵測到的語言相符,就應納入。
  4. 在單一訊息中啟動所有掃描 Task — 平行執行是核心效能優勢。絕不要依序啟動 Task;一律在一個回應中發出所有 Task 工具呼叫。
  5. 掃描前務必檢查 Semgrep Pro — Pro 支援跨檔案污點追蹤,可捕捉約 250% 更多的真實漏洞。跳過檢查意味著默默遺漏關鍵的跨檔案漏洞。

使用時機

  • 程式碼庫安全稽核
  • 在程式碼審查前尋找漏洞
  • 掃描已知的錯誤模式
  • 初步靜態分析

不應使用時機

  • 二進位分析 → 使用二進位分析工具
  • 已設定 Semgrep CI → 使用現有管線
  • 需要跨檔案分析但無 Pro 授權 → 考慮使用 CodeQL 作為替代方案
  • 建立自訂 Semgrep 規則 → 使用 semgrep-rule-creator 技能
  • 將現有規則移植到其他語言 → 使用 semgrep-rule-variant-creator 技能

輸出目錄

所有掃描結果、SARIF 檔案和暫存資料都儲存在單一輸出目錄中。

  • 如果使用者在提示中指定了輸出目錄,則將其用作 OUTPUT_DIR
  • 如果未指定,則預設為 ./static_analysis_semgrep_1。如果該目錄已存在,則遞增為 _2_3 等。

在兩種情況下,一律使用 mkdir -p 建立目錄,然後再寫入任何檔案。

# 解析輸出目錄
if [ -n "$USER_SPECIFIED_DIR" ]; then
  OUTPUT_DIR="$USER_SPECIFIED_DIR"
else
  BASE="static_analysis_semgrep"
  N=1
  while [ -e "${BASE}_${N}" ]; do
    N=$((N + 1))
  done
  OUTPUT_DIR="${BASE}_${N}"
fi
mkdir -p "$OUTPUT_DIR/raw" "$OUTPUT_DIR/results"

輸出目錄在步驟 1 開始時解析一次,並在後續所有步驟中使用。

$OUTPUT_DIR/
├── rulesets.txt                 # 已核准的規則集(步驟 3 後記錄)
├── raw/                         # 每次掃描的原始輸出(未過濾)
│   ├── python-python.json
│   ├── python-python.sarif
│   ├── python-django.json
│   ├── python-django.sarif
│   └── ...
└── results/                     # 最終合併輸出
    └── results.sarif

先決條件

必要: Semgrep CLI(semgrep --version)。如果未安裝,請參閱 Semgrep 安裝文件

選用: Semgrep Pro — 啟用跨檔案污點追蹤、程序間分析以及額外語言(Apex、C#、Elixir)。使用以下指令檢查:

semgrep --pro --validate --config p/default 2>/dev/null && echo "Pro available" || echo "OSS only"

限制: OSS 模式無法追蹤跨檔案的資料流。Pro 模式使用 -j 1 進行跨檔案分析(每個規則集較慢,但平行規則集可彌補)。

掃描模式

在工作流程的步驟 2 中選擇模式。模式會影響掃描器旗標和後處理。

模式 覆蓋範圍 回報的發現
全部執行 所有規則集,所有嚴重性等級 全部
僅重要項目 所有規則集,預先和事後過濾 僅安全漏洞,中高可信度/影響

僅重要項目 套用兩層過濾:

  1. 預先過濾--severity MEDIUM --severity HIGH --severity CRITICAL(CLI 旗標)
  2. 事後過濾:JSON 元資料 — 僅保留 category=securityconfidence∈{MEDIUM,HIGH}impact∈{MEDIUM,HIGH}

請參閱 scan-modes.md 了解元資料條件和 jq 過濾指令。

編排架構

┌──────────────────────────────────────────────────────────────────┐
│ 主要代理(此技能)                                                │
│ 步驟 1:偵測語言 + 檢查 Pro 可用性                                │
│ 步驟 2:選擇掃描模式 + 規則集(參考:rulesets.md)                 │
│ 步驟 3:呈現計畫 + 規則集,取得核准 [⛔ 嚴格關卡]                   │
│ 步驟 4:啟動平行掃描 Task(已核准的規則集 + 模式)                 │
│ 步驟 5:合併結果並回報                                           │
└──────────────────────────────────────────────────────────────────┘
         │ 步驟 4
         ▼
┌─────────────────┐
│ 掃描 Task       │
│ (平行)         │
├─────────────────┤
│ Python 掃描器   │
│ JS/TS 掃描器    │
│ Go 掃描器       │
│ Docker 掃描器   │
└─────────────────┘

工作流程

請遵循 scan-workflow.md 中的詳細工作流程。 摘要:

步驟 動作 關卡 主要參考
1 解析輸出目錄,偵測語言 + Pro 可用性 使用 Glob,非 Bash
2 選擇掃描模式 + 規則集 rulesets.md
3 呈現計畫,取得明確核准 ⛔ 嚴格 AskUserQuestion
4 啟動平行掃描 Task scanner-task-prompt.md
5 合併結果並回報 合併腳本(如下)

Task 強制執行: 呼叫時,建立 5 個具有 blockedBy 相依性的 Task(每個步驟阻擋前一個)。步驟 3 是嚴格關卡 — 僅在使用者明確核准後才標記為完成。

合併指令(步驟 5):

uv run {baseDir}/scripts/merge_sarif.py $OUTPUT_DIR/raw $OUTPUT_DIR/results/results.sarif

代理

代理 工具 用途
static-analysis:semgrep-scanner Bash 為語言類別執行平行 semgrep 掃描

在步驟 4 啟動 Task 子代理時,使用 subagent_type: static-analysis:semgrep-scanner

應拒絕的合理化藉口

捷徑 為何錯誤
"使用者要求掃描,那就是核准" 原始要求 ≠ 計畫核准。呈現計畫,使用 AskUserQuestion,等待明確的「是」
"步驟 3 的 Task 在阻擋,直接標記完成" 謊報 Task 狀態會破壞強制執行。僅在真正核准後才標記完成
"我已經知道他們要什麼" 假設會導致掃描錯誤的目錄/規則集。呈現計畫以供驗證
"只用預設規則集" 使用者必須在掃描前看到並核准確切的規則集
"未經詢問就加入額外規則集" 未經同意修改已核准的清單會破壞信任
"第三方規則集是選用的" Trail of Bits、0xdea、Decurity 能捕捉官方註冊表中沒有的漏洞 — 必要
"使用 --config auto" 會傳送指標;對規則集的控制較少
"一次一個 Task" 破壞平行性;應一起啟動所有 Task
"Pro 太慢,跳過 --pro" 跨檔案分析可捕捉 250% 更多的真實漏洞;值得花時間
"Semgrep 原生支援 GitHub URL" URL 處理在具有非標準 YAML 的儲存庫上會失敗;一律先複製
"清理是選用的" 複製的儲存庫會污染使用者的工作區,並在多次執行中累積
"使用 . 或相對路徑作為目標" 子代理需要絕對路徑以避免歧義
"讓使用者稍後選擇輸出目錄" 輸出目錄必須在步驟 1 解析,在任何檔案建立之前

參考索引

檔案 內容
rulesets.md 完整規則集目錄和選擇演算法
scan-modes.md 預先/事後過濾條件和 jq 指令
scanner-task-prompt.md 啟動掃描子代理的範本
工作流程 用途
scan-workflow.md 完整的 5 步驟掃描執行流程

成功條件

  • [ ] 輸出目錄已解析(使用者指定或自動遞增預設值)
  • [ ] 所有產生的檔案儲存在 $OUTPUT_DIR
  • [ ] 已偵測語言並附檔案計數;已檢查 Pro 狀態
  • [ ] 使用者已選擇掃描模式(全部執行 / 僅重要項目)
  • [ ] 規則集包含所有偵測語言的第三方規則
  • [ ] 使用者已明確核准掃描計畫(步驟 3 關卡已通過)
  • [ ] 所有掃描 Task 在單一訊息中啟動並完成
  • [ ] 每個 semgrep 指令都使用了 --metrics=off
  • [ ] 已核准的規則集記錄到 $OUTPUT_DIR/rulesets.txt
  • [ ] 每次掃描的原始輸出儲存在 $OUTPUT_DIR/raw/
  • [ ] results.sarif 存在於 $OUTPUT_DIR/results/ 且為有效的 JSON
  • [ ] 僅重要項目模式:合併前已套用事後過濾;未過濾的結果保留在 raw/
  • [ ] 結果摘要已回報,包含嚴重性和類別細分
  • [ ] 已清理複製的儲存庫(如有)從 $OUTPUT_DIR/repos/ 中移除