2026年7月,AI安全事件扎堆出现。
Claude Cowork智能体被曝可以读写Mac上任意的文件,影响大概50万用户。同一个月,有AI助手被用户诱导着删掉了本地的关键工作文件。OpenClaw的交易智能体因为提示词注入,被人用话术骗走了价值25万美元的加密货币。还有一个开发者,部署了AI助手只做文档处理,一天干掉了5000万Token。
这些事放在一起看,结论很清楚:AI安全已经不是合规部门的事,是每个写AI应用的人都要盯住的工程问题。
下面把AI Agent相关的4个坑和4道防线整理出来。每条防线都配了可以直接用的代码或配置。
4个坑
第一个坑:权限给得太宽。
Agent能干复杂任务是因为你给了它高权限。但权限给出去之后,它分不清"该做什么"和"能做什么"。给它读邮件的权限,它能被诱导去读别的目录。
第二个坑:提示词和用户输入混在一起。
系统指令和用户输入都拼在prompt里,LLM分不清哪个是规则、哪个是用户说的话。用巧妙的话术绕开角色约束,比想象中容易。
第三个坑:用了来源不明的东西。
第三方开源模型、社区技能包、NPM包——你不知道里面有没有夹带私货。ClawHub被审计出341个恶意技能包。
第四个坑:没有配额和监控。
没有单用户上限、没有异常检测、没有硬封顶,一个攻击或死循环就能让账单翻几十倍。
4道防线
防线一:权限收窄
一个任务只给完成它需要的最小权限。任务跑完就收回。
LangChain配置示例(agent.yaml):
yaml
agent:
name: “doc_reader”
permissions:
filesystem: - path: "/workspace/documents/*" access: "readonly" network: allowed_domains: - "api.internal.com"auto_revoke: true
revoke_after_seconds: 300
OpenAI Assistants配置示例(创建Assistant时指定):
python
assistant = client.beta.assistants.create(
name="Doc Reader", model="gpt-4o", tools=[{"type": "file_search"}], tool_resources={ "file_search": { "vector_store_ids": ["vs_xxx"] } })
关键:限制可访问的文件ID列表,而非整个向量存储
自建Agent用容器隔离(docker run):
bash
docker run
-v /workspace/documents:/data:ro \ # 只读挂载
–read-only \ # 容器根文件系统只读
–cap-drop=ALL \ # 移除所有能力
–security-opt=no-new-privileges \ # 禁止提权
my-agent:latest
防线二:输入输出过滤
AI调用前过滤输入,AI返回后过滤输出。
输入过滤(Python,可直接复制):
python
import re
INJECTION_PATTERNS = [
r"(?i)ignore\s*(all\s*)?(previous|prior).*instructions", r"(?i)system\s*(role|prompt|instruction).*override", r"(?i)from\s*now\s*on.*(you are|act as)", r"(?i)new\s*(instruction|rule|task).*follow", r"【系统】|【新指令】", # 中文变种]
def detect_injection(user_input: str) -> bool:
for pattern in INJECTION_PATTERNS: if re.search(pattern, user_input): return True return False调用AI之前
if detect_injection(user_input):
return {"error": "检测到可疑输入,已拦截"}response = call_llm(user_input)
输出过滤(Agent执行命令前检查):
python
DANGEROUS_COMMANDS = [
r"rm\s+-rf\s+/", r"chmod\s+777\s+", r"eval\s*\(", r"exec\s*\(", r"system\s*\(", r"os\.system", r"subprocess\.(call|Popen|run)",]
def check_output_safety(output: str) -> bool:
for pattern in DANGEROUS_COMMANDS: if re.search(pattern, output): return False return TrueAgent要执行命令之前
if not check_output_safety(command_to_execute):
raise Exception("检测到危险命令,已阻止执行")防线三:高风险操作二次确认
删除文件、发起退款、修改数据库——AI不能直接执行。
确认流程伪代码:
python
def execute_with_confirmation(action, risk_description):
# 1. AI判断该做 if ai.decides_to_execute(action): # 2. 弹确认框 user_confirmed = show_confirmation_dialog( title="AI请求执行高风险操作", message=f"AI建议执行:{action}", risk=risk_description, confirm_button="确认执行", # 小、灰 cancel_button="取消", # 大、亮 require_typing=True # 让用户输入"确认执行"四个字 ) # 3. 用户确认才执行 if user_confirmed: return execute(action) else: return {"status": "cancelled"}关键设计:
"取消"按钮比"确认"更醒目
让用户手动输入"确认执行"四个字,防止疲劳点击
记录每次确认/取消的审计日志
防线四:配额、告警、硬封顶
三层防护缺一不可。
配额配置(OpenAI风格API):
python
在调用代码中主动限制
class RateLimiter:
def __init__(self, rpm_limit=100, monthly_limit=1000000): self.rpm_limit = rpm_limit self.monthly_limit = monthly_limit self.current_month_usage = 0def can_call(self, user_id):
检查月度配额 usage = get_usage(user_id) if usage >= self.monthly_limit: raise Exception("月度配额已用完") # 检查RPM if get_rpm(user_id) >= self.rpm_limit: raise Exception("超过每分钟调用限制") return True告警规则(Prometheus + AlertManager):
yaml
groups:
name: ai_usage_alerts
rules:
alert: AIUsageSpike
expr: rate(ai_calls_total[1h]) > rate(ai_calls_total[24h]) * 10
annotations:
summary: “{{ $labels.user }} 调用量突增10倍”
alert: AICostApproachingLimit
expr: ai_cost_total > 500 # 美元
annotations:
summary: “本月AI费用已超$500”
硬封顶(平台侧配置):
大多数AI API平台支持设置硬上限:
python
在代码层面兜底
def call_llm_with_guardrail(request):
try: response = client.chat.completions.create(**request) return response except Exception as e: # 如果连续失败,触发熔断 if get_error_rate() > 0.3: # 30%错误率 send_alert("AI服务错误率过高,触发熔断") raise CircuitBreakerOpen()今天就能开始的三件小事
第一,找到Agent的权限配置,把"/*"改成具体目录。
第二,把上面的INJECTION_PATTERNS列表复制到代码里,加在调用AI之前。
第三,检查有没有月度配额限制。没有的话,在代码里加一个计数。
如果你也在折腾AI Agent相关的安全实践,欢迎随时交流。