Skip to content

AgentPay 多租户隔离与越权渗透测试报告 (T3.5 Conformance Report) ​

报告版本:v1.0.0
执行日期:2026-10-18
测试状态:100% 通过 (PASSED)
执行环境:macOS (Darwin arm64), Python 3.12.7 (pytest 9.1.1), Go 1.24
涉及核心规范:


1. 概述与测试目标 ​

在 AgentPay 多租户架构中,各个租户可能代表相互竞争的企业或团队,各自托管极度敏感的 AI Agent 业务资产、私有 API Key、内部上游路由、财务安全策略以及平台虚拟钱包资金。

任务 T3.5 完成租户隔离与越权测试 旨在实施系统性、渗透级的负面攻击测试,严格验证以下安全边界:

  1. 水平越权防御(BOPLA / IDOR - Broken Object Level Authorization):
    • 攻击者拥有合法租户凭证(Tenant Beta),尝试通过已知或遍历猜测的对象 ID 直接读取、修改或删除受害者(Tenant Alpha)名下的项目、成员、Agent、API Key、网关路由、安全策略及钱包账本;
  2. 垂直越权防御(BFLA - Broken Function Level Authorization & RBAC Escalation):
    • 租户内部低权限角色(如 viewer、operator)尝试调用需要更高权限(如 admin、owner)的写操作与敏感管理接口;
  3. 查询与列表搜索隔离(Data Contamination Prevention):
    • 验证全量列表(List)与过滤接口在缺省过滤条件、空查询或通配符查询时,绝对不会泄露任何其他租户的记录(零污染不变量);
  4. API 参数混淆与跨租户注入防御(Path vs Payload Mismatch):
    • 攻击者在 REST API 路径中使用自己的 tenant_id,但在 JSON Body 或查询参数中注入受害者的 project_id、agent_id 或 route_id,验证系统是否能够识别跨租户所有权并拦截;
  5. 数据面网关路由与钱包资金物理隔离:
    • 验证 Go Gateway 在数据面请求路径上执行租户隔离路由匹配(MatchRouteForTenant),以及虚拟钱包冻结、扣款与账本平账在不同租户间的完全独立性。

2. 隔离与越权测试覆盖矩阵 ​

测试维度攻击测试用例 / 测试文件目标对象域预期安全响应测试结果关键安全断言
水平越权 (IDOR 读取)test_tenant_isolation_penetration.py
test_cross_tenant_idor_direct_access_blocked
Project, Agent, ApiKey, Route, Policy403 Forbidden / ERR_CROSS_TENANT_VIOLATIONPASS猜测/直接访问他租户实体 ID 均被即时拒绝
水平越权 (IDOR 篡改/删除)test_tenant_isolation_penetration.py
test_cross_tenant_idor_direct_access_blocked
Project, Agent, ApiKey, Route, Policy403 Forbidden / Mismatch ErrorPASS跨租户修改预算、撤销/轮换密钥、删路由策略均被阻断
查询列表零泄露test_tenant_isolation_penetration.py
test_cross_tenant_listing_zero_contamination
All Domains (List APIs)返回列表长度仅为自有资源,受害者资源数为 0PASS没有任何接口返回混合租户数据
垂直越权 (RBAC 提权)test_tenant_isolation_penetration.py
test_vertical_rbac_privilege_escalation_blocked
Member RBAC Matrix403 Forbidden / ERR_PERMISSION_DENIEDPASSViewer 无法创建项目、密钥、路由、策略
REST API 路径载荷混淆test_tenant_isolation_penetration.py
test_api_rest_idor_and_spoofing_matrix
REST API Endpoints403 ForbiddenPASS拦截 Path tenant 与 Body project/agent 不一致注入
最后 Owner 保护守卫test_member_rbac.pyTenant Member400 Bad Request / CannotRemoveLastOwnerPASS严禁删除、降级或禁用租户唯一活跃 Owner
数据面网关路由隔离gateway-go/internal/rcu/rcu_test.go
TestRCUMultiTenantRouteIsolation
Go Gateway RCU RouterMatchRouteForTenant 返回 falsePASSTenant Beta 绝对无法命中 Tenant Alpha 的路由
虚拟钱包与金融账本隔离gateway-go/tests/wallet_isolation_test.go
TestMultiTenantWalletIsolation
Virtual Wallet & Ledger余额无干扰,账本互不可见,对账 100% 独立PASSAlpha 的冻结扣费完全不影响 Beta 的可用余额

3. 详细测试场景与渗透验证 ​

3.1 跨租户 IDOR 读取与篡改拦截 ​

