如何防止 Agent 路径穿越或越权访问其他目录?
未标记
考查重点:路径解析与目录作用域。路径规范化并解析真实目标,限制在授权根内,防符号链接绕过;执行账号最小权限,读写时重新校验并审计
本题目录
参考答案
核心回答
我会把文件访问限制在宿主确定的授权目录内,并在真正执行读写时强制校验,同时让执行进程只拥有必要的文件权限。仅设置工作目录、在提示词里禁止 ../,都不足以限制访问。
具体做四件事:
- 按用户、项目和任务确定可读、可写根目录,模型只提交相对路径或文件 ID,不能自己指定授权范围。
- 统一解析路径,检查最终目标确实位于允许目录,处理绝对路径、分隔符、符号链接和路径前缀混淆。
- 防止“检查时安全、打开时已被替换”的竞态;在支持的系统上使用基于目录句柄的受限打开,或由可靠的文件代理执行。
- 给文件工具、命令工具及其子进程使用一致的受限身份和挂载范围,再用越界、软链接和并发替换案例验证。
例如允许读取 workspace/docs/a.md,不意味着允许读取 workspace-old/a.md,也不意味着允许跟随 workspace/docs/link 去读取工作区外的密钥。
展开说明
1. 先明确访问范围与操作类型
授权范围来自可信会话与业务权限,不能采信模型传入的 user_id 或 root_dir。可以把上传材料映射为只读文件 ID,把本次产物放进单独的可写目录。读、覆盖、删除和执行权限分别控制;允许读取某个目录不代表可以在其中执行脚本。
需要访问其他目录时,增加一项明确的目录授权,注明读写范围、适用任务和有效期。不同任务的产物也需检查归属,不能因为路径都在同一父目录下就互相可见。
2. 路径判断不能只做字符串过滤
去掉 ../ 或做字符串 startswith 都容易出错。应该让路径输入与实际文件操作遵循同一套平台语义,处理应用链路中真实发生的解码,拒绝不支持的路径形式,再按路径组件检查目录包含关系。
对已有文件,要考虑符号链接最终指向;对新建文件,要检查并安全定位已存在的父目录,再创建目标,不能因为目标尚不存在就跳过检查。移动、复制、解压等操作同样检查源和目标;压缩包条目也可能携带越界路径。
如果方案不需要符号链接,可以直接禁止通过链接访问。确需支持时,应验证链接解析后的访问仍在授权范围内,而不是只检查链接本身的位置。
3. 解决校验与使用之间的竞态
先解析绝对路径、检查范围、随后再按字符串打开,中间可能有人把目录或链接替换掉。这就是检查与使用之间的时间差问题。
在 Linux 上,可由文件执行层持有授权根目录句柄,使用 openat2 的 RESOLVE_BENEATH 等限制,让内核在打开过程中约束路径解析;不允许符号链接时可配合相应标志,是否允许跨挂载点则按部署需求决定。其他系统选用具备对应保证的文件代理或沙箱机制。接口不支持或无法确认边界时应失败返回,不能悄悄退回不受限的打开方式。
4. 文件工具之外也要遵守边界
如果读取工具有限制,而 Shell、Python 执行器或某个 MCP Server 可以用宿主账号读取整个磁盘,Agent 仍能绕过去。因此执行进程应使用最小权限身份,只挂载必要目录;密钥和宿主控制配置不放进可访问区域。容器也要检查实际挂载、权限和宿主接口,不能只看有没有容器名称。
研搜参考项目的会话目录用于组织上传文件和产物,固定版路径工具还会保留目录外的真实绝对路径。若在此基础上增加隔离,应把路径适配与访问授权分开,在所有文件入口及实际执行环境落实上述策略。
5. 如何验证确实拦住了越权?
准备正常文件、相邻前缀目录、绝对路径、嵌套 ..、指向外部的软链接,以及检查期间替换链接或目录等案例;按实际平台补充盘符、分隔符和挂载场景。读、写、新建、删除和解压都需要覆盖,命令工具另做同等边界验证。
拒绝时返回明确的访问受限结果,避免把敏感文件内容或不必要的系统路径写进错误和日志。记录操作主体、工具、授权范围与拒绝原因,便于定位是业务授权错误还是路径解析漏洞。
常见追问
把当前目录切到 workspace 就够了吗?
不够。当前目录只影响相对路径的解析,进程仍可能访问它有权限读取的绝对路径。真正的边界来自访问策略与操作系统执行环境。
模型要求读取本地密钥文件,怎么办?
文件执行层按当前授权拒绝,不把密钥正文交给模型。调用外部服务需要凭证时,由宿主通过密钥管理和受限工具代为使用,返回业务结果;不能因为模型声称“调试需要”就扩大文件权限。
只调用 MCP 文件服务就天然安全吗?
还要看该 Server 的实际实现、运行身份和可访问范围。协议统一了调用方式,访问边界由服务端和宿主执行策略负责。
对应教程
- 研搜:主智能体搭建与异步执行:介绍文件工具及会话目录怎样进入执行流程;扩展安全边界时,需要继续覆盖这些真实文件入口。
- 研搜固定版路径工具:展示路径适配和外部绝对路径保留的具体行为,帮助区分产物目录组织与访问隔离。
参考资料
- 国内:zero2Agent:Agent 基础设施:借鉴文件工具策略与操作系统运行身份的双层边界,解释正文中仅设置工作目录仍不足以隔离访问。
- 国内:WeThinkIn:编码 Agent 与 AgentOS 工程:参考 Workspace 与文件系统抽象的区分,补充正文中符号链接、路径解析和挂载范围需要分别落实的限制。
- 国内:JavaGuide:MCP:借鉴服务端访问范围、读写权限与调用记录的设计,说明正文中 MCP 接入后的执行授权责任。
- 国外:OWASP:路径穿越:依据目录穿越、绝对路径和编码变体的风险,解释正文中采用一致解析与目录范围校验的原因。
- 国外:Linux man-pages:openat2:说明受限路径解析、符号链接和挂载点选项,提供防止检查后替换路径的具体系统机制。

