用途
本技能用于安全测试工作流的报告合成阶段。在集群 1-4 的扫描技能全部运行并各自产出 Findings 文件后,本技能将这些分散的结果合并为一份统一、去重、按严重程度组织的漏洞报告。典型一次测试会产生八到二十个发现文件,而客户需要的是单一报告。
主要能力
- 读取发现结果:默认读取
engagement/findings/*.json和engagement/findings/*.jsonl,也支持通过--source FILE(可重复)指定具体文件。 - 去重:依据
lib/finding.py中定义的规范化指纹去重,而非依赖标题匹配。 - 分组:按严重程度分组,章节顺序为 CRITICAL、HIGH、MEDIUM、LOW、INFO。
- CVSS v3.1 补充:当发现中缺少 CVSS 向量时,使用基于严重程度与类别的确定性启发式补充,并在输出中明确标注“derived, not assigned by NVD”。
- 生成报告:输出独立的 Markdown 漏洞报告,包含头部、摘要表、分严重程度章节及逐条发现子章节。每条发现带有稳定锚点(指纹),便于后续工具交叉引用。
- 运营性发现:该技能自身也会产出 JSON/JSONL/Markdown 格式的运营发现,记录解析失败、缺少字段、重复、空文件、报告成功生成等情况。
使用方式
基本命令:
python3 ./scripts/compose_report.py engagements/acme-2026-q2/
可用选项:
--source FILE 指定发现文件(可重复;覆盖默认 glob)
--report-output FILE 报告输出路径(默认 PATH/reports/vulnerability-report.md)
--engagement-id ID 覆盖测试 ID(默认从 PATH/roe.yaml 解析)
--output FILE 运营性发现输出
--format FMT json | jsonl | markdown(默认 markdown)
--min-severity SEV 过滤报告,仅保留该严重程度及以上的发现
--include-info 在报告中包含 INFO 严重程度的发现(默认省略)
示例:
- 结束报告:
python3 ./scripts/compose_report.py engagements/acme-2026-q2/ --report-output engagements/acme-2026-q2/reports/vulnerability-report.md - 中期报告(仅 HIGH 与 CRITICAL):
--min-severity high - OWASP 映射后重新生成:使用
--source指向已补充 OWASP 类别的文件重新运行,报告每条发现的子章节将包含 OWASP 标签。
验证:可用 --format json --output /tmp/compose-findings.json 导出后配合 jq 检查;若报告引用了预期外的发现,可通过其 skill_id + target 追溯到来源文件。
适用场景
- 一次测试的最终交付报告合成。
- 测试过程中的中期报告(配合
--min-severity)。 - 在 OWASP 映射等后续处理完成后重新生成报告。
- 供后续的摘要与 OWASP 映射技能(集群 6 的后续两个技能)作为输入。
前提条件
- Python 3.9+
- 一个或多个由集群 1-4 扫描技能产出的 JSON 或 JSONL 发现文件(共享
lib/finding.pyschema)。
限制与错误处理
- PATH 缺失或为空:输出 CRITICAL 运营性发现,退出码 1。
- 来源文件无法解析:输出 HIGH 运营性发现,跳过该文件,继续处理其余文件。
- 未找到发现文件:输出 HIGH 运营性发现,退出码 1。
- 报告输出路径不可写:输出 HIGH 运营性发现,退出码 1。
- 发现缺少必需字段(title、severity、target、detail、remediation):输出 HIGH 运营性发现,从报告中省略该记录,继续处理。
- CVSS 向量由启发式派生,并非 NVD 正式分配。
资源
references/THEORY.md:漏洞报告结构历史(NIST SP 800-115、OWASP Testing Guide)、CVSS v3.1 向量构成、严重程度评分权衡(CVSS vs intrinsic vs EPSS)、发现去重理论、为何基于指纹的去重优于基于标题。references/PLAYBOOK.md:面向不同受众的报告模板变体(技术、管理层、合规)、逐条发现的修复措辞模式、分发报告的证据脱敏模式、与 OWASP 映射及摘要技能的交叉引用协议。