安全与沙箱
概述
安全是AI Agent部署中最关键的考量因素。Agent能够执行代码、调用API、操作文件系统,这意味着安全漏洞可能导致严重后果。本节系统讨论Agent的沙箱技术、权限模型、提示注入防御和数据保护策略。
沙箱策略
沙箱技术对比
| 技术 | 隔离级别 | 性能开销 | 安全性 | 适用场景 |
|---|---|---|---|---|
| Docker | 容器级 | 低 | 中 | 通用场景 |
| gVisor | 内核级 | 中 | 高 | 高安全需求 |
| E2B | 微型VM | 中 | 高 | 代码执行 |
| Firecracker | 微型VM | 低 | 高 | AWS Lambda |
| WebAssembly | 进程内 | 极低 | 中 | 轻量级隔离 |
Docker沙箱
# 安全的Agent代码执行沙箱
FROM python:3.11-slim
# 安全加固
RUN apt-get update && apt-get install -y --no-install-recommends \
&& rm -rf /var/lib/apt/lists/*
# 非root用户
RUN useradd -m -s /bin/bash sandbox
USER sandbox
WORKDIR /home/sandbox
# 限制网络访问(通过Docker网络策略)
# 限制文件系统访问(只读挂载)
# 限制资源使用(Docker资源限制)
启动参数:
docker run \
--memory=512m \
--cpus=1 \
--network=none \ # 禁止网络访问
--read-only \ # 只读文件系统
--tmpfs /tmp:size=100m \ # 临时写入空间
--security-opt no-new-privileges \
--pids-limit=50 \ # 限制进程数
agent-sandbox
gVisor
gVisor 提供应用层内核,拦截所有系统调用:
graph TD
A[Agent代码] --> B[gVisor Sentry]
B --> C{系统调用}
C -->|允许| D[gVisor内核实现]
C -->|拒绝| E[返回错误]
D --> F[宿主机内核]
style B fill:#fff3e0
style E fill:#ffcdd2
优势:
- 比Docker更强的隔离(实现了Linux内核子集)
- 兼容现有容器镜像
- Google Cloud Run 默认使用
E2B(Code Interpreter SDK)
专为AI Agent设计的代码执行沙箱:
from e2b_code_interpreter import Sandbox
sandbox = Sandbox()
# 安全执行Agent生成的代码
execution = sandbox.run_code("""
import pandas as pd
df = pd.read_csv('data.csv')
print(df.describe())
""")
print(execution.logs)
sandbox.close()
特性:
- 每次执行创建全新的微型VM
- 支持文件上传和下载
- 内置超时和资源限制
- 支持Python、JavaScript、R等语言
权限模型
最小权限原则
Agent应只拥有完成任务所需的最少权限:
\[
\text{Permissions}(agent) = \min\{P : P \text{ sufficient for task}\}
\]
能力基础权限(Capability-based)
# 能力基础的权限模型
class AgentCapabilities:
def __init__(self):
self.capabilities = {
"file_read": {
"allowed_paths": ["/workspace/*"],
"denied_paths": ["/etc/*", "/root/*"],
},
"file_write": {
"allowed_paths": ["/workspace/output/*"],
"max_file_size": "10MB",
},
"network": {
"allowed_domains": ["api.openai.com", "pypi.org"],
"denied_ports": [22, 23, 3389],
},
"code_execution": {
"allowed_languages": ["python"],
"timeout": 30, # 秒
"max_memory": "512MB",
},
}
def check_permission(self, action, resource):
cap = self.capabilities.get(action)
if cap is None:
return False # 默认拒绝
return self._match_resource(cap, resource)
分层权限
| 权限级别 | 允许操作 | 需要审批 |
|---|---|---|
| Level 0 | 只读(搜索、阅读) | 无 |
| Level 1 | 创建(新文件、新消息) | 无 |
| Level 2 | 修改(编辑文件、更新数据) | 首次需确认 |
| Level 3 | 删除/发送(删除文件、发送邮件) | 每次需确认 |
| Level 4 | 系统操作(安装软件、修改配置) | 人工审批 |
提示注入防御
攻击类型
graph TD
A[提示注入攻击] --> B[直接注入]
A --> C[间接注入]
B --> B1[用户直接输入恶意指令]
C --> C1[网页内容包含隐藏指令]
C --> C2[文档中嵌入恶意文本]
C --> C3[工具返回值包含注入]
style A fill:#ffcdd2
style C fill:#fff3e0
输入验证
class InputValidator:
# 可疑模式检测
SUSPICIOUS_PATTERNS = [
r"ignore\s+(previous|above|all)\s+instructions",
r"you\s+are\s+now\s+",
r"new\s+instructions?\s*:",
r"system\s*prompt\s*:",
r"</?(system|user|assistant)>",
]
def validate(self, user_input: str) -> tuple[bool, str]:
for pattern in self.SUSPICIOUS_PATTERNS:
if re.search(pattern, user_input, re.IGNORECASE):
return False, f"Suspicious pattern detected: {pattern}"
return True, "OK"
输出过滤
在Agent输出到用户之前进行安全检查:
- PII检测:检测并脱敏个人身份信息
- 内容策略:过滤有害、违规内容
- 格式验证:确保输出格式符合预期
- 链接检查:验证生成的URL安全性
防御策略总结
| 策略 | 防御层 | 实现难度 | 效果 |
|---|---|---|---|
| 输入验证 | 输入层 | 低 | 中 |
| 系统提示加固 | 提示层 | 低 | 中 |
| 输出过滤 | 输出层 | 中 | 高 |
| 工具权限控制 | 执行层 | 中 | 高 |
| 沙箱隔离 | 基础设施层 | 高 | 高 |
| 多模型审核 | 审核层 | 高 | 很高 |
PII保护
个人信息类型
| 类型 | 示例 | 风险级别 |
|---|---|---|
| 姓名 | 张三 | 中 |
| 身份证号 | 110101199001011234 | 高 |
| 电话号码 | 13800138000 | 高 |
| 邮箱地址 | user@example.com | 中 |
| 银行卡号 | 6222021234567890 | 极高 |
| 地址 | 北京市朝阳区... | 中 |
脱敏策略
\[
\text{Redacted}(text) = \text{replace}(text, \text{PII}_i, \text{mask}_i) \quad \forall i
\]
# PII脱敏示例
def redact_pii(text):
# 手机号
text = re.sub(r'1[3-9]\d{9}', '[PHONE]', text)
# 身份证号
text = re.sub(r'\d{17}[\dXx]', '[ID_NUMBER]', text)
# 邮箱
text = re.sub(r'\S+@\S+\.\S+', '[EMAIL]', text)
# 银行卡号
text = re.sub(r'\d{16,19}', '[CARD_NUMBER]', text)
return text
内容过滤
多层过滤架构
用户输入 → 输入过滤 → Agent处理 → 输出过滤 → 用户
↓ ↓
拒绝/修改 脱敏/过滤
过滤规则
- 有害内容:暴力、仇恨言论、色情
- 违法内容:教唆犯罪、欺诈
- 企业策略:竞品信息、保密数据
- 合规要求:行业特定的内容限制
安全最佳实践
- 深度防御:多层安全机制,不依赖单一防线
- 默认拒绝:未明确允许的操作默认拒绝
- 审计日志:记录所有Agent操作用于事后审查
- 定期渗透测试:定期进行安全评估
- 紧急停止:设置紧急停止机制(kill switch)
- 安全更新:及时更新依赖和安全补丁
参考文献
- Greshake, K., et al. "Not what you've signed up for: Compromising Real-World LLM-Integrated Applications with Indirect Prompt Injection." AISec 2023.
- E2B. "Code Interpreter SDK." 2024.
- Google. "gVisor: Container Runtime Sandbox." 2024.