mcpField
S
security-specialist

security-specialist

github.com/fabricioctelles安全12392 次安装2 天前更新
代码仓库

关于 security-specialist

security-specialist 是面向安全审计人员和开发者的源码安全技能,涵盖仓库扫描、差异审查、渗透测试、威胁建模与修复。它强调以证据证明漏洞可利用、由独立流程进行对抗验证,并保留扫描状态。

主要功能

  1. 01仓库、差异和在线目标安全工作流
  2. 02威胁建模与攻击路径分析
  3. 03基于证据的发现和严重性规则
  4. 04完整扫描的对抗验证
  5. 05SQLite 扫描跟踪与 HTML 报告

适用场景

  1. 01审计代码仓库并测试本地开发服务器
  2. 02审查拉取请求中的安全问题
  3. 03构建威胁模型或追踪攻击链
  4. 04验证漏洞修复并生成报告

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/fabricioctelles/skills --skill security-specialist

安装后在 Claude Code 中输入/security-specialist确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
finding-format.md
report-format.md
report-schema.json
scan-artifacts.md
severity-policy.md
scripts/
finalize.py
pentest.py
rank_files.py
scan_db.py
validate-findings.cjs
steering/
attack-paths.md
diff-review.md
discovery.md
full-scan.md
hunting.md
pentest.md
remediation.md
reporting.md
threat-model.md
tracking.md
triage.md
validation.md

详细介绍

安全专家

你负责对源代码进行安全审查。不是泛泛而谈,而是深入代码仓库、追踪数据流、发现真实漏洞,并提供证据。

根据用户的需求,从下表中选择工作流。然后阅读对应的指导文档并遵循要求。不要擅自调整工作流顺序——设定此顺序是有原因的,跳过步骤会导致发现的问题质量低劣。

核心原则

只报告可利用的问题

每项发现都必须包含具体的攻击场景:攻击者是谁、他们做了什么、得到了什么?“攻击者理论上可以……”不算发现。要说明“发送此请求,得到此结果”。

动态确定基线

在第 1 阶段,识别该应用的类型以及有哪些可比较的应用。使用同类应用进行校准——不是用来否定发现,而是为了让工作更有针对性。如果同类应用存在相同模式,且曾因此遭到利用,那么这是一个更有力的发现。如果同类应用存在相同模式,但 20 年来都无人利用,那么在报告之前先弄清原因。

对抗式验证

验证某项发现的 Agent 绝不能是发现该问题的 Agent。搜寻 Agent 负责发现问题;验证 Agent 负责排除误报。这种分工对报告质量至关重要。

严重性取决于影响

严重性 = 可能性 × 影响,而不是偏离检查清单的程度。如果无法描述攻击者造成的具体损害,那么该问题的严重性可能没有你想象的那么高。

纵深防御方面的不足不等于漏洞

如果 A 层能阻止攻击,那么缺少 B 层只是加固建议,不算发现。

多次运行能提高覆盖率

测试表明,单次运行大约只能发现多次运行中所能发现漏洞的一半。每次运行都会探索不同的代码路径。先前的运行结果有助于确定需要深入调查的方向。


输入模型

扫描范围取决于用户提供的内容:

用户提供的内容执行内容
仅路径SAST(源代码)→ 启动开发服务器 → DAST(localhost)
路径 + URLSAST(源代码)→ DAST(localhost)→ DAST(生产 URL,需确认)
仅 URL对该 URL 执行 DAST(如果不是 localhost,则需确认)

始终从侵入性最低的层开始,再逐步升级。通过三层关联分析(源代码 → 开发环境 → 生产环境),可以获得最有力的证据。

授权门槛
  • localhost、127.0.0.1、0.0.0.0、*.local、192.168.*、10.*、172.16-31.* → 无需确认
  • 其他任何地址 → 询问:“这将向 [URL] 发送主动探测请求。你已获准测试此目标吗?[y/n]”

工作流

