sast-skills 是做什麼的?
將你的 LLM 編碼助手轉變為功能全面的 SAST 掃描器。為 Claude Code、Codex、Opencode、Cursor 以及任何載入 CLAUDE.md / AGENTS.md 技能資料夾的助手提供即插即用的代理技能。
建議使用 Claude Code with Opus 以獲得最佳品質;任何有能力的模型均可使用。
亮點
- 31 項技能涵蓋 28 種漏洞類別 — 注入、中斷的存取控制、弱加密、檔案處理、供應鏈、業務邏輯,以及 LLM 特定風險(提示注入、不安全的輸出處理)。
- 四階段編排 — 偵察 → 並行檢測 → 合併報告 → 基於證據的審核,完全由
CLAUDE.md/AGENTS.md驅動。 - 冪等且可恢復 — 每個階段會跳過已存在輸出檔案的工作;修復問題後重新執行只會重新整理過時的內容。
- 機器可讀輸出 — 每項技能都產生標準 JSON;
sast-skills export將其彙整為 JSON、SARIF 2.1.0 或 HTML 格式,適用於 GitHub Code Scanning 和 CI。 - 跨助手支援 — 為 Claude Code (
.claude/skills) 和每個AGENTS.md助手 (.agents/skills) 提供相同的技能。 - 零設定 CLI —
install/update/uninstall/doctor/export指令,從 GitHub Actions 發布並帶有 npm 原始碼證明 (SLSA 證明)。
流程
編排器執行四個階段 — 偵察、並行檢測、綜合分析和審核:
flowchart TD
U(["User: 執行漏洞掃描"]) --> R{"CLAUDE.md / AGENTS.md 編排器"}
R --> S1["步驟 1 — sast-analysis<br/>程式碼庫和架構對映"]
S1 -->|sast/architecture.md| S2["步驟 2 — 並行漏洞掃描<br/>28 項技能:偵察、批次驗證、合併"]
S2 -->|sast/*-results.md 和 *-results.json| S3["步驟 3 — sast-report<br/>合併並排序"]
S3 -->|sast/final-report.md| S4["步驟 4 — sast-triage<br/>假陽性消除、<br/>基於證據的嚴重性調整"]
S4 -->|sast/final-report-triaged.md 和 triaged.json| EXP["npx sast-skills export<br/>JSON, SARIF, HTML"]
EXP --> CS(["GitHub Code Scanning, CI, 儀表板"])
每個步驟都是冪等的:如果其輸出檔案已存在,編排器會跳過它。修復問題後重新執行掃描只會重新整理過時的內容。
它檢測的內容
所有技能都遵循相同的三階段模式:偵察 → 批次驗證(並行子代理,每批 3 個) → 合併。每個技能會寫入一份人類可讀的 Markdown 報告和一組標準 JSON 發現結果,sast-skills export 會對其進行彙整。
偵察與綜合分析
| 技能 | 角色 |
|---|---|
sast-analysis | 程式碼庫偵察、架構對映、威脅模型 |
sast-report | 將各類別的發現結果合併為排序報告 |
sast-triage | 移除假陽性並根據程式碼庫證據調整嚴重性 |
注入
| 技能 | 漏洞類別 |
|---|---|
sast-sqli | SQL 注入 |
sast-nosql | NoSQL 注入 (Mongo, Firestore, DynamoDB) |
sast-ldap | LDAP 過濾器 / DN 注入 |
sast-graphql | 不安全的 GraphQL 文件建構 |
sast-xss | 跨站指令碼攻擊 |
sast-ssti | 伺服器端模板注入 |
sast-rce | 遠端程式碼執行 (指令注入, eval, 不安全的反序列化) |
sast-xxe | XML 外部實體 |
sast-ssrf | 伺服器端請求偽造 |
sast-openredirect | 開放重定向 (釣魚 / OAuth 令牌盜竊) |
存取控制與認證
| 技能 | 漏洞類別 |
|---|---|
sast-idor | 不安全的直接物件參照 |
sast-missingauth | 缺少認證 / 中斷的功能級別授權 |
sast-jwt | 不安全的 JWT 實作 |
sast-csrf | 跨站請求偽造 |
sast-cors | CORS 設定錯誤 |
檔案、加密與執行時期
| 技能 | 漏洞類別 |
|---|---|
sast-pathtraversal | 路徑 / 目錄遍歷 |
sast-fileupload | 不安全的檔案上傳 |
sast-crypto | 弱加密原語、不良模式、IV 重用、弱 PRNG |
sast-prototype | JavaScript 原型污染 |
sast-redos | 災難性回溯正規表示式 DoS |
sast-race | 競爭條件和 TOCTOU |
資料暴露與供應鏈
| 技能 | 漏洞類別 |
|---|---|
sast-hardcodedsecrets | 客戶端程式碼中的 API 金鑰 / 令牌 / 憑證 |
sast-pii | 記錄 / 遙測 / 錯誤頁面中的 PII 和憑證洩漏 |
sast-deps | 已知漏洞依賴項 (鎖定檔中的 CVE) |
sast-iac | 不安全的 IaC (Dockerfile / Terraform / Kubernetes / GitHub Actions) |
業務邏輯與 LLM 特定
| 技能 | 漏洞類別 |
|---|---|
sast-businesslogic | 價格操縱、工作流程繞過、獎勵濫用 |
sast-promptinjection | 未受信任的文字到達 LLM 提示 (OWASP LLM #1) |
sast-llmoutput | 未經驗證的 LLM 輸出到達程式碼 / HTML / SQL / Shell 接收器 (OWASP LLM #2) |
安裝
npx sast-skills install
安裝程式會詢問要針對哪個助手 (claude / agents / all),以及要安裝到目前專案還是使用者家目錄 (project / global)。若要跳過提示:
npx sast-skills install --yes --assistant claude --scope project
如果你的專案已包含
CLAUDE.md或AGENTS.md,安裝程式預設會拒絕覆蓋 — 請先備份或傳遞--force參數。
手動安裝 (不使用 npx / npm)
如果你無法執行 npx (企業代理、npm 註冊表無法訪問、離線環境),或者你想鎖定此分支的原始碼而非已發布的 npm 套件,請使用此路徑。CLI 安裝程式只做兩件事 — 將編排器入口檔案放入專案根目錄,並將每個技能的 SKILL.md 鏡像到正確的隱藏目錄 — 因此簡單的 cp -R 即可完全重現。
1. 取得綑綁檔案
git clone https://github.com/mstfknn/sast-skills.git
你需要的所有檔案都在 sast-skills/sast-files/ 下:
sast-files/
├── CLAUDE.md # Claude Code 的編排器入口
├── AGENTS.md # Gemini CLI / Codex / OpenCode / Cursor 的編排器入口
├── .claude/skills/sast-*/SKILL.md # 31 項 Claude Code 格式的技能
└── .agents/skills/sast-*/SKILL.md # 為 AGENTS.md 助手鏡像的相同 31 項技能
這兩個技能樹由 npm run sync 保持同步 — 內容相同,僅目錄名稱不同。
2a. 為 Claude Code 安裝
設定 SAST_SRC 為克隆路徑,使以下命令保持可複製貼上:
export SAST_SRC=/absolute/path/to/sast-skills
cd /path/to/your-project
專案範圍 (建議使用 — 與你的儲存庫一同版本化):
cp "$SAST_SRC/sast-files/CLAUDE.md" ./CLAUDE.md
cp -R "$SAST_SRC/sast-files/.claude" ./
如果你已經使用專案層級的
CLAUDE.md,請勿覆蓋它 — Claude Code 每個專案只讀取一個CLAUDE.md。請改為將編排器內容 (四個階段流程) 合併到你現有的檔案中。
全域範圍 (技能在每個專案中皆可用;編排器仍需按專案複製):
mkdir -p ~/.claude/skills
cp -R "$SAST_SRC/sast-files/.claude/skills/." ~/.claude/skills/
# 然後在你想要執行掃描流程的任何專案中:
cp "$SAST_SRC/sast-files/CLAUDE.md" /path/to/your-project/CLAUDE.md
2b. 為 Gemini CLI (和其他 AGENTS.md 助手) 安裝
export SAST_SRC=/absolute/path/to/sast-skills
cd /path/to/your-project
cp "$SAST_SRC/sast-files/AGENTS.md" ./AGENTS.md
cp -R "$SAST_SRC/sast-files/.agents" ./
AGENTS.md 是 Gemini CLI、Codex CLI、OpenCode 和 Cursor 遵循的跨助手慣例。如果你的 Gemini CLI 版本查詢的是 GEMINI.md,請重新命名 — 內容不變:
mv AGENTS.md GEMINI.md
3. 驗證安裝
# 專案範圍 (Claude Code)
ls CLAUDE.md && ls .claude/skills/ | head
# 專案範圍 (Gemini / AGENTS.md)
ls AGENTS.md && ls .agents/skills/ | head
# 全域範圍 (Claude Code)
ls ~/.claude/skills/ | head
你應該會看到所有 31 個 sast-* 技能目錄。在助手中開啟專案並提示 「執行漏洞掃描」 — CLAUDE.md / AGENTS.md 中的編排器會從那裡驅動四個階段。
4. 保持手動安裝更新
cd "$SAST_SRC" && git pull
# 重新執行步驟 2a / 2b 中的 cp 命令以重新整理 — 它們是冪等的。
如果你保留克隆,cd "$SAST_SRC" && git pull && <rerun cp> 等同於 npx sast-skills update。
CLI 命令
| 指令 | 功能 |
|---|---|
npx sast-skills install | 將 CLAUDE.md / AGENTS.md 和技能樹複製到你的專案或 $HOME |
npx sast-skills update | 使用當前綑綁的技能檔案重新整理現有安裝 |
npx sast-skills uninstall | 移除已安裝技能;未經 --force 參數會拒絕刪除修改過的 CLAUDE.md |
npx sast-skills doctor | 驗證安裝並報告每個檔案的 OK / MISSING / MODIFIED 狀態;有問題時結束碼非零 |
npx sast-skills export --input sast/ --format sarif --output report.sarif | 將 sast/*-results.json 彙整為 JSON、SARIF 2.1.0 或 HTML |
npx sast-skills export --input sast/ --triaged --format sarif | 優先使用審核後的 sast/triaged.json 而非原始的各技能結果 |
npx sast-skills --version | 列印已安裝的 CLI 版本 |
安裝時參數
| 標誌 | 用途 |
|---|---|
--yes | 非互動模式;當 stdin 不是 TTY 時必須使用 |
--assistant <claude|agents|all> | 要安裝哪個技能樹 |
--scope <project|global> | 安裝到 ./.claude/skills/ 或 $HOME/.claude/skills/ |
--target <path> | 明確的安裝目標 (覆蓋 --scope) |
--force | 覆蓋預先存在的 CLAUDE.md / AGENTS.md |
--dry-run | 顯示檔案計劃但不進行寫入 |
執行掃描
安裝後,在 AI 助手中開啟專案並要求:
執行漏洞掃描
或
在此程式碼庫中尋找漏洞
編排器會接手。它會自動執行所有四個階段,遵循冪等性 (重新執行只會處理遺漏的部分),並將所有內容寫入專案根目錄的 sast/ 目錄。
輸出檔案
| 檔案 | 描述 |
|---|---|
sast/architecture.md | 技術棧、架構、入口點、資料流 |
sast/*-results.md | 各漏洞類別的發現結果 (人類可讀) |
sast/*-results.json | 標準機器可讀發現結果 (提供給 sast-skills export) |
sast/final-report.md | 按嚴重性排序的合併原始報告 |
sast/final-report-triaged.md | 審核後的報告 — 假陽性已移除,嚴重性已根據證據調整 |
sast/triaged.json | 標準審核後發現結果 (sast-skills export --triaged 偏好使用) |
發現結果結構
每個技能會將 sast/<skill>-results.json 寫入為純粹的發現結果列表:
{
"findings": [
{
"id": "sast-sqli-0001",
"skill": "sast-sqli",
"severity": "critical|high|medium|low|info",
"title": "/api/user 中的 SQL 注入",
"description": "…",
"location": { "file": "src/api/user.js", "line": 42, "column": 10 },
"remediation": "…"
}
]
}
sast-skills export 會將這些檔案彙整到一個包裝在 run 信封中的文件 — { "run": { "tool": "sast-skills", "version": "<cli-version>" }, "findings": [...] } — 並蓋上產生報告的 CLI 版本戳記。審核步驟會以相同的信封結構寫入 sast/triaged.json。
審核後的發現結果會加入 triage_status (confirmed|upgraded|downgraded|false_positive)、triage_original_severity (當嚴重性改變時) 和 triage_evidence,其中包含具體的程式碼庫引用。
CI 整合
GitHub Code Scanning (SARIF)
位於 .github/actions/scan/action.yml 的複合動作:
- uses: mstfknn/sast-skills/.github/actions/scan@main
with:
input: sast/
output: sast-skills.sarif
這會執行 sast-skills export --format sarif 並透過 github/codeql-action/upload-sarif@v3 將結果上傳至 Code Scanning。
Pre-commit 鉤子
將 hooks/pre-commit 複製到 .git/hooks/pre-commit,讓 sast-skills doctor 在每次提交前進行檢查。
Docker
docker build -t sast-skills .
docker run --rm -v "$PWD:/work" sast-skills export --input sast/ --format sarif --output report.sarif
綑綁的 Dockerfile 基於 node:20-alpine,並將 sast-skills 設為入口點。
驗證與除錯
# 安裝是否符合預期形狀?
npx sast-skills doctor --target . --assistant claude
# 版本檢查
npx sast-skills --version
npm view sast-skills version # 註冊表上的最新版本
# 升級
npx sast-skills update
如果目標中的每個綑綁檔案都與已安裝版本的副本相符,doctor 結束碼為 0;如果任何檔案是 MISSING 或 MODIFIED,則結束碼為 1。MODIFIED 表示檔案與綑綁副本不同 — 如果你編輯了入口檔案則屬預期情況,否則表示需要執行 update。
貢獻
請參閱 CONTRIBUTING.md。開發流程:
npm install
npm test # vitest 套件 (啟用 TDD 防護)
npm run sync # 將 .claude/skills 鏡像到 .agents/skills
node scripts/scaffold-skill.js sast-foo # 在兩個樹中建立新技能存根
node scripts/register-skill.js sast-foo foo "Foo" "Foo 注入描述"
npm run lint:md # markdownlint
…
[為翻譯而截斷]