用 Rust 将 Agent 权限收紧到每次调用
文章指出,工具继承当前用户权限时,子 Agent 可能读取任务之外的敏感文件。作者提出以单次工具调用为边界、权限只能收缩的 Rust 隔离方案,细化整个 Agent 共用沙箱策略的权限粒度。
原文暂未完整获取,基于公开信息的快读
Agent 接到「读项目文档,说明怎么运行」的任务,却进一步请求读取 ~/.ssh/id_rsa。原文作者用这个例子指出:工具若直接继承当前用户权限,子任务就可能访问任务之外的敏感文件。他用 Rust 构建了 CleiMesh,尝试把权限边界收紧到每次工具调用。
目前能确认什么
这里涉及「环境权限」(ambient authority):程序因为运行身份而天然拥有权限,却没有针对当前任务获得明确授权。操作系统知道进程属于哪个用户,但通常不知道它正在替谁执行什么任务。
CleiMesh 的做法是让签名令牌决定工具权限。Agent 向子 Agent 委派时,只能缩小权限;工具在 WebAssembly 沙箱中运行,默认不开放能力,再按令牌配置可访问目录、网络及资源限制。每次调用无论放行还是拒绝,都生成签名回执。
它还设置了一道规则:读取邮件、网页等外部内容后,整条委派链会被标记,后续要求「干净状态」的写入、发送工具会被拒绝,直到人工解除。
作者用 OpenClaw、本地 Qwen3 4B 和含隐藏指令的邮件测试:保留原生文件工具时,模型绕过 CleiMesh 写入了文件;只开放 CleiMesh 工具时,写入被拒绝。这是作者报告的实验,项目仍处于 alpha 阶段。
我的判断
执行链上只要还留着可绕过的文件或 shell 工具,逐次授权就无法覆盖整个 Agent。
对程序员最直接的启发,是检查一次工具调用最终以什么身份、拿着哪些权限执行。只审核入口请求,不能限制工具启动后能读到什么。
这套方案也没有消除提示注入。模型仍可能被骗,获准执行的动作也可能有害。链级标记能阻断部分后续操作,但合法的「读邮件再写结果」流程如何恢复,人工解除如何控制范围,还要看完整文档。签名回执和重放验证能提供多强的证据,也需要结合威胁模型及外部依赖来判断。