跳转至

安全与沙箱

概述

安全是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处理 → 输出过滤 → 用户
                ↓                         ↓
            拒绝/修改                   脱敏/过滤

过滤规则

  • 有害内容:暴力、仇恨言论、色情
  • 违法内容:教唆犯罪、欺诈
  • 企业策略:竞品信息、保密数据
  • 合规要求:行业特定的内容限制

安全最佳实践

  1. 深度防御:多层安全机制,不依赖单一防线
  2. 默认拒绝:未明确允许的操作默认拒绝
  3. 审计日志:记录所有Agent操作用于事后审查
  4. 定期渗透测试:定期进行安全评估
  5. 紧急停止:设置紧急停止机制(kill switch)
  6. 安全更新:及时更新依赖和安全补丁

参考文献

  1. Greshake, K., et al. "Not what you've signed up for: Compromising Real-World LLM-Integrated Applications with Indirect Prompt Injection." AISec 2023.
  2. E2B. "Code Interpreter SDK." 2024.
  3. Google. "gVisor: Container Runtime Sandbox." 2024.

交叉引用: - 代码执行沙箱 → 代码执行与沙箱 - 可靠性 → 可靠性与鲁棒性 - 对齐安全 → 对齐与安全策略


评论 #