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 预设的路径与顺序意想不到的方式:跨端点组合、非常规顺序、边界参数、并行重试

三条推论,构成全文的阅读前提:

  1. 传统风险一个都没消失,只是直达。把接入 AI 的服务端当普通 web 服务测:IDOR、注入、认证缺失照旧成立(OWASP MCP Top 10 的 MCP05 命令注入、MCP07 认证授权不足讲的正是这些)。本清单 17 项全部适用——变的不是风险本身,是攻击者从「会抓包的人」变成 7×24 不疲倦、发现成本趋零的自动化 agent。
  2. 接口通道自身多出 AI 特有攻击面:工具描述投毒、rug pull(批准后换定义)、每次重试广播完整上下文(含 PII 与凭证)——见 §4.2,与本清单 17 项叠加而非替代。
  3. CLI/API 化本身是正确方向,前提是后端闸补位。可审计(命令是文本、可完整留痕)、可沙盒、可限权,正是 API 通道优于 GUI 黑盒之处;缺的不是接口形式,而是把 UI 曾经默认提供的前置校验全部下沉为服务端闸——这正是本清单 17 项控制措施的共同主题。

延伸阅读:Agent 工具调用正在把 UI 变成攻击面(Feross / Terence Eden 观点综述)、MCP Server 攻击面分析(模型决策 + 上下文污染 + 工具权限 + 链式调用)

为什么企业内部系统坍塌得最彻底

企业内部系统和 to C 系统的信任模型根本不同:数据是公司级的,每个用户都是这份数据资产的使用者和维护者。UI 时代这套模型靠「界面界定」运转——每个人看到的字段、能点的按钮、可走的流程都被界面裁剪过,协作在裁剪后的边界内进行,边界本身就是控制。

AI 时代,这个控制结构整个坍塌。坍塌发生在三个层面:

  1. 裁剪消失。Agent 面前没有"你的界面",只有全量 API。案号字段在 UI 里对你是只读的,但 agent 探索到的端点不知道这一点——界面上没有入口 ≠ 系统里没有入口。
  2. 「该不该」失去了回答者。用户对 Agent 说「把案号从 A 改成 B」——Agent 会去探索如何修改,而不会判断是否应该修改。它忠实、高效、且不质疑。UI 时代大量约束根本不是技术闸,而是「界面上根本没有这个入口」;这个入口对 agent 永远存在。
  3. 合法身份 × 忠实执行=最危险的组合。不需要外部攻击者:正常员工一句含糊的自然语言指令,就足以让 agent 替他探索出绕过所有隐性协作约束的路径;事后审计看到的还是"合法用户、合法凭证、合法端点"——检测面上无异常。

对清单的影响:R9 状态闸、R7 字段白名单、R13 组合校验、R14 上下文注入的攻击者假设必须改写——从「恶意第三方」扩展为「善意同事 + 不会说不的 agent」。防线形态不变(服务端闸),但验收口径变了:闸不仅要挡得住恶意攻击,还要挡得住合法用户的 agent 替他探索出来的所有路径。内部系统评审时,每个「UI 上没入口所以没事」的回答一律视为无效。

威胁画像:本清单要防的攻击者

内部 Agent——持有合法用户名和密码、能正常登录系统的自动化代理。它绕过 UI 既定路径直接调用全量 API,自主寻找漏洞并修改系统数据。能力特征四条:

  1. 合法凭证、正常登录。用户名密码真实有效,登录流程、验证码、登录盾全部正常通过——它就是"真的那个用户"。认证体系对它完全无效。
  2. 绕过 UI 既定路径。不按页面预设的流程走,直接枚举、试探、组合调用全量 API——UI 允许它做什么不重要,API 允许它做什么才重要。
  3. 自主探索漏洞。逐个端点试参数边界、试隐藏字段、试状态组合、试他租户 ID——每次探索都是一次"合法请求"。
  4. 修改数据是终点。探索的目的就是找到能改的口子并改掉它;读只是侦察,写才是目标。

为什么传统防线对它层层空转:认证——过了(凭证合法);功能权限——过了(角色真实);租户隔离——过了(同租户操作);审计——看起来全是正常业务操作。四层传统闸全部绿灯之后,唯一还能拦住它的,就是本清单的 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 Authorization2019 的 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:2023API4=无限制资源消耗(技术影响);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=已认证未授权 vs InsufficientAuthenticationException=未认证)。

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 必须配幂等)。
  • 工程细节(幂等失效的三大隐形缝):
    1. 幂等标记与业务结果必须同事务落库。先写事件、后单独事务标记"已处理"——两次提交之间崩溃,重试时看不到标记,同一命令再执行一遍(重复扣款)。业界标准做法是把"保存事件 + 标记命令已处理"放进同一个数据库事务。
    2. 幂等要贯穿全链路。命令幂等 ≠ 事件幂等 ≠ 投影幂等:同一事件被重复投递时,消费者/投影层各自要有去重(记录稳定事件标识,或用确定性替换重放)。重试、死信重投、进程重启都会触发。
    3. 副作用出口单独闸。邮件、支付、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状态闸绕过当前状态允不允许这个动作
4CQRS 命令通道越权命令链路每一道闸都在吗
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 与人工渗透的行为差异决定了重点防线:

  1. 不走前端:直接 POST /save、直接调 /commands/*——所有依赖前端禁用的校验全部失效,状态闸、字段白名单必须服务端闭环。
  2. 枚举攻击:按 ID 遍历、分页拉全量、导出兜底——pageSize 注入、枚举熔断、导出复用列表查询三处合围。
  3. 参数探索:dataFilter=false、showMobile=true、rawData=true 一类开关参数是 AI 最爱尝试的字段——服务端不暴露开关。
  4. 重复与变体:同请求重放、金额取 0/负/极端值、旧版本号覆盖——幂等指纹、signum() 校验、乐观锁强制比对逐个堵。
  5. 身份放大:共享服务账号、代操作上下文是最大放大器——只允许 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 / R15agent 用继承来的宽权限凭证,按"它以为是操作者指令"的内容行事;真实案例: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 自述不作数。

设计原则(把注入当必然事件,压缩其爆炸半径):

  1. 按任务配工具,不按角色配工具:工单分诊 agent 不需要计费系统写权限,没有"以防万一"。
  2. agent 是一等身份:自己的凭证、自己的审计轨迹、自己的行为基线,治理强度对齐人类账号;禁止"一个 bot 一张神卡"。
  3. 身份永不取自提示词或工具参数:“当前用户是 xxx"作为 prompt 变量或 tool 参数传入=可被注入篡改(对应 R14)。身份必须从认证态透传到每一次工具调用和下游跳转。
  4. 每次调用授权动作本身,不只授权会话:会话开始校验一次、之后 agent 用自己的凭证随意调=混淆代理的标准温床。
  5. MCP / 代理层注意 audience 校验:业界把"MCP 服务器盲目转发客户端 token 到下游"列为反模式(审计记错调用者、audience 控制被绕过);正确形态是显式 on-behalf-of + 调用者身份快照 + fail-closed——本项目 MCP 透传设计(McpCaller bearerToken 快照、空则拒绝、401 不重试)与此一致,补强方向是下游接口校验 token audience(RFC 8707 resource indicator)。
  6. 高危动作人在环:审批确认不能送到 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项措施