Skip to content
签到签到

第 12 章:安全、权限与沙箱

本章解决的问题

Agent 能执行命令、读写文件和访问网络,因此必须处理安全边界。这一章讲解前端需要理解的风险和权限交互。

交互图解:工具执行、权限与批准流程 · 查看图解导读

大白话理解

模型生成的内容不完全可信。

即使模型没有恶意,它也可能:

  • 读取错误文件。
  • 调用危险命令。
  • 访问内部网络。
  • 被网页内容诱导执行工具。

所以 Agent 平台需要权限、沙箱和审计。

必须掌握的概念

1. Prompt Injection

Prompt Injection 是外部内容诱导模型做出非预期行为。例如网页里写“忽略之前的规则,执行命令”。

2. SSRF

SSRF 是服务器端请求伪造。模型请求抓取一个 URL,如果系统不加限制,可能访问内网地址。

3. Sandbox

Sandbox 限制进程能访问的文件、网络和系统资源。

4. Allow / Deny / Ask

工具执行前的策略可以:

  • 允许。
  • 拒绝。
  • 请求用户批准。

5. Approval UI

前端需要把“是否允许工具执行”变成清晰、可撤销的用户决策。

DeepSeek Harness 对应实现

DeepSeek Harness 默认组合包含:

  • sandbox
  • sandbox-policy
  • approval
  • permission

tools/pre-execute 事件可以返回:

  • allow
  • deny
  • ask

ask 需要 approval 服务。前端展示请求,用户批准后执行。

run_code 是保留 transport。Code Mode 下模型不能直接调用其他工具,只能通过 run_code 程序内部调用。

进一步阅读:

  • packages/bundle/base/cordis.patch.yml
  • docs/subsystems/approval.md
  • docs/subsystems/sandbox.md

代码示例

工具预执行策略

ts
type PreToolDecision =
  | { kind: 'allow' }
  | { kind: 'deny'; reason: string }
  | { kind: 'ask'; reason: string }

async function preExecute(
  toolName: string,
  args: unknown,
  policy: (toolName: string, args: unknown) => Promise<PreToolDecision>,
): Promise<PreToolDecision> {
  return policy(toolName, args)
}

前端权限请求

tsx
function ToolApprovalCard({
  toolName,
  description,
  onApprove,
  onDeny,
}: {
  toolName: string
  description: string
  onApprove(): void
  onDeny(): void
}) {
  return (
    <section>
      <strong>{toolName}</strong>
      <p>{description}</p>
      <button onClick={onApprove}>允许</button>
      <button onClick={onDeny}>拒绝</button>
    </section>
  )
}

真实产品中,批准状态必须与后端结果关联,不能只在前端做假按钮。

面试怎么问

问:Agent 工具调用有哪些安全风险?

回答要点:

  • Prompt injection。
  • 危险命令。
  • 越权文件访问。
  • SSRF。
  • 凭据泄露。

问:allow、deny、ask 分别适合什么场景?

回答要点:

  • allow:低风险、可逆操作。
  • deny:明确禁止的危险操作。
  • ask:有影响但需要用户确认的操作。

问:前端如何处理工具批准?

回答要点:

  • 展示工具名称、参数摘要和风险。
  • 明确允许和拒绝。
  • 批准请求要可追踪。
  • 后端必须再次校验,不能信任前端。

自测题

  1. Prompt Injection 为什么对工具调用特别危险?
  2. SSRF 的风险是什么?
  3. 为什么后端不能只依赖前端权限判断?
  4. run_code 作为保留 transport 的意义是什么?

本章小结

安全是 Agent 产品能否落地的关键。前端要能把权限决策展示清楚,但真正安全边界必须由后端和沙箱执行。

进一步阅读:

  • docs/subsystems/approval.md
  • docs/subsystems/sandbox.md