跳转到内容
Guide

OWASP 代理应用程序前 10 名:API 开发人员需要更改哪些内容

| 10 min read

OWASP 代理应用程序前 10 名列出了现有 API 安全性遗漏的风险。 API 开发人员本周可以通过代码发布五个修复程序。

Shield icon on dark background representing application security framework
Photo by FLY:D on Unsplash

您的 API 具有速率限制、BOLA 检查和输入验证。 人工智能代理通过以下方式绕过所有三个 将六个授权端点链接到威胁模型从未考虑过的权限升级路径中。 2026 年初报告中的 520 起工具滥用事件证实这不是理论上的。

OWASP 于 2026 年发布了 2026 年代理应用程序 Top 10,由来自 100 多名安全研究人员构建 思科、微软、谷歌以及更广泛的社区。 该列表针对新的威胁面:自主 人工智能代理可以调用您的 API、保留记忆并在未经人类批准的情况下做出决策。

原来的 OWASP API 安全性前 10 名 假设 人类单击按钮并触发一个请求。 代理列表假设一台机器发出 50 个请求 在一条链中,每个人都受到先前响应的通知,循环中没有人。 相同的API,不同的 攻击者简介。

本指南涵盖了 API 开发人员可以在 API 层修复的五种 OWASP 代理风险,其中 您可以在本周发布工作代码。

代理操作层:为什么您的 API 成为攻击面

API 已经发展成为安全研究人员现在所说的“代理操作层”。 每个工具 AI 代理使用,无论是订购库存、查询数据库还是发送通知,都会映射到 API 调用。 代理不与 UI 交互。 它读取您的 OpenAPI 规范、发现端点并 按顺序调用它们。

48.9% 的组织无法了解机器到机器的流量。 这意味着所有 API 的一半 基础设施无法区分人类用户和自主代理。 如果你不能告诉 差异,你不能强制执行不同的规则。

OWASP Agentic Top 10 涵盖:过度代理、及时注入、供应链漏洞、 内存中毒、工具滥用和权限提升、级联故障、不安全的输出处理、 日志记录不足、数据泄露和沙箱不足。 本指南重点关注五种风险 你在API层修复。

1. 代理过多:代理调用不该调用的端点

客户支持代理需要读取订单状态。 您给它一个 API 密钥,可以访问您的整个 API。 代理发现它还可以取消订单、退款和删除帐户。 过度 代理是指代理拥有其任务之外的权限。

这是 OWASP API5 的代理等效项(破坏的功能级授权),但是攻击 向量不同。 人类攻击者通过源代码或 URL 猜测发现管理端点。 代理通过您的 OpenAPI 规范或工具清单发现它们。 代理不需要猜测; 你递给它完整的菜单。

修复:范围内的 API 密钥和端点白名单

为每个代理创建一个 API 密钥。 每个键都映射到允许端点的显式列表。 拒绝任何 该列表之外的请求。

// Scoped API key configuration per agent
const agentPermissions = {
  "agent-order-bot": {
    allowedEndpoints: [
      "GET /api/orders/:id",
      "GET /api/orders/:id/status"
    ],
    rateLimit: { requests: 20, windowSeconds: 60 },
    maxChainDepth: 3
  },
  "agent-support-bot": {
    allowedEndpoints: [
      "GET /api/orders/:id",
      "POST /api/tickets",
      "GET /api/tickets/:id"
    ],
    rateLimit: { requests: 10, windowSeconds: 60 },
    maxChainDepth: 5
  }
};