在测试环境搭建完全独立的两个租户:受害者 Tenant Alpha (ten_alpha) 与 攻击者 Tenant Beta (ten_beta)。

  • 用例 IDOR-01(跨租户读取项目):
    • 攻击者以 ten_beta 身份请求 get_project("prj_alpha", expected_tenant_id="ten_beta");
    • 判定结果:系统抛出 ProjectTenantMismatchError,REST API 返回 HTTP 403 ERR_CROSS_TENANT_VIOLATION。
  • 用例 IDOR-02(跨租户篡改项目预算):
    • 攻击者 ten_beta 的管理员尝试调用 update_project("prj_alpha", budget_cap_base_units=0) 清空受害者预算;
    • 判定结果:系统校验 actor.tenant_id != project.tenant_id,立即阻断并抛出 ProjectTenantMismatchError。
  • 用例 IDOR-03(跨租户窥探 / 轮换 API Key):
    • 攻击者 ten_beta 尝试调用 get_api_key("apk_alpha")、revoke_api_key("apk_alpha") 或 rotate_api_key("apk_alpha");
    • 判定结果:系统抛出 ApiKeyTenantMismatchError,REST API 返回 HTTP 403 ERR_API_KEY_TENANT_MISMATCH,受害者的密钥完好无损,且明文密钥零泄露。
  • 用例 IDOR-04(跨租户恶意下线 Agent):
    • 攻击者 ten_beta 尝试调用 update_agent(agent_id="agt_alpha", name="Hacked");
    • 判定结果:系统抛出 AgentTenantMismatchError,阻断篡改。
  • 用例 IDOR-05(跨租户篡改路由与窃取上游流量):
    • 攻击者 ten_beta 尝试更新受害者内部路由 update_route("rou_alpha", price_base_units=0) 或 delete_route("rou_alpha");
    • 判定结果:系统抛出 RouteTenantMismatchError,HTTP 403,受害者路由配置与计费单价不被篡改。
  • 用例 IDOR-06(跨租户破坏安全策略):
    • 攻击者 ten_beta 尝试修改受害者的单笔限额 update_policy("pol_alpha", max_amount_per_request=99999999);
    • 判定结果:系统抛出 PolicyTenantMismatchError,HTTP 403。

3.2 列表查询零泄露与命名空间独立 ​

  • 用例 LIST-01(空条件列表查询):
    • 调用 list_projects(tenant_id="ten_beta")、list_agents(tenant_id="ten_beta")、list_api_keys(tenant_id="ten_beta")、list_routes(tenant_id="ten_beta")、list_policies(tenant_id="ten_beta");
    • 判定结果:返回的数组中仅且仅包含 Tenant Beta 自行创建的资源;Tenant Alpha 的对应 ID 出现次数严格为 0。
  • 用例 NAMESPACE-01(同名路径独立互不冲突):
    • Tenant Alpha 在名下创建了 /api/v1/secret-model 路由;
    • Tenant Beta 随后在其名下也创建了相同的 /api/v1/secret-model 路由(指向 Beta 的独立上游);
    • 判定结果:数据库通过 uq_tenant_route_path UNIQUE (tenant_id, path_pattern) 保证两份路由独立共存、互不冲突、映射到各自租户上游。

3.3 垂直 RBAC 越权拦截 ​

在租户 ten_alpha 内部配置了具有 viewer 角色的只读成员 usr_viewer:

  • 用例 RBAC-01:usr_viewer 尝试创建 Project $\rightarrow$ 抛出 PermissionDeniedError (required_permission="project:create");
  • 用例 RBAC-02:usr_viewer 尝试创建 API Key $\rightarrow$ 抛出 PermissionDeniedError (required_permission="apikey:create");
  • 用例 RBAC-03:usr_viewer 尝试创建网关 Route $\rightarrow$ 抛出 PermissionDeniedError (required_permission="policy:write");
  • 用例 RBAC-04:usr_viewer 尝试创建财务 Policy $\rightarrow$ 抛出 PermissionDeniedError (required_permission="policy:write")。

3.4 API 路径与载荷混淆注入(Parameter Tampering) ​

通过 ASGI HTTP Client 模拟黑客发送特制篡改报文:

  • 用例 INJECT-01(伪造绑定):
    • 请求:POST /api/v1/tenants/ten_beta/agents
    • Body:{"project_id": "prj_alpha", "name": "Trojan Agent"}
    • 判定结果:服务层在创建 Agent 前校验 project.tenant_id == ten_beta,发现 prj_alpha 属于 ten_alpha,拦截并返回 HTTP 403 ERR_CROSS_TENANT_VIOLATION。

3.5 虚拟钱包与账本跨租户隔离 (Go Gateway) ​

在 Go Gateway 数据面建立 wal_alpha_001(可用余额 50 USDC)与 wal_beta_002(可用余额 10 USDC):

  • 用例 WALLET-01(资金操作绝对无交叉):
    • 对 Tenant Alpha 发起 5 USDC 的预冻结与确认实扣(Hold & Capture);
    • 判定结果:
      • Tenant Alpha 余额变动为:Available 45 USDC,Held 0 USDC;
      • Tenant Beta 余额变动为:Available 10 USDC,Held 0 USDC(100% 未受任何影响)。
  • 用例 WALLET-02(账本流水物理隔离):
    • 查询 Tenant Beta 关联的账本流水记录 GetLedgerEntries(ctx, "wal_beta_002");
    • 判定结果:返回记录数为 0,完全看不到 Tenant Alpha 的扣款审计记录。
  • 用例 WALLET-03(双轨对账独立平账):
    • 分别对两边执行 ReconcileBalance,各自依据自身的只追加账本流水重新计算缓存,两边均为 IsBalanced == true。

4. 结论与审计合规证明 ​

通过上述渗透测试套件(test_tenant_isolation_penetration.py、test_route_policy_lifecycle.py、test_member_rbac.py 与 wallet_isolation_test.go),全仓共计执行并通过了 285+ 项自动化测试。

测试结论:

  1. 多租户隔离完备性:AgentPay 在控制面(Python)与数据面(Go Gateway)均落地了不可逾越的租户所有权强校验;
  2. 越权防御有效性:所有已知的 IDOR、BOPLA、BFLA、参数混淆与跨租户注入攻击向量均被 100% 拦截并返回规范的 403 / 404 错误响应;
  3. 金融账本安全性:虚拟钱包账户、冻结记录与只追加记账流水具备完全独立的数据隔离边界。

T3.5 验收标准全部满足,本任务正式闭环签署。

实验性项目,未经独立安全审计,请勿用于生产资金。