关于 commit-security-scan
commit-security-scan 是用于审查提交、PR 和差异的安全扫描技能,面向代码审查与提交前检查。它结合仓库威胁模型,按 STRIDE 分析并生成安全发现报告。
主要功能
- 01扫描提交、PR 和代码差异
- 02按 STRIDE 检查漏洞
- 03结合仓库威胁模型
- 04评估严重性与置信度
- 05生成 JSON 发现报告
适用场景
- 01审查 PR 中的安全风险
- 02提交前扫描暂存改动
- 03比较分支或提交范围
- 04检查最近提交的漏洞
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ factory-ai/ factory-plugins --skill commit-security-scan安装后在 Claude Code 中输入/commit-security-scan确认已加载。
附带文件analysis-examples.md
详细介绍
提交安全扫描
使用 LLM 推理分析代码变更(提交、PR、差异),以检测安全漏洞。此技能会直接读取代码,并应用仓库威胁模型中的模式,识别所有 STRIDE 类别中的问题。
何时使用此技能
- PR 审查 - 对拉取请求进行自动安全扫描
- 提交前检查 - 提交前扫描暂存的变更
- 分支比较 - 审查功能分支变更的安全性
- 代码审查协助 - 帮助审查者发现安全问题
前置条件
此技能需要:
- 威胁模型 - 必须存在
.factory/threat-model.md - 安全配置 - 用于设置严重性阈值的
.factory/security-config.json
重要:如果这些文件不存在,必须先生成它们,然后再进行安全扫描。
生成前置条件文件:
- 告诉用户:“威胁模型尚不存在。我会先生成它,然后再开始扫描。”
- 运行
threat-model-generation技能以创建这两个文件 - 完成后,继续进行安全扫描
不要要求用户手动运行此技能——应在此工作流中自动执行。
输入
此技能根据用户的请求确定扫描内容:
| 扫描类型 | 指定方式 | 示例 |
|---|---|---|
| PR | “扫描 PR #123” | Scan PR #456 for security vulnerabilities |
| 提交范围 | “扫描提交 X..Y” | Scan commits abc123..def456 |
| 单个提交 | “扫描提交 X” | Scan commit abc123 |
| 暂存的变更 | “扫描暂存的变更” | Scan my staged changes for security issues |
| 未提交的变更 | “扫描未提交的变更” | Scan working directory changes |
| 分支比较 | “扫描从 X 到 Y 的变更” | Scan changes from main to feature-branch |
| 最近 N 个提交 | “扫描最近 N 个提交” | Scan the last 3 commits |
如果未指定范围,请提示用户进一步说明。
说明
按顺序执行以下步骤:
步骤 1:验证前置条件(缺少时自动生成)
尝试读取以下文件:
.factory/threat-model.md.factory/security-config.json
如果任一文件缺失或无法读取:
- 告知用户:“安全威胁模型尚不存在。我会先生成它——这可能需要一分钟。”
- 调用
threat-model-generation技能来分析仓库并创建这两个文件 - 生成完成后,继续执行步骤 2
这样可以确保安全扫描始终拥有准确分析所需的威胁模型上下文。
步骤 2:获取变更文件
根据用户的请求,使用 git 获取变更文件列表及其差异:
- 对于 PR:使用
gh pr diff - 对于提交或范围:使用
git diff或git show - 对于暂存的变更:使用
git diff --cached
读取每个变更文件的完整内容以获取上下文。
步骤 3:加载威胁模型
读取 .factory/threat-model.md 和 .factory/security-config.json,以了解:
- 系统架构和信任边界
- 此代码库中已知的漏洞模式
- 发现问题的严重性阈值
步骤 4:分析漏洞
针对每个变更文件,系统地检查 STRIDE 威胁:
S - 身份欺骗
- 缺少或薄弱的身份验证检查
- 会话处理漏洞
- 代码中暴露令牌或凭据
- 不安全的 Cookie 设置
T - 数据篡改
- SQL 注入:在 SQL 查询中进行字符串拼接或插值
- 命令注入:在 Shell 命令、
eval()、exec()中使用用户输入 - XSS:在 HTML/模板中未转义的用户输入
- 批量赋值:将请求数据盲目赋值给模型
- 路径遍历:文件路径中使用未经验证的用户输入
R - 否认
- 缺少对敏感操作的审计日志记录
- 错误日志记录不足
- 日志注入漏洞
I - 信息泄露
- IDOR:直接访问对象时未验证所有权
- 详细的错误消息泄露内部信息
- 硬编码的密钥、API 密钥、凭据
- 日志或响应中包含敏感数据
- 暴露调试端点
D - 拒绝服务
- 端点缺少速率限制
- 资源消耗无上限(文件上传、查询)
- 算法复杂度攻击(正则表达式、排序)
- 列表端点缺少分页
E - 权限提升
- 端点缺少授权检查
- 可绕过角色/权限
- 通过操纵参数提升权限
步骤 5:评估每项发现
对于每个潜在漏洞:
-
追踪数据流:从来源到接收点追踪用户输入
- 输入来自哪里?(请求参数、请求体、请求头、文件)
- 输入是否经过验证/净化?
- 输入最终到达哪里?(数据库、Shell、响应、文件系统)
-
检查是否已有缓解措施:
- 代码库其他位置是否进行了验证?
- 是否有中间件/装饰器保护这段代码?
- 框架是否提供自动防护?
-
确定严重程度:
- CRITICAL:远程代码执行、身份验证绕过、数据泄露
- HIGH:SQL 注入、XSS、IDOR、权限提升
- MEDIUM:信息泄露、缺少安全响应头
- LOW:违反最佳实践、轻微问题
-
评估置信度:
- HIGH:存在明确的易受攻击模式、数据流直接、没有缓解措施
- MEDIUM:可能存在漏洞,对上下文有些不确定
- LOW:存在可疑模式,但可能有我们无法看到的缓解措施
步骤 6:生成报告
按照以下结构创建 security-findings.json:
{
"scan_id": "scan-YYYY-MM-DD-XXX",
"scan_date": "<ISO 8601 timestamp>",
"scan_type": "pr|commit|range|staged|working",
"commit_range": "<base>..<head>",
"pr_number": null,
"threat_model_version": "<from security-config.json>",
"findings": [
{
"id": "VULN-001",
"severity": "HIGH",
"stride_category": "Tampering",
"vulnerability_type": "SQL Injection",
"cwe": "CWE-89",
"file": "src/api/users.py",
"line_range": "45-49",
"code_context": "<vulnerable code snippet>",
"analysis": "<explanation of why this is vulnerable>",
"exploit_scenario": "<how an attacker could exploit this>",
"threat_model_reference": "Section 5.2 - SQL Injection",
"existing_mitigations": [],
"recommended_fix": "<how to fix the vulnerability>",
"confidence": "HIGH",
"reasoning": "<why this confidence level>"
}
],
"summary": {
"total_findings": 0,
"by_severity": { "CRITICAL": 0, "HIGH": 0, "MEDIUM": 0, "LOW": 0 },
"by_stride": {
"Spoofing": 0,
"Tampering": 0,
"Repudiation": 0,
"InfoDisclosure": 0,
"DoS": 0,
"ElevationOfPrivilege": 0
},
"files_analyzed": 0
}
}
步骤 7:报告结果
- 将发现保存到
security-findings.json - 向用户报告摘要(按严重程度统计发现数量、已触发的阈值)
- 检查
security-config.json中的严重程度阈值,并注明是否有任何阈值已触发
CWE 参考
常见发现的 CWE 映射:
| 漏洞类型 | CWE |
|---|---|
| SQL 注入 | CWE-89 |
| 命令注入 | CWE-78 |
| XSS(反射型) | CWE-79 |
| XSS(存储型) | CWE-79 |
| 路径遍历 | CWE-22 |
| IDOR | CWE-639 |
| 缺少身份验证 | CWE-306 |
| 缺少授权 | CWE-862 |
| 硬编码凭据 | CWE-798 |
| 敏感数据暴露 | CWE-200 |
| 批量赋值 | CWE-915 |
| 开放重定向 | CWE-601 |
| SSRF | CWE-918 |
| XXE | CWE-611 |
| 不安全反序列化 | CWE-502 |
调用示例
扫描 PR:
Scan PR #123 for security vulnerabilities
提交前扫描暂存的更改:
Scan my staged changes for security issues
扫描功能分支:
Scan changes from main to feature/user-auth for vulnerabilities
扫描近期提交:
Scan the last 5 commits for security issues
参考资料
- 分析示例:
analysis-examples.md(位于此技能目录中) - 威胁模型:
.factory/threat-model.md - 安全配置:
.factory/security-config.json - OWASP Top 10
- CWE Top 25
评论
支持 Markdown