API 安全检查停在“令牌有效”还不够。令牌属于谁、能执行什么动作、能访问哪个资源,以及失败响应泄露了什么,都是接口边界的一部分。
为什么需要这个 Skill
API 安全测试 Skill 先用文档、权限矩阵、API 合同和脱敏证据建立受限分析,再把需要授权执行的验证写成 AST-## 发现。它不会登录系统、读取凭据或自动攻击真实 API;即使名称包含“测试”,也仍受证据和授权边界约束。
Skill 用来做什么
当团队需要复核 API 攻击面、输入边界、认证、授权、对象范围、错误泄露、限流和安全合同时,使用这个 Skill。它尤其适合下面这些场景:
- 令牌能通过认证,但还没有确认它能否访问当前对象。
- OpenAPI、权限矩阵和安全需求对同一接口说法不一致。
- 团队需要把“检查越权”和“检查敏感信息泄露”变成有触发条件、预期结果和证据要求的场景。
- 交接时必须说明哪些内容只是静态审查,哪些内容还没有授权执行。
API 安全复核会沿着一次请求追踪完整对象边界:调用者是谁、请求了什么、对象属于谁、失败时返回什么、系统记录了什么。它不把一次 403 或一份 OpenAPI 文档写成全面安全证明。
它不做什么
API 安全测试 Skill 不替代:
- 渗透测试、红队行动和漏洞扫描;
- 真实 API 的未授权调用或生产探测;
- 安全需求复核、威胁建模和权限设计;
- 风险接受、例外授权和发布安全判断;
- 一次请求之外的完整运行时安全保证。
它把安全测试准备成可以授权、执行和复核的工作,不把准备过程伪装成测试结果。
它主要检查哪些内容
API 安全测试的核心不是多列几个攻击名,而是把请求边界拆成可验证的安全问题。
| 复核维度 | 重点问题 |
|---|---|
| 认证 | 调用者是谁?令牌的来源、租户和生命周期是什么? |
| 授权 | 这个角色能执行当前动作吗? |
| 对象授权 | 它能操作这个具体资源吗?资源是否属于另一个租户? |
| 输入边界 | 参数、路径、查询、上传和批量输入的攻击面在哪里? |
| 响应与错误 | 失败时是否泄露对象存在性、内部字段、堆栈或敏感数据? |
| 限流与滥用 | 重复、批量、异常频率和资源消耗如何处理? |
| 审计 | 安全相关动作是否有可定位、不过度泄露的记录? |
| 安全合同 | 认证、权限、错误、数据和版本要求能否追踪到验证证据? |
开始之前先审计输入
API 安全分析不能把请求样例当成真实执行结果。先做输入审计:
| 状态 | 例子 | 应该怎么做 |
|---|---|---|
| known | API 合同明确要求导出接口校验租户身份 | 引用接口和版本 |
| missing | 没有对象权限矩阵,也没有错误响应规范 | 记录证据缺口 |
| conflicting | OpenAPI 允许 404,安全需求要求 403 | 保留两份来源并请求决策 |
| stale | 请求样例仍使用旧版本令牌或字段 | 标记时效风险 |
| out_of_scope | 未授权登录、调用生产 API 或读取凭据 | 明确禁止真实执行 |
| assumptions | 暂时假设测试环境使用合成租户和对象 | 写出影响并要求确认 |
信息缺失时,可以继续准备候选场景;不能把请求模板发出去以后就说攻击已经完成。
从问题到结构化发现
先把来源、范围、证据状态、分析判断、责任角色、动作、关闭条件和验证方式连起来,再写结论。下面的案例保留这个 Skill 的专属编号和领域语境。
结构化发现至少要区分事实、证据支持的推断、建议和人工决策。它们对应不同的证据强度和责任边界。
| 判断层次 | 记录什么 | 示例 |
|---|---|---|
| 事实 | 材料直接说明了什么 | 接口接受令牌和 job_id |
| 证据支持的推断 | 哪个缺口可能造成什么风险 | 尚无租户绑定规则,可能无法确认对象授权是否生效;这不是漏洞确认 |
| 建议 | 接下来最小且安全的动作 | 补充租户绑定、错误语义和审计要求,再设计合成数据验证 |
| Human 决策 | 哪些事项需要授权或权衡 | 由负责人确认环境、账号范围和错误信息取舍 |
一个完整案例
本节按输入、分析、发现、决策和验证展开;材料不足时保留 missing、conflicting 或 assumptions 状态,不把它们改写成通过。
输入
本案例使用本节给出的需求、设计、接口或其他项目材料,并保留版本、范围和缺失项。
分析
先对照检查矩阵和六类证据状态,再把问题整理成这个 Skill 的专属发现。
发现
一条 AST-## 发现如何产生
假设接口合同提供:
GET `/exports/{job_id}/download`
Authorization: Bearer <token>
材料没有说明 job_id 与租户身份如何绑定,也没有说明跨租户资源返回 403 还是 404、失败响应是否允许泄露对象存在性。
AST-02 — 下载接口缺少对象授权和错误泄露合同
- 对象 / 规则:
GET /exports/{job_id}/download的租户对象访问。 - 来源: API 合同 v3.2;令牌说明存在,但对象权限矩阵和错误响应规范未提供。
- 触发条件: 租户 A 的合法身份请求租户 B 的 job_id,以及请求不存在或已过期的 job_id。
- 预期关注点: 认证成功不等于对象授权成功;跨租户、不存在和已过期资源是否有一致且不过度泄露的响应。
- 状态: missing
- 影响 / 优先级: 缺少合同可能让 API、网关、审计和客户端对失败语义采用不同实现;示例没有提供项目的影响评估或定级依据,因此暂不定级。
- 责任角色: API 负责人、安全负责人、租户权限负责人。
- 关闭条件: 明确对象授权位置、跨租户响应策略、审计字段和敏感错误信息边界,并更新 API 合同。
- 验证方式: 在授权的隔离环境使用合成租户和文件,验证合法对象、跨租户对象、不存在对象和过期对象;保留原始响应、审计记录和停止条件。
- 人工决策: 选择 403、404 或统一错误策略时,需要评估安全、客户端兼容性和可观测性的取舍。
这个发现没有声称接口已经存在漏洞。它说明当前材料不足以形成可复核的对象授权验证——这正是 API 安全测试应该先解决的问题。
决策
责任角色和待决策问题应由对应负责人确认;Skill 不替他们做风险取舍。
验证
关闭前按发现中的验证方式执行,并保留原始产物;没有执行记录时,状态仍然保持未验证。
发现如何进入下一阶段
交接产物
至少交付来源、证据状态、负责人、关闭条件和验证动作;路由结果仍需由负责人确认。
下一步路由
一轮 API 安全工作可以分成两段:
- 用 API 合同、权限矩阵和脱敏请求做静态输入审计。
- 产出 AST-## 场景,包括前置条件、刺激、预期结果、证据和停止条件。
- 由负责人确认环境、账号、数据和授权范围。
- 在隔离环境使用最小权限和合成数据执行。
- 单独记录实际响应、审计日志、版本、时间和剩余风险。
Skill 可以准备第四步需要什么,但不会代替第四步。尤其不能因为请求返回 403,就自动推断所有对象和所有入口都受到保护。
怎样准备更好的输入
最小输入包括:
- OpenAPI 或 API 合同、版本、接口范围和错误响应规范;
- 认证方式、角色/租户/对象权限矩阵;
- 输入字段、数据分类、限流策略、审计字段和依赖;
- 脱敏请求/响应样例、历史问题和已有执行证据;
- 授权的隔离环境、合成数据、账号范围和停止条件。
输出至少包括:
- 目标、对象、范围内外和未授权动作;
- 六类输入审计;
- API 攻击面和安全风险场景;
- 按优先级排序的 AST-## 发现;
- 候选验证、预期结果、证据要求、关闭条件和人工决策。
只有接口名称时,Skill 可以提示需要什么材料;要得到有用的对象授权结果,至少提供对象关系、角色边界和错误合同。
和其他 Skill 怎么配合
- 安全需求复核:https://inaodeng.com/zh-cn/qaskills/security-requirement-review/
- 威胁建模:https://inaodeng.com/zh-cn/qaskills/threat-modeling/
- 授权测试:https://inaodeng.com/zh-cn/qaskills/authorization-testing/
- 敏感信息暴露审查:https://inaodeng.com/zh-cn/qaskills/secrets-exposure-review/
容易踩的坑
- 把令牌有效写成“用户可以访问这个资源”。
- 只测试 UI,不检查直接 API、批量接口、后台任务和下载链接。
- 把 403 当成所有对象都安全,也不检查 404/错误响应是否泄露对象存在性。
- 只列 SQL 注入、越权等攻击名,不写触发条件、预期结果和证据。
- 使用真实凭据或生产接口来补全缺失材料。
安装与调用
npx skills add https://github.com/naodeng/awesome-qa-skills/tree/main/skills/zh --skill api-security-testing
安装说明与排查方式:
- 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
请使用 api-security-testing Skill。
任务:在授权的隔离环境前,复核发票导出 API 的对象授权和错误泄露风险。
输入材料:[OpenAPI v3.2、租户权限矩阵、Token 说明、错误响应规范、审计字段和脱敏请求]
范围:[GET /exports/{job_id}/download]
限制:[不读取凭据、不调用生产 API、不执行破坏性操作]
先完成六类输入审计,再围绕认证、授权、对象范围、输入边界、错误泄露、限流和审计输出 AST-##。分开静态事实、证据推断、候选验证和 Human 决策。
输入是 API 合同、权限和脱敏证据;输出是带来源、状态、优先级、预期结果、关闭条件和验证方法的安全发现。真实执行需要单独授权和单独证据。
常见问题
返回 403 就能证明资源受保护吗?
不能。它只说明一次特定请求得到了 403。还要确认使用的身份、对象归属、版本、其他入口、错误响应和审计记录。
这个 Skill 会直接执行攻击吗?
不会。它只做证据受限的分析和验证准备,不登录系统、不读取凭据、不调用真实 API,也不执行破坏性操作。
只有 OpenAPI 文档,能得到完整的 API 安全结论吗?
不能。你可以得到静态合同和证据缺口分析,但对象权限、环境行为和运行时安全仍然是未验证状态。
参考
静态 API 合同、请求模板和空跑只能保留计划或材料证据,不能升级为真实攻击、漏洞不存在或发布批准。
- API 安全测试提示词(执行契约): https://github.com/naodeng/awesome-qa-skills/tree/main/skills/zh/testing-types/api-security-testing/prompts/api-security-testing.md
- API 安全测试 Skill 源目录(定义、智能体适配和评测资产): https://github.com/naodeng/awesome-qa-skills/tree/main/skills/zh/testing-types/api-security-testing
- API 安全测试详情页:https://inaodeng.com/zh-cn/qaskills/api-security-testing/
- Awesome QA Skills 项目:https://github.com/naodeng/awesome-qa-skills