第 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 默认组合包含:
sandboxsandbox-policyapprovalpermission
tools/pre-execute 事件可以返回:
allowdenyask
ask 需要 approval 服务。前端展示请求,用户批准后执行。
run_code 是保留 transport。Code Mode 下模型不能直接调用其他工具,只能通过 run_code 程序内部调用。
进一步阅读:
packages/bundle/base/cordis.patch.ymldocs/subsystems/approval.mddocs/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:有影响但需要用户确认的操作。
问:前端如何处理工具批准?
回答要点:
- 展示工具名称、参数摘要和风险。
- 明确允许和拒绝。
- 批准请求要可追踪。
- 后端必须再次校验,不能信任前端。
自测题
- Prompt Injection 为什么对工具调用特别危险?
- SSRF 的风险是什么?
- 为什么后端不能只依赖前端权限判断?
run_code作为保留 transport 的意义是什么?
本章小结
安全是 Agent 产品能否落地的关键。前端要能把权限决策展示清楚,但真正安全边界必须由后端和沙箱执行。
进一步阅读:
docs/subsystems/approval.mddocs/subsystems/sandbox.md