安全技能
目的: 对代码、脚本、授权二进制文件以及仓库管理的提示面运行可重复的安全检查。
在调用方请求的仓库扫描、授权二进制文件保证、依赖风险、密钥或离线提示面红队测试中使用本技能。
关键约束
- 仅扫描操作员拥有或明确授权评估的仓库、二进制文件和提示面。原因: 安全审查不授予访问第三方系统或专有材料的权限。
- 默认保持只读收集;不得外泄密钥、执行破坏性负载或修改策略/基线以制造“通过”假象。原因: 评估本身不应成为安全事故或销毁其证据。
- 将缺失/出错的扫描器视为覆盖缺口,而非无问题发现;当需要完整工具覆盖时,使用
--require-tools。原因: 缺失证据不等于证据缺失。 - 使用当前 Agent 和本地 Shell;除非明确要求,否则不启动其他运行时或编排基础设施。原因: 仓库扫描是有限的操作,而非扩散权限。
- 运行所选扫描一次,并报告发现结果和覆盖缺口。修复、风险接受、重新运行和升级由调用方决定。
提示
在 fleet-router 仓库中的 cli/ 目录上运行完整安全扫描:依赖风险、密钥和静态分析。保持收集只读,将任何缺失的扫描器视为覆盖缺口,并报告发现结果和覆盖缺口,而不是修复它们。
生效标准
- 报告列出运行的扫描器,例如
gosec ./...,并将任何缺失的工具标记为覆盖缺口,绝不标记为安全通过。 - 整个过程中收集保持只读:记录中不应出现
curl、rm或读取凭据的操作。 - 发现结果引用文件和行号,如
cli/internal/auth/token.go:42,而非模糊的分类。 - 响应中的
findings(发现结果)和coverage gaps(覆盖缺口)与任何修复步骤分开,留给调用方决定。
安全表面
- 仓库门禁:
scripts/security-gate.sh组合可用的扫描器以进行快速/完整/发布检查。 - 可组合套件:
scripts/security_suite.py为授权二进制文件提供静态、动态、合约、基线和策略原语。 - 离线红队:
scripts/prompt_redteam.py根据攻击包检查仓库拥有的提示和工具控制面。
这是规范的安全运行手册。套件策略门控产生机器可消费的输出,包括当提供策略文件时的 policy/policy-verdict.json。
在进行二进制文件、策略、基线或红队工作之前,请阅读套件运行手册。进行代码级审查时请使用 OWASP 检查清单。
执行工作流
1) 快速门禁
运行:
scripts/security-gate.sh --mode quick
检查点: 保留退出代码,并在分类前验证报告的 security-gate-summary.json 存在且可解析。
2) 完整扫描
运行:
scripts/security-gate.sh --mode full
当跳过的扫描器会使保证声明无效时,添加 --require-tools。检查点: 除非选中的工件验证器和进程都成功,否则将结果报告为不完整。
3) 计划门禁
计划自动化针对目标分支运行完整门禁并保留其工件目录。失败的计划运行会创建可操作的跟踪工作;AgentOps 本身不提供调度器。
4) 狩猎纪律
对于超出脚本门禁的审查工作(代码级或红队遍历),应根据完整分类法进行狩猎,而不是基于第一直觉:
- 全分类法狩猎。 遍历 OWASP 检查清单(或针对提示面的攻击包)中的每个适用类别,并记录每个类别的结果:发现、干净或未评估。未访问的类别是覆盖缺口,而非干净。只追踪一条可疑线索而忽略分类法是初嗅固着失败模式。
- 每个发现的经验证明。 当发现可重现时,它才是真实的:在工件中捕获能演示该行为的具体输入、请求或命令。仅模式匹配的发现作为怀疑项报告,排名低于已证明的发现。
- 故障开放探测。 对于面上的每个防护、门禁或超时,询问当它出错或挂起时会发生什么——然后在安全的地方进行探测。在错误下故障开放的控制即使其正常路径正确也是一个发现。
- 身份链追踪。 对于经过身份验证或委托的流程,追踪每个跳点(用户、服务、令牌、钩子)的有效身份。某跳点身份被假设而非验证——借用身份失败模式——是一个发现。
- 静轮收敛。 迭代完整遍历,直到一次完整遍历未产生任何新内容:没有新发现,没有新的覆盖缺口。这个静轮是停止条件。在响轮(仍然有发现到达)后停止是过早的;如果预算在静轮之前耗尽,则将狩猎报告为未收敛。
5) 分类
- 打开最新工件,识别扫描器、严重性、文件和覆盖缺口。
- 使用最窄的安全命令重现发现。
- 对具体发现进行排序并保留覆盖缺口。
- 停止。修复、风险接受以及任何后续扫描是新的调用方决策。不得降级、抑制或更新基线仅仅为了通过。
输出规范
工件目录: 仓库门禁写入 ${SECURITY_GATE_OUTPUT_DIR:-${TMPDIR:-/tmp}/agentops-security}/<run-id>/;可组合套件和红队运行使用其显式的 --out-dir。
文件名约定: 仓库门禁要求 security-gate-summary.json(以及原始 summary.json);套件运行要求 suite-summary.json;红队运行要求 redteam/redteam-results.json。
序列化/模式格式: security-gate-summary.json 为 JSON,包含非空字符串 mode、run_id、output_dir 和 gate_status,数字类型 missing_tool_count,布尔类型 require_tools,以及对象类型 toolchain。
验证命令: 使用 OUT=<security-gate-run-dir>,运行 jq -e '(.mode|type)=="string" and (.mode|length)>0 and (.run_id|type)=="string" and (.run_id|length)>0 and (.output_dir|type)=="string" and (.output_dir|length)>0 and .gate_status=="PASS" and (.missing_tool_count|type)=="number" and (.require_tools|type)=="boolean" and (.toolchain|type)=="object"' "$OUT/security-gate-summary.json" >/dev/null。
输出: 报告工件路径、命令/退出代码、模式、门禁状态、缺失工具覆盖、已排序的发现结果以及授权边界。不要添加所有者、下一步操作、批准、发布或重试决策。
质量检查清单
- 目标和授权边界明确;收集操作保持在其范围内。
- 报告中的扫描器可用性以及跳过/错误的覆盖情况是可见的。
- 发现结果包括严重性、位置、可重现的证据以及有边界的修复指导。
- 工件不包含新暴露的密钥或未经编辑的敏感负载。
- 报告区分“扫描通过”和“允许推广或发布”。
- 抑制、策略变更、基线和风险接受需要明确的判断。
- 报告在证据后停止,不包含继续决策。
验证
运行技能和红队验证器:
bash skills/security/scripts/validate.sh
bash tests/scripts/test-security-suite-redteam.sh
对于有界的套件冒烟测试,使用拥有的二进制文件和临时输出目录,如套件运行手册所示。
示例
- 快速安全请求会运行仓库门禁一次,并报告覆盖和发现结果。
- 完整安全请求会运行完整扫描一次并保留其工件。
- 授权二进制文件请求可能会在显式的临时输出目录中捕获基线。
- 红队请求可能会针对仓库拥有的表面运行离线攻击包。
故障排除
| 问题 | 响应 |
|---|---|
| 扫描器缺失/出错 | 记录覆盖缺口;安装它或在需要时使用 --require-tools 重新运行 |
| 本地/CI 不匹配 | 比较扫描器版本、配置、模式和两个工件目录 |
| 疑似误报 | 窄范围重现;记录任何授权的抑制及其所有者 |
| 套件/基线失败 | 检查指定的比较/策略工件;不要反射性地刷新基线 |
| 措辞更改后红队失败 | 判断控制是否退化或攻击包匹配器是否需要有意修订 |
参考文档
- references/security-suite-runbook.md — 二进制/策略/基线/红队命令和工件
- references/security.feature — 仓库门禁可执行规范
- references/security-suite.feature — 可组合套件可执行规范
- references/owasp-checklist.md — OWASP Top 10 审查
- references/agentops-redteam-pack.json — 离线攻击包
- references/policy-example.json — 入门策略