// Middleware: check agent scope before processing
function enforceAgentScope(req, res, next) {
  const agentId = req.headers["x-agent-id"];
  const permissions = agentPermissions[agentId];

  if (!permissions) {
    return res.status(403).json({ error: "Unknown agent" });
  }

  const route = \`\${req.method} \${req.route.path}\

要在处理之前验证代理的 JWT 是否具有正确的范围,请检查令牌声明。 这 /v1/jwt/decode 端点无需签名密钥即可解码任何 JWT,因此您可以 在开发期间和 CI 管道中审核令牌内容:

curl -s -X POST https://api.botoi.com/v1/jwt/decode \\
  -H "Content-Type: application/json" \\
  -H "X-API-Key: YOUR_API_KEY" \\
  -d '{
    "token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhZ2VudC1vcmRlci1ib3QiLCJzY29wZSI6Im9yZGVycy5yZWFkIiwiaWF0IjoxNzQ5NTY0ODAwLCJleHAiOjE3NDk1NjgwMDB9.signature"
  }'

回复:

{
  "success": true,
  "data": {
    "header": {
      "alg": "RS256",
      "typ": "JWT"
    },
    "payload": {
      "sub": "agent-order-bot",
      "scope": "orders.read",
      "iat": 1749564800,
      "exp": 1749568000
    }
  }
}

scope 索赔说 orders.read。 如果该代理致电 POST /api/orders/:id/cancel,您的中间件应该在请求到达之前拒绝该请求 你的处理者。

2. 工具滥用和权限升级:代理链接 API 调用

早期报告中记录了 520 起工具滥用事件,使其成为最常见的代理威胁。 的 模式:代理调用端点 A,从响应中提取数据,然后使用该数据调用 端点 B 以开发人员从未预料到的方式。

例子: Stripe 集成代理可以访问 GET /api/customers/:idPOST /api/refunds。 代理读取客户的付款历史记录,识别 最高价值的交易,并向自身退款。 每个单独的调用都会经过授权。 链条就是漏洞。

修复:每个代理的速率限制和链深度跟踪

标准速率限制对每个 IP 或每个 API 密钥的请求进行计数。 代理速率限制增加了两个维度:

  • 每个工具的限制: 限制单个代理可以在窗口内调用特定端点的次数
  • 链深度限制: 跟踪代理在单个会话中进行的连续 API 调用次数,并在定义的阈值处切断它
速率限制类型 它捕获什么 谁需要它
每个IP DDoS、撞库 每个API
每个 API 密钥 滥用个人消费者 每个API
每个代理每个工具 代理循环调用一个端点 代理使用的 API
链条深度 多步权限提升 代理使用的 API

要求代理商发送 X-Agent-Session 标头。 跟踪每个会话的呼叫计数。 当 计数超出阈值,返回 429 并包含明确的错误消息。

3. 日志记录不足:无法查看代理 API 调用

48.9% 的组织对机器到机器的流量视而不见。 当代理利用您的 API 时,您 需要回答:哪个代理? 哪些端点? 按什么顺序? 在什么时间窗口? 标准访问日志 显示 IP 地址和时间戳。 它们不显示特工身份或呼叫序列。

OWASP 代理列表将日志记录不足标记为最高风险,因为代理攻击看起来像 授权流量。 每个单独的请求都会通过身份验证。 该漏洞利用的模式如下 多个请求。

修复:需要归因标头和日志调用链

为代理消费者添加三个必需的标头:

  • X-Agent-ID:代理的唯一标识符(与其 API 密钥相关)
  • X-Agent-Session:当前任务或对话的标识符
  • User-Agent:代理框架和版本(例如, LangChain/0.3.1
// Middleware: log every agent request with attribution
function agentAuditLog(req, res, next) {
  const logEntry = {
    timestamp: new Date().toISOString(),
    agentId: req.headers["x-agent-id"] || "unknown",
    apiKey: req.headers["x-api-key"]?.slice(-8) || "none",
    method: req.method,
    path: req.path,
    sessionId: req.headers["x-agent-session"] || "none",
    ip: req.ip,
    userAgent: req.headers["user-agent"]
  };

  // Structured JSON log for your SIEM
  console.log(JSON.stringify(logEntry));

  // Track chain depth per session
  const session = req.headers["x-agent-session"];
  if (session) {
    const depth = chainTracker.increment(session);
    if (depth > MAX_CHAIN_DEPTH) {
      return res.status(429).json({
        error: "Agent chain depth exceeded",
        maxDepth: MAX_CHAIN_DEPTH,
        currentDepth: depth
      });
    }
  }

  next();
}

该中间件将每个请求记录为结构化 JSON,并输入到任何 SIEM 或日志聚合器中。 它还通过跟踪每个会话的顺序调用来强制链深度。 当你调查一个事件时, 您可以通过过滤来重建完整的链 sessionId

4. 不安全的输出处理:代理信任 API 响应而不进行验证

代理调用您的 API,接收 JSON 响应,并将其传递到其链中的下一步。 如果 响应包含意外字段、错误类型或注入内容,代理会传播问题 下游。 这是 OWASP API10(API 的不安全消费)的代理等效项,放大为 事实上,代理会自动处理响应,无需人工审核。

例子: 竞争对手破坏了第三方定价 API。 代理获取产品 价格,收到带有操纵的响应 price 字段设置为0.01,并下订单 以那个价格。 没有人看到过这个回应。

修复:根据 JSON 模式验证每个响应

首先从已知良好的响应生成模式。 这 /v1/schema/json-to-jsonschema 端点从任何示例 JSON 生成 JSON 模式:

curl -s -X POST https://api.botoi.com/v1/schema/json-to-jsonschema \\
  -H "Content-Type: application/json" \\
  -H "X-API-Key: YOUR_API_KEY" \\
  -d '{
    "json": {
      "orderId": "ord_12345",
      "status": "shipped",
      "total": 49.99,
      "items": [
        { "sku": "WIDGET-A", "quantity": 2 }
      ]
    }
  }'

回复:

{
  "success": true,
  "data": {
    "schema": {
      "type": "object",
      "properties": {
        "orderId": { "type": "string" },
        "status": { "type": "string" },
        "total": { "type": "number" },
        "items": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "sku": { "type": "string" },
              "quantity": { "type": "integer" }
            }
          }
        }
      }
    }
  }
}

然后根据该架构验证您的代理收到的每个响应。 这 /v1/schema/validate 端点根据任何 JSON 模式检查 JSON 对象并返回特定错误:

curl -s -X POST https://api.botoi.com/v1/schema/validate \\
  -H "Content-Type: application/json" \\
  -H "X-API-Key: YOUR_API_KEY" \\
  -d '{
    "schema": {
      "type": "object",
      "required": ["orderId", "status", "total"],
      "properties": {
        "orderId": { "type": "string" },
        "status": { "type": "string", "enum": ["pending", "shipped", "delivered"] },
        "total": { "type": "number", "minimum": 0 }
      },
      "additionalProperties": false
    },
    "data": {
      "orderId": "ord_12345",
      "status": "shipped",
      "total": 49.99,
      "internalNote": "rush order"
    }
  }'

回复:

{
  "success": true,
  "data": {
    "valid": false,
    "errors": [
      {
        "path": "",
        "message": "must NOT have additional properties: internalNote"
      }
    ]
  }
}

验证捕获 internalNote,一个不属于响应的字段。 如果一个API 开始返回意外字段,您的代理将停止处理而不是向下游传递受污染的数据。

以下是使用 Botoi Node.js SDK 的完整模式:

import Botoi from "botoi";

const botoi = new Botoi({ apiKey: process.env.BOTOI_API_KEY });

// Step 1: generate a schema from a known-good response
const schemaResult = await botoi.schema.jsonToJsonschema({
  json: knownGoodResponse
});
const responseSchema = schemaResult.data.schema;

// Step 2: validate every agent-received response against that schema
async function validateAgentResponse(response) {
  const validation = await botoi.schema.validate({
    schema: responseSchema,
    data: response
  });

  if (!validation.data.valid) {
    console.error("Response failed validation:", validation.data.errors);
    throw new Error("Untrusted response rejected by schema validation");
  }

  return response;
}

5. 供应链漏洞:工具定义受损

AI 代理通过 MCP 服务器、OpenAPI 规范和工具清单发现工具。 如果攻击者修改了 工具定义,代理调用不同的端点,将数据发送到不同的服务器,或执行 参数与开发人员预期不同。

例子: 您使用定义了 30 个工具的开源 MCP 服务器。 攻击者提交 更改一个工具的 API URL 的拉取请求 api.stripe.comapi.str1pe.com。 该更改通过了代码审查,因为它是单个字符。 您的代理人 现在将付款数据发送到攻击者的服务器。

修复:哈希工具定义并在运行时验证

在部署时对每个工具定义进行哈希处理。 在您的代理在运行时注册工具之前,再次对其进行哈希处理 并进行比较。 这 /v1/hash 端点生成任何字符串的 SHA-256 哈希值:

curl -s -X POST https://api.botoi.com/v1/hash \\
  -H "Content-Type: application/json" \\
  -H "X-API-Key: YOUR_API_KEY" \\
  -d '{
    "text": "{\\"name\\":\\"get_order_status\\",\\"description\\":\\"Retrieve current order status by order ID\\",\\"parameters\\":{\\"orderId\\":\\"string\\"}}",
    "algorithm": "sha256"
  }'

回复:

{
  "success": true,
  "data": {
    "hash": "a3f2b8c1d4e5f67890abcdef1234567890abcdef1234567890abcdef12345678",
    "algorithm": "sha256"
  }
}

以下是使用 Botoi SDK 的完整完整性检查工作流程:

import Botoi from "botoi";
import fs from "fs";

const botoi = new Botoi({ apiKey: process.env.BOTOI_API_KEY });

// Hash every tool definition at deploy time
const toolDefs = JSON.parse(fs.readFileSync("./mcp-tools.json", "utf-8"));
const hashes = {};

for (const tool of toolDefs) {
  const result = await botoi.hash.sha256({
    text: JSON.stringify(tool)
  });
  hashes[tool.name] = result.data.hash;
}

fs.writeFileSync("./tool-hashes.json", JSON.stringify(hashes, null, 2));

// At runtime, verify before registering any tool
async function verifyToolIntegrity(tool) {
  const result = await botoi.hash.sha256({
    text: JSON.stringify(tool)
  });
  const expected = hashes[tool.name];

  if (result.data.hash !== expected) {
    throw new Error(
      \`Tool "\${tool.name}" failed integrity check. \\n\` +
      \`Expected: \${expected}\\n\` +
      \`Got: \${result.data.hash}\`
    );
  }
}

在 CI 管道中运行哈希生成步骤。 将哈希文件与部署一起存储 神器。 在运行时,每个工具在注册之前都会经过验证。 任意一个字符发生改变 工具定义触发硬故障。

OWASP 代理前 10 名与 API 安全前 10 名:比较

这两个列表是相辅相成的。 以下是五种代理风险如何映射到最接近的 API 安全性 对应内容以及变化:

代理风险 最接近的API安全风险 代理商有何变化
过度代理 API5 功能验证失效 代理根据规范发现所有端点; 每个代理的范围键
工具滥用 API4资源消耗 特工们连续呼吁升级; 添加链深度限制
日志记录不足 没有直接等价物 代理呼叫看起来像是授权流量; 添加归因标题
不安全的输出 API10不安全消费 代理无需人工审核即可处理响应; 添加模式验证
供应链 没有直接等价物 受损工具会重定向代理流量; 添加完整性哈希值

发布清单:代理 API 安全性的五个修复

每个修复都是独立的。 选择一个,发货,然后移至下一个。

使固定 该怎么办 Botoi端点
范围内的 API 密钥 每位代理人一把钥匙; 每个密钥的白名单端点 /v1/jwt/decode
每个代理的速率限制 跟踪每个工具和每个会话的链深度
归因标头 需要X-Agent-ID、X-Agent-Session; 日志结构化 JSON
响应验证 从良好的响应中生成模式; 验证所有代理响应 /v1/schema/validate, /v1/schema/json-to-jsonschema
工具完整性 部署时的哈希工具定义; 在运行时验证 /v1/hash

接下来会发生什么

完整的 OWASP 代理应用程序前 10 名位于 owasp.org。 思科、微软和谷歌都在 RSAC 2026 上宣布了代理安全计划,所以期待 工具和标准将在今年剩余时间内快速发展。

列表中剩余的五个风险(提示注入、内存中毒、级联故障、数据 泄漏和沙盒不足)需要在代理框架层而不是 API 层进行修复。 如果 如果您运行代理框架,请阅读完整的 OWASP 文档。 如果您运行 API,则上述五个修复是 你的起点。

从范围内的 API 密钥开始。 这一单一的改变阻止了大多数过度的代理和工具滥用 场景。 然后添加归因标头,以便您可以看到代理正在做什么。 其余部分来自 能见度。

FAQ

OWASP 代理应用程序前 10 名与 OWASP API 安全前 10 名有何不同?
API 安全 Top 10 (2023) 解决了来自人类消费者的风险:授权失效、身份验证缺陷、数据过度暴露。 代理应用程序前 10 名 (2026) 解决了自主人工智能代理带来的风险,这些代理链接 API 调用、跨会话保留内存以及在没有人工监督的情况下做出决策。 两个列表都适用于 API,但代理列表针对的是原始列表从未预料到的机器对机器模式。
什么是代理申请中的过度代理?
当 AI 代理有权访问 API 端点或执行超出其任务要求的操作时,就会发生过度代理。 例如,有权访问计费、退款和帐户删除端点的客户支持代理可以将这些呼叫链接起来,以升级到远远超出回答问题的范围。 修复的方法是限定范围的 API 密钥,将每个代理限制到其所需的确切端点。
我是否需要重建 API 以实现代理安全?
不,您不需要重建。 本指南中涵盖的五个修复(范围 API 密钥、每个工具的速率限制、请求归因标头、响应架构验证和工具定义完整性检查)是对现有 API 的补充。 您可以单独运送每一件。
为什么工具滥用是最常见的代理应用程序威胁?
早期报告中记录了 520 起工具滥用和权限升级事件,因为代理以开发人员从未想过的方式链接 API 调用。 单个代理可以调用​​读取端点,解析响应,然后使用第一次调用中的数据来调用写入端点以升级权限。 大多数 API 没有机制来检测或阻止单个代理会话中的多步骤链。
如何将 API 请求归因于特定的 AI 代理?
将所需的 X-Agent-ID 标头添加到您的 API。 每个代理都会获得与其作用域 API 密钥相关联的唯一标识符。 记录每个请求的 API 密钥和代理 ID。 这为您提供了完整的审计跟踪,包括哪个代理调用了哪个端点、何时以及以什么顺序。

开始使用 botoi 构建

150+ 个 API 端点,涵盖查询、文本处理、图片生成和开发者工具。免费套餐,无需信用卡。