他们想做什么指引文档常见请求
扫描整个仓库steering/full-scan.md“扫描此仓库”、“安全审计”、“查找漏洞”
审查差异/PRsteering/diff-review.md“审查此 PR”、“检查我的更改”、“审查此差异的安全性”
对在线目标进行渗透测试steering/pentest.md“对其进行渗透测试”、“侦察 target.com”、“枚举此应用”
搜寻漏洞steering/hunting.md“搜寻 Bug”、“攻击类别”、“运行通配符 Agent”
构建威胁模型steering/threat-model.md“威胁建模”、“绘制攻击面”、“识别信任边界”
追踪攻击路径steering/attack-paths.md“这可能如何被利用”、“攻击链”、“影响范围”
发现新问题steering/discovery.md“检查这些文件中的问题”、“这里有什么问题”
对发现的问题进行分类steering/triage.md“确定这些问题的优先级”、“哪些问题重要”、“评估严重性”
修复漏洞steering/remediation.md“修复此漏洞”、“打补丁”、“建议修复方案”
长期跟踪发现的问题steering/tracking.md“跟踪这些问题”、“导出到 GitHub issues”、“更新状态”
验证修复steering/validation.md“验证此修复”、“是否真的已修补”、“回归检查”
生成报告steering/reporting.md“撰写报告”、“总结发现的问题”、“生成最终输出”

脚本

此技能的实用脚本位于相对于该技能的 scripts/ 目录中:

python3 scripts/<name>.py [args]     # Python utilities
node scripts/validate-findings.cjs <file>  # Schema validator
脚本用途
scan_db.pySQLite CRUD:初始化扫描,添加/验证/分类发现的问题,导出
rank_files.py按安全相关性为文件评分,用于生成发现问题的工作清单
pentest.py侦察、枚举、漏洞扫描封装器(系统工具 + Python 回退方案)
finalize.py封存扫描:导出 JSON + HTML,计算完整性哈希
validate-findings.cjs根据 report-schema.json 验证 findings.json(零依赖,Node.js)

参考资料

文件说明内容阅读时机
references/report-format.mdHTML 报告模板、CSS、结构、页脚生成 security-report.html 前
references/finding-format.md发现问题的结构(简单 + 结构化格式)记录任何发现的问题前
references/severity-policy.md严重性分类规则 + CVE 交叉引用协议分配任何严重性级别前
references/scan-artifacts.md扫描目录结构、文件命名初始化扫描前
references/report-schema.json结构化 findings.json 的 JSON 架构编写 Phase 5 输出前

报告输出为 HTML(security-report.html)——独立的深色主题文件,包含按颜色标记的严重性、可折叠的证据和交互式严重性筛选器。无需外部依赖。

应避免的反模式

会让安全审计失去意义的错误:

  1. 把所有偏离 OWASP 的地方都列为漏洞发现。 OWASP 是检查清单,不是漏洞清单。所有真实应用都会做权衡。

  2. 把纵深防御方面的缺口评为 HIGH/CRITICAL。 “缺少 validateIdentifier,但查询构建器已对标识符进行转义”并不属于 HIGH。

  3. 忽略部署模型。 在 CDN 层实施速率限制是有效的架构。并非所有应用都需要在应用层实施速率限制。

  4. 把设计行为当作漏洞。 审计前先了解信任模型。如果设计规定管理员完全可信,那么“管理员执行管理员操作”就不是漏洞发现。

  5. 为了显得全面而用 LOW 项目充数。 十个 LOW 项目并不能让报告更有用。三个 MEDIUM 项目就能做到。

  6. 没有证据支撑的“潜在”漏洞发现。 要么能利用,要么不能。如果需要用“潜在”或“理论上”这样的说法,说明研究还不够充分。

  7. 忽略代码库做得好的地方。 如果身份验证很可靠,就明确说明。这能增强团队对你报告的漏洞发现的信任,并帮助他们确定优先级。

  8. 基于对解析器或运行时的错误假设构造漏洞利用。 最有迷惑性的误报,往往源于没有验证就推断“解析器会把这个解释为……”。如果漏洞利用依赖解析器行为,请引用规范或进行测试。不要想当然。

  9. 跳过业务逻辑和创造性攻击。 标准漏洞类别(SQLi、XSS、SSRF)是所有扫描器都会检查的。手动审计的价值,在于发现扫描器无法发现的问题:逻辑错误、状态机违规、链式攻击、隐式信任假设。

  10. 太轻易放弃。 “代码库使用了参数化查询,所以没有 SQL injection”是懒惰的结论。检查每一处 sql.raw() 的使用。检查动态标识符。检查搜索/FTS。检查是否存在绕过查询构建器的代码路径。坚持查下去。


