《智能体的代码执行、文件系统,与隔离沙箱》
当大模型走出对话框,获得真实的 Bash 执行与文件读写能力——深入解析 TJUClaw 的代码执行机制、瞬态工作区文件系统、与腾讯云 Agent 沙箱微隔离安全架构。
《智能体的代码执行、文件系统,与隔离沙箱》
在前面的章节中,我们阐述了 TJUClaw 的核心理念:Agent Harness 的本质不是构建一个更复杂的问答对话框,而是为模型提供一个图灵完备的真实执行环境。
在这个环境中,智能体不再是被动等待补全的文本预测器,而是能够自主编写 Python/Bash 脚本、调用校园专属工具、读写工作区文件、并根据终端输出进行动态修正的执行实体。
然而,这种从“语言能力”到“执行能力”的跃迁,直接将系统推向了极其严苛的工程与安全悬崖:
- 任意代码执行(RCE)如何避免破坏宿主机或窃取平台凭证?
- 智能体产生的文件如何持久化?沙箱销毁后如何保证数据不丢失、不交叉污染?
- 校园私有数据与工具权限如何在微隔离网络中受控流通?
本文将全面拆解 TJUClaw 在代码执行生命周期、分层文件系统设计、以及腾讯云 Agent 沙箱微隔离安全边界上的核心工程实践。
1. 总体架构:三层受控执行模型
为了彻底隔绝不可信代码对核心服务的冲击,TJUClaw 在物理与网络拓扑上严格划分为三层安全域:
+-------------------------------------------------+
| 核心云主机 (Core Server: 2C 2G) |
| |
| tjuclaw-api (业务调度 / PostgreSQL 会话存储) |
| tjucli-server (受控校园工具代理 :18090) |
+------------------------+------------------------+
|
| 受控 RPC / 短期 Grant 令牌
v
+-------------------------------------------------+
| 腾讯云 Agent Sandbox (微隔离计算沙箱) |
| |
| +-----------------------------------------+ |
| | Pi Agent Harness Loop | |
| +--------------------+--------------------+ |
| | |
| v |
| +-----------------------------------------+ |
| | 原生工具调用与执行运行时 (Tools) | |
| | - filesystem (读写 /workspace) | |
| | - shell / bash (安全执行进程) | |
| | - tjucli (remote 模式连接 tool-server) | |
| +--------------------+--------------------+ |
| | |
| v |
| +-----------------------------------------+ |
| | 本地挂载工作区 (/workspace 独立命名空间) | |
| +--------------------+--------------------+ |
+------------------------+------------------------+
|
| 产物双向同步 (SHA-256 校验)
v
+-------------------------------------------------+
| 持久化存储层 (对象存储) |
| users/<owner-id>/workspaces/<workspace-id>/ |
+-------------------------------------------------+这种拓扑的核心原则是**“核心主机不跑用户代码,执行沙箱不留永久凭据”**:
- Core Server 仅承载有状态的业务记录、会话鉴权与权限分发,永远不直接执行 Agent 生成的任意进程;
- Agent Sandbox 作为无状态、瞬态、按需分配的独立执行空间,每个用户的每个任务拥有完全隔离的 Linux 命名空间与只读镜像;
- Storage Layer 承担最终成果的不可变存储与归档,实现“计算”与“数据”的彻底解耦。
2. 智能体的代码执行闭环 (The Execution Loop)
在沙箱内部,Agent 的代码执行绝非简单的 eval(),而是一个严格受控的多轮反馈循环(Perceive-Plan-Execute-Observe):
Prompt / Context
│
▼
+--------------+
| LLM 决策 | ──► 输出工具调用意图 (Tool Call: bash)
+--------------+
│
▼
+--------------+
| 参数校验层 | ──► 拦截危险逃逸参数 / 注入超限死循环超时限制
+--------------+
│
▼
+--------------+
| 进程执行器 | ──► 在 /workspace 目录派生受限子进程 (fork/exec)
+--------------+
│
▼
+--------------+
| 流式拦截器 | ──► 截获 stdout/stderr (硬上限截断,防爆内存)
+--------------+
│
▼
+--------------+
| 真实 Observation 注入上下文,驱动模型进行自愈与下一步决策
+--------------+关键执行防御机制:
- 执行目录锁定:Agent 派生的所有 Shell 进程工作目录严格强制锚定为
/workspace,禁止以 Root 权限修改系统只读挂载点; - 输出有界截断 (Bounded Output):大模型输出日志一旦超限(例如失控打印数万行日志),沙箱运行时将在 16 KiB ~ 64 KiB 边界实施安全硬截断,并附加
[Output truncated]标记,杜绝内存爆仓与上下文溢出拒绝服务(DoS); - 动态执行超时 (Execution Timeout):单个命令或代码块设置物理级最大执行时长(如 120 秒),超时自动触发
SIGTERM及级联SIGKILL清理整个进程树,避免产生孤儿死循环进程。
3. 工作区文件系统设计:瞬态沙箱与持久化挂载
在 Harness 设计中,模型直接与文件系统交互。我们反对将复杂的对象存储 SDK(如 S3/COS 客户端)直接灌入 Agent 的提示词中,这不仅严重浪费 Token,而且模型极易在拼接路径和处理上传鉴权时产生幻觉。
TJUClaw 采用**“本地 POSIX 语义透明读写 + 检查点异步落盘(Materialization & Checkpoint)”**的分层文件系统模型:
3.1 沙箱本地工作区布局
进入沙箱后,文件目录具有清晰的职责与只读隔离边界:
/workspace
├── inputs/ [只读挂载] 任务开始前从 COS 拉入的前置文件与数据集
├── scratch/ [临时读写] 编译中间件、缓存、依赖包 (任务销毁即弃)
└── outputs/ [核心可写] 智能体交付的最终报表、图表、Markdown 文档3.2 检查点与文件防逃逸
- 输入文件注入:任务启动时,调度器根据任务清单,将用户指定的输入对象(如
lecture-notes.pdf)拉取并摆放在/workspace/inputs/; - 禁止路径逃逸:智能体在保存成果时,CLI 与文件桥接组件会严格校验路径,拒绝
../穿越或通过符号链接(Symlink)逃逸到沙箱操作系统关键目录(如/etc、/sys、/proc); - 不可变交付物存证:当 Agent 宣告任务完成时,系统仅收集
/workspace/outputs/内的产物,计算 SHA-256 哈希值,流式归档至远端持久化存储,并签发不可篡改的任务交付清单(Manifest)。
4. 校园工具与凭据隔离:tjucli-server 架构
Agent 在执行过程中往往需要调用天大校园特定工具(如查培养方案、找空闲教室、搜公开课程)。如果让沙箱内的 Agent 直接持有校园网会话凭证或数据库直连密码,一旦代码受到提示词注入攻击(Prompt Injection),凭据将瞬间泄露。
TJUClaw 的解法是:凭据完全不下发沙箱,仅通过 tjucli-server 实施单次授予(Grant-based Scoped Proxy)。
+------------------------------------+ +------------------------------------+
| Agent Sandbox (沙箱内) | | Core Server (宿主机) |
| | | |
| $ tjucli course search "电路" | | +------------------------------+ |
| │ | | | tjucli-server | |
| ▼ | | | (本地守护进程 :18090) | |
| TJUCLI_MODE=remote | | +---------------+--------------+ |
| 读取 TJUCLI_TOKEN_FILE | | │ |
| 发送 HTTP 请求携带 Bearer Token | | ▼ |
| │ | | FileAuthorizer 校验权限: |
| └──────────────────┼─────────►│ 1. 比对 token_sha256 (常量时间) |
| HTTP (受控隔离通道) | | 2. 检查 run_id 与有效期 |
| | | 3. 核对 scope: "course:read" |
| | +------------------+-----------------+
| | │
| | ▼
| | 向校园公开源/知识库安全代理查询
+------------------------------------+零信任工具契约:
- 短效单次凭据 (Ephemeral Token):每个任务 Run 启动时,后端在沙箱内注入一个随机高熵的
TJUCLI_TOKEN_FILE,宿主机服务仅保存其token_sha256摘要; - 权限与时间熔断:授权文件以
0600私有权限存储,明确限定作用域(如course:read)与绝对过期时间。任务结束或用户点击取消,后端立即移除 Grant 记录,沙箱内凭据瞬间失效; - 防数据侧信道:
FileAuthorizer使用crypto/subtle.ConstantTimeCompare进行哈希比对,阻断时序攻击;所有对外错误均转换为静态机器错误码,严防通过错误堆栈将宿主机内网 IP、凭据或私有路径反弹进大模型。
5. 总结:安全与自由的优雅平衡
在 Agent 架构的演进浪潮中,人们常常在两个极端之间摇摆:要么因为害怕风险而画地为牢,将模型死死限制在只能返回 JSON 的简单 Tool Calling 对话框里;要么盲目赋予模型宿主机高权限,留下严重的系统被渗透隐患。
TJUClaw 给出的工程答案是:以最大的自由赋能模型,以最严密的防线守护系统。
通过构建图灵完备的执行闭环、清晰规范的 POSIX 工作区文件系统、以及基于腾讯云 Agent 沙箱的单次细粒度授权微隔离,我们让智能体能够无拘无束地挥洒强大的代码编写与自动化探索能力,同时将所有潜在的爆炸半径稳妥地收拢于毫厘之间。