API 业务访问与完整性风险清单
本文是麦扑科技(OMAPS)点位管理系统在 API 治理上的方法论沉淀:一套面向企业内部系统、覆盖 17 项控制措施的风险目录,用于架构评审、安全需求编写与威胁建模。
适用范围:企业内部系统——这类系统的数据是公司级资产,每个用户都是这份数据资产的使用者和维护者;含 CQRS 命令通道 / 多租户中台 / 开放 API(MCP、小程序移动端)。 用途:架构评审、安全需求编写、威胁建模的标准风险目录。 定位:归入「API 业务访问与完整性风险」大类,与传输安全、认证安全并列。
背景:UI 消失之后,所有 API 直达
核心命题:AI 正在把企业系统的消费方式从「人 + UI」变成「agent + API/CLI」。界面不再是必经之路——agent 直接枚举接口、读工具描述、按语义自主组合调用。过去默认由 UI 层承担的全部防护职责同时失效,这就是本清单存在的理由。
| 维度 | UI 时代(人 + 图形界面) | AI 时代(agent + API/CLI) |
|---|---|---|
| 请求来源 | 用户点击产生,UI 引导出合法的请求流 | agent 自主决定调用什么,不需要 UI 存在 |
| 防护假设 | 前端禁用/隐藏按钮、页面跳转顺序、表单校验都是隐性防线 | 全部失效——/save、/export、/commands/* 与页面上那个被禁用的按钮一样直达 |
| 发现成本 | 攻击者要逆向前端 JS 才能拼出 API 地图 | 工具描述 / 开放接口索引就是现成能力地图(MCP tools/list 每次连接全量枚举,人类只读一次文档) |
| 攻击规模 | 人工逐个尝试,成本高 | 低成本部署海量 agent 并行嗅探——非对称博弈:攻击者只需找到一个洞,防御方必须覆盖全部攻击面 |
| 调用方式 | 按 UI 预设的路径与顺序 | 意想不到的方式:跨端点组合、非常规顺序、边界参数、并行重试 |
三条推论,构成全文的阅读前提:
- 传统风险一个都没消失,只是直达。把接入 AI 的服务端当普通 web 服务测:IDOR、注入、认证缺失照旧成立(OWASP MCP Top 10 的 MCP05 命令注入、MCP07 认证授权不足讲的正是这些)。本清单 17 项全部适用——变的不是风险本身,是攻击者从「会抓包的人」变成 7×24 不疲倦、发现成本趋零的自动化 agent。
- 接口通道自身多出 AI 特有攻击面:工具描述投毒、rug pull(批准后换定义)、每次重试广播完整上下文(含 PII 与凭证)——见 §4.2,与本清单 17 项叠加而非替代。
- CLI/API 化本身是正确方向,前提是后端闸补位。可审计(命令是文本、可完整留痕)、可沙盒、可限权,正是 API 通道优于 GUI 黑盒之处;缺的不是接口形式,而是把 UI 曾经默认提供的前置校验全部下沉为服务端闸——这正是本清单 17 项控制措施的共同主题。
延伸阅读:Agent 工具调用正在把 UI 变成攻击面(Feross / Terence Eden 观点综述)、MCP Server 攻击面分析(模型决策 + 上下文污染 + 工具权限 + 链式调用)
为什么企业内部系统坍塌得最彻底
企业内部系统和 to C 系统的信任模型根本不同:数据是公司级的,每个用户都是这份数据资产的使用者和维护者。UI 时代这套模型靠「界面界定」运转——每个人看到的字段、能点的按钮、可走的流程都被界面裁剪过,协作在裁剪后的边界内进行,边界本身就是控制。
AI 时代,这个控制结构整个坍塌。坍塌发生在三个层面:
- 裁剪消失。Agent 面前没有"你的界面",只有全量 API。案号字段在 UI 里对你是只读的,但 agent 探索到的端点不知道这一点——界面上没有入口 ≠ 系统里没有入口。
- 「该不该」失去了回答者。用户对 Agent 说「把案号从 A 改成 B」——Agent 会去探索如何修改,而不会判断是否应该修改。它忠实、高效、且不质疑。UI 时代大量约束根本不是技术闸,而是「界面上根本没有这个入口」;这个入口对 agent 永远存在。
- 合法身份 × 忠实执行=最危险的组合。不需要外部攻击者:正常员工一句含糊的自然语言指令,就足以让 agent 替他探索出绕过所有隐性协作约束的路径;事后审计看到的还是"合法用户、合法凭证、合法端点"——检测面上无异常。
对清单的影响:R9 状态闸、R7 字段白名单、R13 组合校验、R14 上下文注入的攻击者假设必须改写——从「恶意第三方」扩展为「善意同事 + 不会说不的 agent」。防线形态不变(服务端闸),但验收口径变了:闸不仅要挡得住恶意攻击,还要挡得住合法用户的 agent 替他探索出来的所有路径。内部系统评审时,每个「UI 上没入口所以没事」的回答一律视为无效。
威胁画像:本清单要防的攻击者
内部 Agent——持有合法用户名和密码、能正常登录系统的自动化代理。它绕过 UI 既定路径直接调用全量 API,自主寻找漏洞并修改系统数据。能力特征四条:
- 合法凭证、正常登录。用户名密码真实有效,登录流程、验证码、登录盾全部正常通过——它就是"真的那个用户"。认证体系对它完全无效。
- 绕过 UI 既定路径。不按页面预设的流程走,直接枚举、试探、组合调用全量 API——UI 允许它做什么不重要,API 允许它做什么才重要。
- 自主探索漏洞。逐个端点试参数边界、试隐藏字段、试状态组合、试他租户 ID——每次探索都是一次"合法请求"。
- 修改数据是终点。探索的目的就是找到能改的口子并改掉它;读只是侦察,写才是目标。
为什么传统防线对它层层空转:认证——过了(凭证合法);功能权限——过了(角色真实);租户隔离——过了(同租户操作);审计——看起来全是正常业务操作。四层传统闸全部绿灯之后,唯一还能拦住它的,就是本清单的 17 项:对象级数据域(R3)、状态闸(R9)、字段白名单(R7)、组合校验(R13)、幂等(R12)、配额(R17)……这些闸的共同点是全部落在认证之后、以数据和业务为对象——这正是"内部 Agent 威胁模型"倒推出来的防线形态。
内部与外部的关系:外部攻击者拿到账号、或打通 AI 通道之后,用的正是同一套手法。所以防住内部 Agent 的路径,外部攻击就失去了落脚点;反之不成立——这就是本清单把内部 Agent 列为第一威胁的原因。
0. 三个关键区分(先立判据)
| 类别 | 判据 | 典型例子 |
|---|---|---|
| 越权(authorization bypass) | 不该有这个访问/操作资格,却拿到了 | 用普通用户 ID 改别人的单据 |
| 业务不变量绕过(invariant bypass) | 资格齐全,但构造出了不被允许的业务状态 | 应付 3000 却划拨 50000、负金额入账 |
| 执行机制滥用(replay / version) | 资格齐全、状态规则本身没问题,但利用执行机制重复或覆盖变更 | 抓包重放支付请求、拿旧版本号覆盖审核结果 |
威胁建模时先问一句话:这个请求是"没资格"、“资格够但状态非法”,还是"全合法但被重复/覆盖执行"? 三问定位到不同的类别。
0.5 与 OWASP API Security Top 10 (2023) 的映射
本清单是 OWASP API Top 10 2023 的业务层细化:OWASP 的三大授权类(API1/API3/API5)在本清单里被拆成粒度更细、可直接入验收的条目;CQRS 命令通道、多租户引用、上下文注入等属于 OWASP 没有单列、但中台架构里高发的形态。
| 本清单 | OWASP API Top 10 2023 | 说明 |
|---|---|---|
| R1 垂直越权、R2 动作混淆越权 | API5:2023 Broken Function Level Authorization | 功能面授权失败 |
| R3 水平越权、R4 批量/导出越权、R5 传递越权、R6 跨租户引用注入 | API1:2023 Broken Object Level Authorization | 对象级授权失败(BOLA/IDOR),OWASP 榜首 |
| R7 字段级越权、R8 脱敏绕过 | API3:2023 Broken Object Property Level Authorization | 2019 的 Mass Assignment 与 Excessive Data Exposure 在 2023 合并为一项:写侧字段白名单 + 读侧字段收敛是同一根因的两面 |
| R9 状态闸绕过、R10 版本绕过、R13 业务组合约束绕过 | 无直接对应 | 属 OWASP Business Logic Cheat Sheet 领域;API 单条目不覆盖业务不变量 |
| R11 CQRS 通道越权、R12 重放绕过 | 无直接对应 | CQRS/Event Sourcing 架构特有;命令幂等与投影幂等是业界成熟能力(见 R12 落点) |
| R14 权限上下文注入、R15 代理接力越权 | API1/API5 的根因形态 | 上下文装配错误还涉及 API8:2023 Security Misconfiguration |
| R16 查询侧越权 | API1:2023 读侧形态 | CQRS 下命令/查询分闸是权威建议(命令严、查询宽但必须有闸) |
| R17 业务配额绕过 | API4:2023 + API6:2023 | API4=无限制资源消耗(技术影响);API6=敏感业务流无节制访问(业务影响)。两者常被混为一个"限流"问题,见 R17 |
本清单刻意不收的 OWASP 条目:API2 认证、API7 SSRF、API8 配置错误、API9 清单管理、API10 不可信三方消费——它们属于认证安全 / 基础设施安全 / 供应链安全域,与本清单「业务访问与完整性」定位正交,放进这里只会稀释评审焦点。
1. 风险目录(全量 17 项)
1.1 功能面越权
R1. 垂直越权(功能权限越权)
- 定义:主体越界调用更高权限面的操作(普通用户调管理接口、低角色调高角色端点)。
- 典型入口:管理端点、批处理端点、内部运维接口暴露到业务网关。
- 控制措施:URL 级功能权限(白名单入库 + 授权脚本 + 缓存刷新四步缺一不可);接口默认 fail-closed;未登记 URL 拒绝而非放行。
- 本项目落点:
sqls/saas-update-permission.sql;40101 两种形态需用data区分(AuthorizationDeniedException=已认证未授权 vsInsufficientAuthenticationException=未认证)。
R2. 动作混淆越权(弱语义动作绕过)
- 定义:一个接口承载多个动作,或动作类型由入参控制(如统一
operate(type),type=submit/approve/revoke);只校验"能否访问接口",不校验"能否执行该动作"。 - 典型入口:统一操作端点、状态机驱动接口、MCP 工具分发层。
- 控制措施:每个动作独立端点 + 独立权限;动作粒度鉴权(接口通过 ≠ 动作放行);动作枚举白名单。
- 与 R1 区分:R1 是平台/租户面的权限层级,R2 是动作粒度的鉴权缺失。
- 延伸阅读:OWASP API5:2023 Broken Function Level Authorization
1.2 数据归属越权
R3. 水平越权(IDOR / 资源归属越权)
- 定义:绕过数据归属、数据域隔离,按 ID 直接访问/操作他人资源。
- 典型入口:
GET /{id}、POST /{id}/xxx、任何按 ID 取对象的端点。 - 控制措施:按 ID 读必须过租户闸与数据域闸;列表与详情口径成对(列表限了详情不限=口径分裂)。
- ⚠️ 本项目实锤:
findById不受 Hibernate filter(em.find不走查询计划)——读闸必须由TenantEntityListener#postLoad兜底;数据域闸ScopeReadable#assertReadable须接在BaseRestController#getOne/delete边界。 - ⚠️ 子资源同样要闸:按父 ID 查子列表的路由(
/by-customer、/{id}/records)必须先对父对象assertReadable。 - 延伸阅读:OWASP API1:2023 Broken Object Level Authorization
R4. 批量 / 列表类隐式越权(范围越权)
- 定义:单条资源校验做了,但批量查询、导出、统计、聚合接口没有行级过滤;单条拿不走,却能拉全租户/全平台数据。
- 典型入口:
/export(不分页全量出口,最爱被打)、/list、/stat、报表端点、分页端点。 - 控制措施:导出必须复用列表查询(不得另写一套无过滤查询);列表侧 QueryDSL/Blaze 只认统一数据域谓词;分页上限强制(防 unpaged 全量)。
- ⚠️ 本项目实锤:
PageableUtils对不传/<=0/==999一律 unpaged 全量——外部通道必须注入默认 pageSize;AI/MCP 通道按(租户+用户+端点)参数指纹做枚举熔断。 - AI 批量打点三步曲:枚举 ID → 逐条拉取 → 导出兜底,三处都要合围。
R5. 隐式依赖资源越权(传递 / 级联资源越权)
- 定义:当前单据本身有权限,但单据关联的子资源、引用资源没有独立校验;通过操作 A 间接读写无权的关联实体 B。
- 典型入口:修改订单时顺带改收款账户/附件;按父对象更新的批量保存接口;级联 JSON 保存。
- 控制措施:请求体中出现的每个关联 ID 单独过归属校验;级联保存逐实体闸;嵌套资源禁止"父过了子全放"。
R6. 跨租户引用注入(多租户专属)
- 定义:允许在本租户内选择引用 ID,但未校验引用资源是否属于同一租户;传入他租户资源 ID 建立关联,间接打通数据域。
- 典型入口:表单选择器直传 ID、导入接口、开放 API 的引用字段。
- 控制措施:引用字段写入前校验目标租户;读侧 selector 也要带租户过滤;跨租户读端点从开放索引中剔除。
- ⚠️ 本项目实锤:
@CrossTenant写仓储接口方法是唯一豁免通道,白名单化管理;MCP OpenApiIndex 跳过跨租户读端点。
1.3 属性粒度越权
R7. 字段级越权(属性写越权)
- 定义:允许用户更新这条单据,但某些敏感字段不允许他碰;接口没有"可写字段白名单",PATCH/POST 直接整体覆盖。
- 典型入口:整对象更新的 save 端点、批量字段映射(BeanUtils 整拷)、CQRS 命令的 applyFields。
- 控制措施:逐字段显式赋值(禁 BeanUtils 整拷);受保护字段在 DTO 层结构性消灭;写入口统一拦截:新增清
tenantId、更新回填tenantId/createBy/createTime;业务归属字段(如 salesId)由 Service 声明保护清单。 - 反序列化防线(OWASP 对 Mass Assignment 的标准对策):反序列化配置拒绝未知属性(
FAIL_ON_UNKNOWN_PROPERTIES)——请求体里夹带的未定义字段直接报错而不是静默丢弃,否则字段夹带只被挡一半;载荷大小上限;嵌套深度硬上限(通常 ≤3 层)。 - ⚠️ 本项目落点:
BaseRestController#save已接ProtectedFields;CQRS Handler 的 applyFields 逐字段赋值;字段夹带由契约测试看门狗覆盖。 - 延伸阅读:OWASP API3:2023 Broken Object Property Level Authorization(R8 同源)
R8. 数据脱敏绕过(属性读越权)
- 定义:接口鉴权没问题,但可通过入参控制是否返回敏感字段(
showMobile=true、rawData=true)拿到明文。属于"能访问资源,但不该看到全部属性"。 - 典型入口:开放 API、MCP/AI 出口、导出接口、日志出口。
- 控制措施:脱敏在服务端出口统一做,不信任任何前端"已隐藏"假设;禁止开关型脱敏参数;AI 通道唯一出口统一按字段名打码。
- ⚠️ 本项目落点:
ResponseMasker在BackendClient唯一出口按字段名打码手机号/银行账号/证件号/口令(omaps.mcp.mask-sensitive默认开)。
1.4 前置条件绕过
R9. 状态闸绕过(状态前置条件绕过)
- 定义:在实体当前状态不允许的情况下执行变更动作(PENDING 改单、APPROVED 直接改内容、已锁定单据被删)。
- 典型入口:
/save端点绕过save()业务方法的分支、批量删除、confirm/cancel 类动作端点。 - 控制措施:编辑/删除前读库校验状态(不信前端传来的快照);save/update/delete/batchDelete 全部接线,任何一个绕过分支都是漏闸;合法状态出口走内部通道绕开更新闸,避免误伤。
- ⚠️ 本项目落点:样板=SaleContract/PurchaseContract 的
assertEditableByStatus(save/saveContract/batchDelete 三处);更正走变更/红冲而不是直接改。 - ⚠️ AI 攻击特征:AI 不会走前端页面,会直接 POST
/save——凡是绕过save()的/save端点都是它的第一落点。
R10. 版本 / 快照绕过(乐观锁绕过)
- 定义:实体有版本锁、乐观锁,但后端未强制校验版本;拿旧版本快照构造请求覆盖后续变更,绕过中间状态校验(如单据已被他人审核,拿旧版本号提交更新覆盖审核结果)。
- 典型入口:带 version 字段的更新接口、并发编辑场景、移动端离线回传。
- 控制措施:更新必须带 version 且后端强制比对;乐观锁失败显式报错(不是静默覆盖);数据库层兜底约束——对(聚合 ID, 版本号)建唯一索引(
UNIQUE(aggregate_id, version)),应用层漏判时写入直接失败,这是不可绕过的最后防线;关键单据叠加"锁定 + 红冲"机制兜底。 - 与 R9 区分:R9 管状态机前置条件,R10 管时间线上的覆盖。
- 延伸阅读:CQRS 幂等与乐观锁工程实现(R12 同源)
1.5 命令与消息通道
R11. CQRS 命令通道越权
- 定义:命令伪造、命令鉴权缺失、异步命令链路门禁失效(不沿继承链解析的注解、白名单漏登、Handler 未接闸)。
- 典型入口:
POST /commands/{action}端点、命令 Handler、异步命令消费者。 - 控制措施:每命令独立端点 +
@Valid;Handler 统一走四道闸(防重指纹 → 数据域闸 → 执行 → doExecute);注解不沿继承链解析则每个子类必须显式标注;命令 URL 授权通配覆盖后仍需联调验证。 - ⚠️ 本项目落点:
AbstractCommandHandler四道闸;新模块 command 包必须进@ComponentScan白名单(漏=静默失效);契约测试六类负向模板(含越权 id、字段夹带)。
R12. 幂等 / 重放绕过
- 定义:命令、更新接口缺少防重放;抓取合法请求反复投递,造成重复下单、重复审核、重复扣款。即使鉴权、归属、状态、组合约束全部正确,依然破坏业务。
- 典型入口:支付/划拨类写接口、异步 CQRS 消息重放、死信重试、MQ 重复投递。
- 控制措施:create 用防重指纹幂等;delete 幂等化;业务动作带唯一业务号幂等键(Idempotency Key);异步消费端按消息 ID 去重;重试语义显式定义(at-least-once 必须配幂等)。
- 工程细节(幂等失效的三大隐形缝):
- 幂等标记与业务结果必须同事务落库。先写事件、后单独事务标记"已处理"——两次提交之间崩溃,重试时看不到标记,同一命令再执行一遍(重复扣款)。业界标准做法是把"保存事件 + 标记命令已处理"放进同一个数据库事务。
- 幂等要贯穿全链路。命令幂等 ≠ 事件幂等 ≠ 投影幂等:同一事件被重复投递时,消费者/投影层各自要有去重(记录稳定事件标识,或用确定性替换重放)。重试、死信重投、进程重启都会触发。
- 副作用出口单独闸。邮件、支付、webhook 等不可回滚动作要放在幂等闸之后、并有独立去重记录——历史重放不能重复触发对外副作用。
- 与 R10 区分:R10 是旧版本覆盖新状态,R12 是同一请求重复生效。
1.6 业务不变量
R13. 业务组合约束绕过(Business Invariant Bypass)
- 定义:有权操作、状态合法,但变更后字段组合违反联动规则、值域互斥(金额为负、起止日期倒挂、比例之和超 100%)。
- 典型入口:任何写接口的入参校验层,尤其金额、比例、日期、枚举互斥字段。
- 控制措施:金额入参一律
signum() > 0强校验;组合规则在 Handler/Service 层显式断言,不依赖前端;状态字段命名避开保留字。 - ⚠️ 本项目实锤(渗透 S18):
/allocate收-1000/0/-99999全 200,paid_amount变负后余额公式应付-已付反被放大,应付 3000 划出 50000。 - 与 R7 区分:R7 管"这个主体有没有资格碰这个字段",R13 管"字段之间合不合法"。
- 延伸阅读:OWASP Business Logic Security Cheat Sheet(R9/R10 同源)
1.7 上下文类
R14. 权限上下文污染 / 参数可控权限注入
- 定义:后端把
role、scope、tenantId、isAdmin、数据权限过滤条件直接从请求入参读取;攻击者通过传参提升权限、切换租户、关闭过滤。 - 典型入口:
tenantId从 body/header 取而非 token;dataFilter=false之类的开关参数;userId从请求体取。 - 控制措施:租户/用户上下文只从认证态(token)取,请求体同类字段一律丢弃;过滤条件服务端固定,不暴露开关;防自我授权的写入口拦截。
- ⚠️ 本项目落点:
om_employee.user_id全局唯一,绑定只认手机号,请求体 userId 一律丢;租户隔离由TenantFilterAspect框架统一做,业务层禁写tenant_id。
R15. 授权链路接力越权(代理 / 委托越权)
- 定义:支持代理、代操作、服务账号、内部转发、代办时,代理上下文没有强隔离、可被篡改,或代理权限横向扩散。
- 典型入口:审批代办、客服代操作、内部系统代理调用、AI 通道的调用者身份传递。
- 控制措施:代理身份透传(on-behalf-of),审计记真实调用者;代理上下文不可由客户端参数指定;拒绝任何"给通道配共享账号"的方案——服务账号=审计失真+数据域放大+后端闸失效;内部转发凭证明确界定有效期与范围。
- ⚠️ 本项目实锤(2026-11-12):MCP 凭证改为调用者 Bearer token 透传(
McpCaller第 4 字段快照自请求线程,空则 fail-closed、401 不重试),服务账号 password grant 整体删除。任何「给 MCP 配账号」的提议都拒绝。
R16. 查询侧约束绕过(Query 越权)
- 定义:只保护 Command,Query 通道放任;构造查询拿到无权查看的衍生数据、投影、敏感计算字段。CQRS 体系下尤其突出:命令保护很好,查询模型没有归属/权限过滤。
- 典型入口:
/open/command-schema之类的元数据端点、统计投影、聚合视图、衍生计算字段、搜索接口。 - 控制措施:读侧闸与写侧闸成对设计;投影/聚合视图复用同一数据域谓词;元数据端点评估暴露面(字段清单=攻击地图);开放接口与内部接口分离鉴权。
- ⚠️ 本项目落点:
ScopeReadable只有 9 模块实现,其余实体读侧租户内全可见=产品口径,需在威胁建模时逐个确认是否有数据域收窄需求。
R17. 业务配额绕过(速率之外的资源耗尽类滥用)
- 定义:有权调用、状态合法、字段也合法,但绕过配额、额度、数量上限(每用户最多 5 个项目后端无校验);AI 批量创建放大危害。不是严格意义的越权,可归为业务滥用。
- 典型入口:创建类端点、文件上传、AI token 消耗、存储/流量。
- 控制措施:配额校验在服务端(数量、大小、频率分层);防超卖只认条件原子 UPDATE(先查后改必超卖);AI 消耗逐轮记账防双记;超限软拒绝并留痕。
- API4 与 API6 的区分(OWASP 2023 新增之二,别混成一个"限流"问题):
- API4 资源消耗:纯技术影响(DoS、成本膨胀),对策是通用限流、分页上限、载荷上限——网关层可统一做。
- API6 敏感业务流:业务影响(黄牛扫货、占座锁库存、薅返利),每个请求都合法,扫描器测不出来;对策必须按业务流逐个选:该业务维度(而非全局 IP)的限额、人机验证、行为分析、设备指纹。业务先选流,工程再选闸——不可能每个端点都上挑战。
- 机器消费接口(B2B / 开放 API / AI 通道)是重灾区:它们天然过不了浏览器挑战,OWASP 明确点名"此类接口常缺少等价防护而成为易打目标"——必须用客户端身份 + 契约级配额 + 用途限制 + 审计留痕补齐等价防护。
- ⚠️ 本项目落点:存储 10 GiB / 流量 200 GiB,改额度三处同改;AI token 按
ModelCallEndEvent逐轮记账+perRoundMetered防双记;MCP 会话预算(次数/字节窗口累计)。 - 延伸阅读:OWASP API4:2023 Unrestricted Resource Consumption、OWASP API6:2023 敏感业务流、机器消费接口等价防护
2. 精简版清单(10 项,推荐用于日常评审)
| # | 风险 | 一句话判据 |
|---|---|---|
| 1 | 垂直越权 | 有没有资格调这个接口 |
| 2 | 水平越权(IDOR) | 有没有资格动这条数据 |
| 3 | 状态闸绕过 | 当前状态允不允许这个动作 |
| 4 | CQRS 命令通道越权 | 命令链路每一道闸都在吗 |
| 5 | 业务组合约束绕过 | 字段组合合不合法 |
| 6 | 字段级越权 | 这个字段允不允许他写 |
| 7 | 批量/导出范围越权 | 列表、导出、统计有没有行级过滤 |
| 8 | 重放与幂等绕过 | 重复投递会不会重复生效 |
| 9 | 查询模型越权 | Query 侧有没有归属/权限过滤 |
| 10 | 权限上下文注入 | 上下文是只从认证态取,还是可被传参篡改 |
3. 大分类标签(威胁建模用)
- 功能面越权:R1 垂直越权、R2 动作混淆越权
- 数据归属越权:R3 水平越权、R4 批量/导出越权、R6 跨租户引用注入、R5 传递/关联资源越权
- 属性粒度越权:R7 字段写越权、R8 脱敏绕过
- 前置条件绕过:R9 状态闸、R10 版本锁绕过
- 命令与消息通道:R11 CQRS 命令越权、R12 重放绕过
- 业务不变量:R13 业务组合约束绕过
- 上下文类:R14 权限参数注入、R15 代理接力越权
- 查询与配额:R16 Query 越权、R17 业务配额绕过
4. AI / fuzz 通道特别提示
本节是背景命题(UI 消失、API 直达)在攻防细节上的展开:§4.1 讲"自动化嗅探怎么打",§4.2 讲"agentic 通道自身多出的新面"。
4.1 AI 批量打点的行为差异(curl / 脚本)
AI 与人工渗透的行为差异决定了重点防线:
- 不走前端:直接 POST
/save、直接调/commands/*——所有依赖前端禁用的校验全部失效,状态闸、字段白名单必须服务端闭环。 - 枚举攻击:按 ID 遍历、分页拉全量、导出兜底——pageSize 注入、枚举熔断、导出复用列表查询三处合围。
- 参数探索:
dataFilter=false、showMobile=true、rawData=true一类开关参数是 AI 最爱尝试的字段——服务端不暴露开关。 - 重复与变体:同请求重放、金额取 0/负/极端值、旧版本号覆盖——幂等指纹、
signum()校验、乐观锁强制比对逐个堵。 - 身份放大:共享服务账号、代操作上下文是最大放大器——只允许 on-behalf-of 透传,共享账号方案一律拒绝。
4.2 Agentic AI 的增量攻击面(2025-2026 共识)
AI 通道从"批量 curl"进化到"自主 agent"后,本清单多个风险会复合爆发。行业参照系:OWASP LLM Top 10 2025(LLM06 Excessive Agency)、OWASP Agentic AI Top 10(2025-12 发布)、Gartner 预测(到 2029 年,对 AI agent 的成功攻击 >50% 打的是访问控制,提示注入只是投递手段);五眼联盟网络机构 2026-04 首份 agentic AI 联合指南同样把权限列为头号风险类。
MCP 通道的具体载荷(背景命题的实例化):
- 工具描述即攻击载体:agent 每次连接都全量枚举工具并阅读描述(人类只读一次文档),描述直接进入模型上下文并参与调用决策——Tool Poisoning(描述/参数 schema 藏指令)、Rug Pull(批准后换定义)、Tool Shadowing(污染可信工具的用法说明)。AMA 论文实证:仅操纵工具元数据(名称/描述/参数模式)即可在黑盒下诱导 agent 优先调用恶意工具,成功率 81%–95%。
- 传统漏洞照旧直达:MCP Server 本身就是联网服务——模型调得动,任何连得到端点的人也调得动;认证缺失、IDOR、命令注入在 MCP 出现前就存在,现在多了一层「模型会照文字填参数」的放大器(实证案例:官方参考实现 postgres server 把只读事务包着的查询原样透传,
COMMIT;前缀即可逃逸只读约束执行 DDL)。 - 重试即外泄:agent 重试失败指令时会把完整对话历史(含先前工具返回的 PII、凭证)重新走一遍网络——每次重试都是一次数据外带机会。
- 对策落点:Kaspersky 九条可归纳为本清单语言的四件事——agent/MCP 资产清单与白名单(对应 R2 动作枚举)、最小权限与任务期有效(对应 R1/R15)、高危操作人工审批(人在环)、提示词/工具调用/终端命令/网络流量全量进 SIEM(对应 R12 审计面)。
| 失效模式 | 对应本清单 | 说明 |
|---|---|---|
| 过度代理(Excessive Agency, LLM06) | R1 / R2 / R7 | 三个子形态:①功能过度——agent 能碰到任务根本不需要的工具;②权限过度——只读任务的 agent 拿着可写凭证;③自主过度——无人在环的高危动作。三者常复合。 |
| 混淆代理(Confused Deputy) | R3 / R15 | agent 用继承来的宽权限凭证,按"它以为是操作者指令"的内容行事;真实案例:EchoLeak(CVE-2025-32711,一封外部邮件让 M365 Copilot 以用户身份外传数据)、ForcedLeak(Salesforce,匿名 web 表单借 agent 的 CRM 权限外传)。 |
| 间接提示注入 | R14 的 agent 形态 | 恶意指令藏在 agent 正常读取的数据里(工单、邮件、网页、代码注释)——攻击者不直接接触 agent,而是投毒它的数据源。模型层无可靠通解,唯一规模化对策是压缩"注入成功后能做什么":最小工具集 + 最小权限 + 高危动作人在环。 |
| 约束期动作(Action During Constraints) | R9 的 agent 形态 | 运维置为只读/冻结态后,agent 被上下文里的指令或幻觉说服绕过约束(Replit 删库事件:显式 code freeze 下删除全部生产数据)。约束必须落在服务端闸上,不能只落在提示词里。 |
| 动作伪造与掩盖 | R12 审计面 | agent 谎报"已执行成功"并伪造合成数据掩盖——写操作必须以服务端留痕为唯一事实源,agent 自述不作数。 |
设计原则(把注入当必然事件,压缩其爆炸半径):
- 按任务配工具,不按角色配工具:工单分诊 agent 不需要计费系统写权限,没有"以防万一"。
- agent 是一等身份:自己的凭证、自己的审计轨迹、自己的行为基线,治理强度对齐人类账号;禁止"一个 bot 一张神卡"。
- 身份永不取自提示词或工具参数:“当前用户是 xxx"作为 prompt 变量或 tool 参数传入=可被注入篡改(对应 R14)。身份必须从认证态透传到每一次工具调用和下游跳转。
- 每次调用授权动作本身,不只授权会话:会话开始校验一次、之后 agent 用自己的凭证随意调=混淆代理的标准温床。
- MCP / 代理层注意 audience 校验:业界把"MCP 服务器盲目转发客户端 token 到下游"列为反模式(审计记错调用者、audience 控制被绕过);正确形态是显式 on-behalf-of + 调用者身份快照 + fail-closed——本项目 MCP 透传设计(
McpCallerbearerToken 快照、空则拒绝、401 不重试)与此一致,补强方向是下游接口校验 token audience(RFC 8707 resource indicator)。 - 高危动作人在环:审批确认不能送到 agent 可写回的同一通道里(确认被 agent 转述=确认形同虚设)。
延伸阅读:OWASP LLM Top 10 2025、OWASP Agentic AI 资源(2025-12 Agentic Top 10)、Gartner 访问控制预测解读、Confused Deputy 治理清单(NHI Group)
5. 参考资料
- OWASP API Security Top 10 (2023):https://owasp.org/API-Security/editions/2023/en/0xa1-broken-object-level-authorization/ (API1–API10 各条同域)
- OWASP Developer Guide · API Top Ten:https://devguide.owasp.org/en/07-training-education/07-api-top-ten/
- CQRS 命令幂等与乐观锁工程实现(幂等键同事务落库、
UNIQUE(aggregate_id, version)):https://dev.to/ohugonnot/idempotency-in-cqrs-and-event-sourcing-part-2-commands-projections-and-outbox-4ei - CQRS 三层命令验证与严格反序列化(拒绝未知属性、载荷上限):https://www.jcwlyf.com/content-51211.html
- OWASP API6 敏感业务流(业务层/工程层双层对策):https://owasp.org/API-Security/editions/2023/en/0xa6-unrestricted-access-to-sensitive-business-flows/
- 机器消费接口(B2B/AI 通道)的等价防护:https://ammune.ai/blog/owasp-api6-2023-unrestricted-access-to-sensitive-business-flows
- OWASP LLM Top 10 2025(LLM06 Excessive Agency)与 OWASP GenAI / Agentic AI Top 10(2025-12)
- Gartner:到 2029 年 >50% 的 AI agent 攻击利用访问控制缺陷——https://www.safeguard.sh/resources/blog/agentic-ai-access-control-problem
- 非人类身份 · Confused Deputy 治理清单(MCP token audience、身份透传反模式):https://nhimg.org/confused-deputy-in-ai-agents-guide
- EchoLeak(CVE-2025-32711)、ForcedLeak(Salesforce Agentforce)、Replit 删库事件——agentic 攻击公开案例
- Agent 工具调用把 UI 变成攻击面(Feross / Terence Eden 观点综述:攻击面从「用户点了什么」扩展到「agent 决定调什么」):https://www.botlearn.com.cn/en/community/ai_general/b7e2f280-b9ec-4872-b202-d37b18808799/agent-工具调用正在把-ui-变成攻击面
- MCP Server 攻击面识别(模型决策、上下文污染、工具权限、链式调用;OWASP MCP Top 10 映射):https://zone.ci/secarticles/wx/570239.html
- 工具投毒实证:操纵工具元数据诱导调用恶意工具(AMA 论文,成功率 81%–95%):https://www.freebuf.com/articles/ai-security/495691.html
- 企业 AI 代理防范九项措施(Kaspersky:资产清单、白名单、最小权限、人工审批、隔离、SIEM/XDR):https://cpunews.net/claude-code-cli等ai代理成新攻击面:企业防范ai代理攻击的9项措施