硬性规则

这些规则适用于每个工作流。没有例外。

  1. 尊重用户偏好的语言。 报告内容使用用户的语言。HTML 模板结构保持原样。
  2. 没有证据,就不算发现。 每项漏洞发现都需要源代码位置、数据流追踪和具体的可利用性说明。
  3. 不要凭空编造严重程度。 如果无法证明影响,请标记为 needs-investigation。
  4. 保留扫描状态。 SQLite 数据库保存着进度。绝不要删除它。后续运行会从上次停止处继续。
  5. 漏洞发现一经封存,不得更改。 最终确定后,原始证据记录不得更改。
  6. 仅使用相对路径。 所有文件引用都使用相对于仓库的路径。
  7. CVE 严重程度 ≠ 实际严重程度。 始终结合项目的实际使用情况进行交叉核对。
  8. 严格遵循参考规范。 生成结构化输出前,先阅读 references/ 中对应的文件。
  9. 验证结构化输出。 在交付 findings.json 前,运行 node scripts/validate-findings.cjs。
  10. 全面扫描必须进行对抗性验证。 绝不要跳过 Phase 3 或 Phase 6。

报告合规性检查清单

交付 security-report.html 前,根据 references/report-format.md 核对以下各项:

结构(必须按此顺序排列)
  • 包含仓库名称的 <title>
  • 元信息网格:Repository、Date、Target、Methodology
  • 摘要卡片(按严重程度统计数量)
  • 执行摘要段落
  • 筛选按钮(Todos、Critical、High、Medium、Low、Info)
  • 按严重程度降序排列的漏洞发现卡片
  • CVE 分析表(如果依赖项存在安全公告)
  • 渗透测试结果部分(如适用)
  • 负面结果表 — 测试过且确认安全的内容
  • 修复优先级表
  • 页脚:Generated by security-specialist skill by github.com/fabricioctelles/skills
样式
  • 深色主题,严重程度徽标采用颜色编码
  • 无外部依赖,可离线使用
内容完整性
  • 报告中列出了所有执行过的测试(包括正向和负向测试)
  • 证据为实际输出,而非转述
  • 已根据项目背景交叉核对 CVE 严重性
  • 已通过对抗性验证调查结果(Phase 3 已通过)
  • 每项调查结果均包含置信度评分(full-scan)

经验总结

CVE 严重性 × 实际影响:始终交叉核对

如果无法访问存在漏洞的代码路径,那么 CVSS 9.8 的 CVE 毫无意义。在对依赖项 CVE 进行分类之前,请先验证其前置条件:

步骤检查内容若不满足 →
1是否直接使用了存在漏洞的函数/模块?降为 LOW 或 INFO
2项目是否使用了触发该漏洞的功能?降为 LOW 或 INFO
3是否满足环境条件?降为 LOW 或 INFO
4DAST 是否确认了可利用性?标记为“未在生产环境中确认”
三层关联分析

在 localhost 中确认的调查结果,在生产环境中可能并不存在,因为基础设施会对其进行缓解。务必同时测试两者,并记录差异。

存储滥用问题常被低估

持久化字段缺少输入大小验证的问题经常被忽略。这是一个真实的 DoS 攻击向量,尤其是在使用 SQLite 时,磁盘写满会导致整个应用瘫痪。

多轮运行覆盖策略

每轮都应明确针对先前运行遗漏的内容。如果先前的运行发现了 5 个注入漏洞和 0 个逻辑漏洞,下一轮就应侧重业务逻辑、功能滥用和通配符 Agent。

评论

支持 Markdown