来源说明:本文依据 Awesome QA Skills 的 Secrets-Exposure Review Prompt 和 Skill 整理;“最佳实践”部分将其中的证据、授权和关闭要求归纳成检查清单,具体判断仍以项目策略为准。
密钥不出现在源码里,也可能泄露。配置快照、调试日志、崩溃报告、构建产物和复制的环境文件都会形成不同暴露路径。
为什么需要这个 Skill
敏感信息暴露审查 Skill 用有证据边界的方式检查密钥在哪里、如何流转、日志暴露了什么、哪些配置边界重要,以及是否有轮换证据。
Skill 用来做什么
复核结果应指出下一步安全检查,同时避免扩大信息暴露。
当你要用脱敏材料复核服务或流水线时,使用这个 Skill。它识别暴露风险和验证动作,不会登录、调用真实 API、读取凭证,也不会宣布系统安全。
好的发现需要写清密钥类别、位置或流转、暴露触发、证据状态、影响、优先级、负责人、关闭条件和隔离验证方式。
当凭证要从本地开发进入 CI、准备修改日志、需要限定一次安全事故复核,或轮换是否就绪不清楚时,使用这个 Skill。
它不做什么
敏感信息暴露审查 Skill 可以整理凭证可能暴露的位置、相关证据和下一步动作,但它不能替代:
- 业务或领域负责人对规则、范围和风险的确认。
- 真实环境、账号、数据、日志或运行结果;静态分析不会自动升级为运行证据。
- 发布、合规、生产操作和残余风险接受等授权决定。
- 在输入相互冲突时替团队选择一个未经确认的事实。
它主要检查哪些内容
先沿着配置、流水线、日志和产物盘点敏感信息的位置,再追踪其用途、可见范围与轮换证据:
| 检查关注点 | 开始前要问 | 结果应留下什么 |
|---|---|---|
| 候选暴露路径 | 密钥可能存储、流转或输出在哪里 | 脱敏来源与证据状态 |
| 流转发现 | 密钥如何经过配置或运行时 | 触发与边界 |
| 轮换就绪度 | 什么可以证明替换和回滚安全 | 操作手册、负责人或缺口 |
| 验证动作 | 降低不确定性的安全隔离检查 | 不访问真实凭证 |
如果某一行只有经验判断、没有来源或验证方法,就把它留在待确认项里,不要提前写成通过。
开始之前先审计输入
开始复核候选暴露路径前,先把输入分成六种状态。缺口不会自动变成失败,但也不能被隐藏在结论里。
| 状态 | 含义 | 本 Skill 的处理方式 |
|---|---|---|
| known | 材料直接证明的事实 | 标出来源、版本和时间,允许进入判断 |
| missing | 本轮需要但尚未提供的材料 | 列出最小补证动作,结论保持受限 |
| conflicting | 来源之间互相矛盾 | 并列来源和冲突点,交给负责人裁决 |
| stale | 材料存在但版本或时间已经过期 | 标出新鲜度,不把旧结论当当前事实 |
| out_of_scope | 有关但不在本轮范围内 | 明确排除,避免分析悄悄扩大 |
| assumptions | 为继续分析而暂时采用的假设 | 写出验证方式和失效条件 |
至少把输入版本、范围、环境、证据位置和负责人放在一起。没有运行记录时,只能交付分析、设计或验证计划,不能写执行通过。
从问题到结构化发现
先把来源、范围、证据状态、分析判断、责任角色、动作、关闭条件和验证方式连起来,再写结论。下面的案例保留这个 Skill 的专属编号和领域语境。
分层写法
以“CI 失败日志是否保留 Authorization 请求头”为例,不要把四种判断揉成一句“建议通过”:
| 层次 | 写法 | 本文应用 |
|---|---|---|
| 事实 | 材料直接显示了什么 | 引用来源中的重点、版本、输入或运行记录 |
| 基于证据的推断 | 多个事实共同支持的判断 | 说明推断链,并保留不确定性 |
| 建议 | 下一步最小动作是什么 | 指定补证、复核、执行或回归路径 |
| 人工决策 | 谁需要决定什么 | 由负责人确认范围、风险接受、资源和发布含义 |
一个完整案例
本节按输入、分析、发现、决策和验证展开;材料不足时保留 missing、conflicting 或 assumptions,不把它们改写成通过。
输入
| 材料 | 这次提供什么 | 缺失时的处理 |
|---|---|---|
| 范围与版本 | 服务、仓库、流水线、环境和变更修订 | 未知边界要标出 |
| 脱敏材料 | 配置模板、日志样例、部署清单和密钥引用 | 不要附真实值 |
| 密钥流转 | 创建、注入、使用、记录、异常处理和撤销路径 | 事实与假设分开 |
| 轮换证据 | 负责人、周期、依赖影响、模拟运行和回滚材料 | 没有证明时保持未评估 |
可以这样调用:
请使用 secrets-exposure-review Skill。
任务:复核日志改造期间,支付服务是否可能通过 CI 日志、异常 Trace 或部署配置暴露 API 凭证。
输入材料:[脱敏清单、日志样例、流水线步骤、密钥引用和轮换 runbook]
范围:[staging 与 CI,不使用真实凭证]
限制:[不调用 API、不读取密钥值]
分开已知暴露证据、假设、候选验证、影响、负责人、关闭条件和安全决策边界。
分析
先根据输入、检查矩阵和证据状态整理判断,再进入发现;缺失材料保留为缺口。
发现
聚焦例子:复核日志改造,不要复制凭证
新的异常日志器把请求头写入 CI 失败输出。这个 Skill 应指出 Authorization 请求头可能暴露,追问写入前是否脱敏,并建议在隔离流水线用合成令牌验证。不能索要生产令牌,也不能调用支付供应商。
可将候选项记为 SER-01。下表沿用这个假设场景;真实凭证的有效性、日志保存范围和影响都需要材料确认。
| 字段 | 示例记录 |
|---|---|
| 对象与来源 | CI 失败输出中的 Authorization 请求头;记录流水线版本、日志位置和时间,不复制头部值 |
| 候选类别与指纹 | 认证凭证候选;仅保留脱敏标记或安全指纹,模式匹配不能证明凭证真实或有效 |
| 触发与暴露范围 | 异常路径将请求头写入输出;日志可见范围、保留期限及是否被复制尚待确认 |
| 证据状态 | 本例假设日志器会写入请求头;凭证值、用途和可访问范围仍为 missing / unassessed |
| 下一步动作 | 先确认并限制日志暴露,再由凭证负责人判断是否需要撤销或轮换;检查旧值失效和历史副本处理证据 |
| 安全验证 | 在隔离流水线用合成令牌确认脱敏和失败输出;保存配置版本、原始测试输出与清理记录,不接触真实凭证 |
删除日志文本本身不等于凭证失效,也不能据此宣称暴露已经关闭。是否撤销、轮换以及如何处理历史副本,需要凭证负责人依据暴露证据决定。
复核可以分类脱敏证据并提出安全验证,不能证明没有密钥、漏洞利用成功、修复完成或安全通过。
示例发现:把一次问题写成可交接动作
下面的字段示例只展示记录方式,不代表真实环境已经执行。
假设当前材料不能确认 CI 失败日志是否保留了 Authorization 请求头,可以这样记录发现。它既不替团队补写规则,也不把缺失证据伪装成失败。
| 字段 | 示例写法 |
|---|---|
| 来源与范围 | 记录相关需求、流水线版本、CI 环境和日志保存规则 |
| 发现 | 当前材料不能确认请求头是否在写入前脱敏,也不能确认日志的可见范围 |
| 证据状态 | missing / assumptions;如果来源相互矛盾则改为 conflicting |
| 影响与优先级 | 说明会影响哪个用户、链路或交付决定,不凭感觉扩大等级 |
| 负责人和人工决策 | 由业务、开发、安全或测试负责人确认规则和风险取舍 |
| 动作与关闭条件 | 补齐最小证据;关闭条件是来源、判断和责任人都能复核 |
| 验证 | 指定一次可重复的检查、查询或运行,并保存原始产物 |
这张记录应让接手者能从脱敏位置追到凭证用途和生命周期动作,而不需要查看凭证值。
决策
是否撤销或轮换凭证,以及怎样接受仍保留的历史副本风险,应由凭证负责人根据暴露范围决定。
验证
关闭前按发现中的验证方式执行,并保留原始产物;没有执行记录时,状态仍然保持未验证。
发现如何进入下一阶段
交接产物
| 产物 | 要回答的问题 | 示例状态 |
|---|---|---|
| 候选暴露路径 | 密钥可能存储、流转或输出在哪里 | 脱敏来源与证据状态 |
| 流转发现 | 密钥如何经过配置或运行时 | 触发与边界 |
| 轮换就绪度 | 什么可以证明替换和回滚安全 | 操作手册、负责人或缺口 |
| 验证动作 | 降低不确定性的安全隔离检查 | 不访问真实凭证 |
每条结论都应该能回到来源、证据状态和下一步动作。材料不足时使用 pending、blocked、未评估或 NOT_SCORED,不要用自信填空。
下一步路由
至少交付来源、证据状态、负责人、关闭条件和验证动作;下一阶段的结论仍受证据状态约束。
怎样准备更好的输入
提供脱敏配置、日志样例、流水线步骤、密钥引用名、环境边界、轮换负责人和验证环境。真实值应留在提示词和仓库之外。
交接时至少保留输入版本、范围、时间窗口、证据索引、假设、人工决策边界和最小验证动作。
和其他 Skill 怎么配合
- 安全需求复核:https://inaodeng.com/zh-cn/qaskills/security-requirement-review/;检查安全目标是否可测试。
- 可观测性设计复核:https://inaodeng.com/zh-cn/qaskills/observability-design-review/;检查日志和追踪记录是否保留安全边界。
- 会话安全测试:https://inaodeng.com/zh-cn/qaskills/session-security-testing/;当暴露对象是会话凭证时补充会话边界。
最佳实践
- 优先检查影响大、又难以发现的暴露路径,尤其是涉及敏感数据或高权限的情况。开始前写清服务、环境、版本和时间范围。
- 只使用脱敏材料或合成凭证,遵守最小权限。需要候选验证时,使用隔离环境和可回滚的测试数据;该复核流程不会登录系统、调用真实 API 或读取真实凭证。
- 把事实、基于证据的推断、建议和人工决定分开记录。输入缺失、冲突、过期或包含假设时,都要标明。
- 每条发现都保留可复核的来源、暴露触发、影响、负责人、关闭条件和安全验证方式;没有运行证据时不要写成验证通过。
- 交付前检查结果中没有真实凭证,并写明证据由谁保留、何时清理,以及谁负责轮换决定。
容易踩的坑
- 只搜索字面值,就认为系统安全,忽略派生形式或日志输出。
- 把轮换文档当成所有消费者都能加载新凭证的证明。
- 为了复核完整而请求真实凭证。
安装与调用
npx skills add https://github.com/naodeng/awesome-qa-skills/tree/main/skills/zh/testing-types/secrets-exposure-review
安装说明与排查方式:
- README:https://github.com/naodeng/awesome-qa-skills/blob/main/README.md
- FAQ:https://github.com/naodeng/awesome-qa-skills/blob/main/FAQ.md
- 安装手册:https://github.com/naodeng/awesome-qa-skills/blob/main/scripts/INSTALL_SKILLS.md
请使用 secrets-exposure-review Skill。
提供目标、范围、版本、证据路径、限制和决策边界。
先审计输入,保留证据状态,最后给出负责人、关闭条件和验证方式。
FAQ:常见问题
可以贴真实令牌让复核更准确吗?
不可以。使用脱敏值或合成令牌;真实凭证会增加暴露,而且超出这个 Skill 的边界。
静态扫描干净就代表轮换就绪吗?
不代表。轮换还需要消费者重新加载、撤销、回滚和安全验证路径的证据。
参考
静态计划、文件存在和模拟运行保留原有证据状态,不能变成运行时证明、全部通过结论或发布批准。
- 敏感信息暴露审查提示词(执行契约): https://github.com/naodeng/awesome-qa-skills/blob/main/skills/zh/testing-types/secrets-exposure-review/prompts/secrets-exposure-review.md
- 敏感信息暴露审查 Skill: https://github.com/naodeng/awesome-qa-skills/blob/main/skills/zh/testing-types/secrets-exposure-review/SKILL.md
- 敏感信息暴露审查 Skill 源目录:https://github.com/naodeng/awesome-qa-skills/tree/main/skills/zh/testing-types/secrets-exposure-review
- 敏感信息暴露审查详情页:https://inaodeng.com/zh-cn/qaskills/secrets-exposure-review/
- Awesome QA Skills 项目:https://github.com/naodeng/awesome-qa-skills