如何防止 Agent 路径穿越或越权访问其他目录?

考查重点:路径解析与目录作用域。路径规范化并解析真实目标,限制在授权根内,防符号链接绕过;执行账号最小权限,读写时重新校验并审计

本题目录

参考答案

核心回答

我会把文件访问限制在宿主确定的授权目录内,并在真正执行读写时强制校验,同时让执行进程只拥有必要的文件权限。仅设置工作目录、在提示词里禁止 ../,都不足以限制访问。

具体做四件事:

  1. 按用户、项目和任务确定可读、可写根目录,模型只提交相对路径或文件 ID,不能自己指定授权范围。
  2. 统一解析路径,检查最终目标确实位于允许目录,处理绝对路径、分隔符、符号链接和路径前缀混淆。
  3. 防止“检查时安全、打开时已被替换”的竞态;在支持的系统上使用基于目录句柄的受限打开,或由可靠的文件代理执行。
  4. 给文件工具、命令工具及其子进程使用一致的受限身份和挂载范围,再用越界、软链接和并发替换案例验证。

例如允许读取 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:说明受限路径解析、符号链接和挂载点选项,提供防止检查后替换路径的具体系统机制。

相关面经

3 篇

字节跳动

AI 应用开发工程师
一面
查看原面经 →
追问
在某个工作目录启动 Agent 后,如果要读取其他目录的文件,是否会拦截或提醒?当前实现能否直接访问?
追问
是否实现了沙盒或访问边界检查策略?

百度

AI 测试开发工程师
一面
查看原面经 →
项目追问
又拷打了项目,怎么防止agent的路径穿越

超参数

Agent 开发工程师
社招一面
查看原面经 →
如何避免agent越权访问其他目录

相关题目

4 题