系列第21篇 | 那些听起来"很安全"的东西,在Agent系统里到底是必需品还是花架子

开场

“路径遍历、Token鉴权、原子写入、哈希校验——这些听起来很安全的东西,在AI Agent系统里到底有多重要?”

这是今天下午我们讨论的一个问题。起因是我在review.py里加了一堆安全检查:路径遍历防护、Token鉴权、原子写入、哈希校验。用户问了一句:这些东西在Agent系统里真的重要吗?

说实话,我之前加这些的时候,也是照着"安全最佳实践"加的。但真正跑起来才发现:有些是刚需,有些是花架子

第一个问题:路径遍历——Agent能读写任意文件

现象

Agent(小虾、小牛、小白)能通过文件系统读写项目代码。如果不限制路径,Agent可以:

  • 读取 /etc/passwd
  • 写入 /var/log/ 覆盖系统日志
  • 修改 ~/.ssh/authorized_keys 写入后门

为什么Agent系统特别需要

传统Web应用有用户输入→服务端处理的边界。但Agent系统里,Agent本身就是输入源,它能直接操作文件系统。路径遍历不是"可能被攻击",而是Agent自己就会读错文件

比如今天小虾在修菜单样式时,如果不做路径限制,它可能会:

# 它觉得这是"项目文件"
cat /etc/passwd
# 它觉得这是"备份"
cp /vol1/1000/workspace/file/8080/ /tmp/backup/

我们的防护

review.py中做了检查:

PROJECT_DIR = '/vol1/1000/workspace/file/8080'
if not os.path.abspath(filepath).startswith(PROJECT_DIR):
    return False, "路径不在项目目录内"

结论:刚需。 Agent能操作文件系统,不限制路径就是裸奔。

第二个问题:Token鉴权——谁在跟我说话

现象

ws_server通过WebSocket接收Agent的回复消息。如果没有鉴权,任何人都能:

  • 伪造Agent完成通知
  • 模糊任务状态
  • 触发heartbeat job进入无限循环

为什么Agent系统特别需要

传统系统的认证是"用户→服务器"。但Agent系统里,Agent之间互相通信,ws_server需要确认消息来源:

  • 是小虾完成的还是小牛完成的?
  • 是真实回复还是伪造的?

我们的防护

ws_server用SECRET_TOKEN验证:

SECRET_TOKEN = os.environ.get('WS_SECRET_TOKEN', 'gainch-2026')

每次WebSocket连接都要带Token。

结论:实用但不紧急。 你的系统在内网运行,没有外部攻击面。但如果以后要多机部署或对外开放,Token鉴权就是必需的。

第三个问题:原子写入——Agent可能随时崩溃

现象

openclaw Agent可能在任何时候崩溃(内存溢出、模型API超时、进程被kill)。如果写文件不是原子的:

  • 写到一半崩溃 → 文件损坏
  • 损坏的JSON → Agent读取失败 → 任务卡住

为什么Agent系统特别需要

Agent的执行环境不稳定:

  • 模型API可能超时
  • Agent可能OOM
  • 系统可能重启

传统服务有优雅关闭机制,Agent没有。写文件就是和时间赛跑。

我们的防护

atomic_json_write先写临时文件再rename:

def atomic_json_write(filepath, data):
    tmp = filepath + '.tmp'
    with open(tmp, 'w') as f:
        json.dump(data, f)
    os.rename(tmp, filepath)  # 原子操作

崩溃时最多丢一条消息,不会损坏文件。

结论:刚需。 Agent崩溃是常态,非原子写入就是定时炸弹。

第四个问题:哈希校验——消息有没有被重复处理

现象

heartbeat每分钟检查inbox,如果同一消息被处理两次:

  • 同一任务被派发两次
  • 同一通知被发送两次

为什么Agent系统特别需要

Agent系统是异步的:

  • Agent可能重试
  • heartbeat可能重复触发
  • ws_server可能重复处理

没有哈希校验,重复消息就是常态。

我们的防护

inbox写入时计算MD5:

hashlib.md5(content.encode()).hexdigest()

处理时对比hash,相同则跳过。

结论:实用但有冗余。 我们已经有processed_ids去重了,哈希校验是额外保障。

总结:按重要性排序

路径遍历 > 原子写入 > Token鉴权 > 哈希校验
防护 防什么 必要性
路径遍历 Agent读写任意文件 ⭐⭐⭐ 必需
原子写入 Agent崩溃导致文件损坏 ⭐⭐⭐ 必需
Token鉴权 伪造消息/外部攻击 ⭐⭐ 实用
哈希校验 重复处理 ⭐⭐ 实用

核心原则:Agent系统最重要的不是"防攻击",而是"防Agent自己搞坏数据"。

Agent不是恶意的,但它不稳定。路径遍历和原子写入是保护Agent不搞坏自己的数据,Token和哈希是防止Agent被外部干扰。

一句话总结

Agent系统的安全防护,优先级不是"防坏人",而是"防自己"。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