Skip to content
签到签到

进阶第 11 章:安全与沙箱

业务问题

AI 编码助手会执行命令和修改文件。客服 Agent 会访问用户数据。安全边界决定产品能否上线。

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

核心原理

主要风险:

  • Prompt injection:外部内容诱导模型执行危险动作。
  • SSRF:模型抓取 URL 时访问内网。
  • 危险工具:删除文件、执行任意命令、泄露凭据。
  • 权限漂移:用户批准后上下文变化。

防护层次:

text
输入识别
-> 工具能力限制
-> 权限策略
-> 沙箱执行
-> 审计日志

真实项目中的映射

编码助手:

  • 读文件通常低风险。
  • 写文件需要批准。
  • 执行命令需要沙箱。

客服 Agent:

  • 查询订单需要权限。
  • 修改订单需要批准。
  • 外部网页内容不能被完全信任。

DeepSeek Harness 对应实现

DeepSeek Harness 默认组合包含 sandbox、permission、approval。

tools/pre-execute 可以返回 allow、deny 或 ask。ask 由 approval 服务处理。

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

进一步阅读:

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

代码示例

ts
type ToolPermission = 'allow' | 'deny' | 'ask'

interface ToolPolicy {
  toolName: string
  permission: ToolPermission
}

function decidePermission(
  toolName: string,
  args: unknown,
  policies: ToolPolicy[],
): ToolPermission {
  const policy = policies.find(item => item.toolName === toolName)
  return policy?.permission ?? 'ask'
}

真实权限系统还要考虑参数、作用域、会话和用户身份。

面试追问

问:什么是 Prompt Injection?

回答要点:

  • 外部内容被模型当作指令。
  • 可能导致工具调用。
  • 文件、网页、邮件都可能注入。
  • 需要限制工具能力和强制批准。

问:为什么 SSRF 对 Agent 很危险?

回答要点:

  • 模型可能请求内网 URL。
  • 可能读取云元数据。
  • 必须限制协议、域名和网络范围。

问:Human-in-the-loop 应该加在哪?

回答要点:

  • 高风险工具执行前。
  • 权限变更前。
  • 结果影响不可逆时。
  • 前端展示批准请求,后端负责最终执行。

实践任务

为“执行命令”和“修改订单”设计策略,并列出哪些情况必须 ask。

验收标准

  • 能解释 Prompt Injection 和 SSRF。
  • 能设计 allow/deny/ask 策略。
  • 能说明前后端安全责任边界。