🧠 图解记忆:用沙箱限制行动,用验证器评结果,用审计支持复现;点击图片可查看原图。
> 面 Agent 岗最容易被追问的一题:Agent 有工具调用能力后,Harness 就不只是"测试台"了,它还承担"安全边界"职责。能讲清"安全沙箱 = 权限管控 + 自动化评测"双重定位的候选人,直接和只会写单测的人拉开差距。💡 答案要点
一句话本质:
Agent Harness = 安全沙箱(约束 Agent 能做什么)+ 评测台(验证 Agent 做得好不好)。前者管权限边界,后者管质量边界,两者共用同一套"工具调用可观测"基础设施。
为什么 Agent 比传统服务更需要沙箱:
传统服务:输入 → 固定代码路径 → 输出(行为可穷举、可审计)
Agent:输入 → LLM 自主决策 → 调用任意工具 → 副作用(行为不可穷举)
风险:LLM 可能被 prompt injection 劫持、可能选错工具、可能用错参数
→ 必须把 Agent 的行为空间框在沙箱里,而不是事后追责权限管控四件套(回答必带):
| 手段 | 做法 | 拦截对象 |
|---|---|---|
| 工具白名单 | Agent 只能调用注册过的工具,未注册一律拒绝 | 模型自己发明/拼接工具调用 |
| 最小权限 | 每个工具声明所需 scope,读的不能写、写的不能删 | 越权操作(OWASP MCP02 Scope Creep) |
| 沙箱隔离 | 危险工具(bash/文件写/网络请求)跑在容器/子进程/受限环境,限制网络出口 | 注入指令触发的破坏性操作 |
| HITL + 审计 | 高风险操作(转账、删除、外发)必须人工审批;全链路结构化日志可回放 | 不可逆副作用 + 事后无法溯源 |
python
# 沙箱化工具调用伪代码
class AgentHarness:
def call_tool(self, agent_id, tool_name, args):
# 1. 白名单校验
if tool_name not in self.tool_registry:
raise ToolNotAllowed(tool_name)
# 2. 权限校验(scope 最小化)
scope = self.tool_registry[tool_name].required_scope
if not self.has_scope(agent_id, scope):
raise PermissionDenied(tool_name)
# 3. 危险操作人审
if self.tool_registry[tool_name].needs_approval(args):
return self.request_human_approval(agent_id, tool_name, args)
# 4. 沙箱执行 + 结构化日志(供评测回放)
with self.sandbox(tool_name) as box:
result = box.execute(tool_name, args)
self.audit.append(agent_id, tool_name, args, result)
return result自动化评测怎么和沙箱结合(闭环):
评测集(含期望的工具调用序列)
→ 沙箱内跑 Agent
→ 对比实际轨迹 vs 期望轨迹(工具选对没、参数传对没、有没有多余调用)
→ 触发规则:越权尝试(未授权工具被调用)直接判失败 + 告警
→ 回归报告,红了就回滚两个加分视角:
- 红队化:把"恶意输入/注入样本"也纳入评测集,沙箱评测 = 功能回归 + 安全回归一起跑(呼应 OWASP Agent Top 10 的 Prompt Injection)。
- 成本上限:沙箱同时约束 token/调用次数预算,防"成本攻击"(Agent09)——每个会话设调用次数和金额上限,超限熔断。
面试话术:
"我理解的 Harness 在 Agent 场景下是双重定位:安全沙箱 + 评测台。安全上做四件事——工具白名单、最小权限 scope、危险操作容器隔离、高风险动作人工审批加审计;评测上把期望的工具调用序列写进用例,沙箱里跑完对比实际轨迹,越权尝试直接判失败。安全评测和功能评测共用同一套日志,红队注入样本也进评测集,这样每次改动跑一遍就等于安全回归。"
