路径遍历(path traversal) 安全与工程

别名: 路径遍历 · 路径逃逸

用 `..` 上溯、绝对路径或前缀碰撞等手段,让「读工作目录内文件」变成「读任意文件」的逃逸。防御算法是「先规范化、后包含检查」(resolve-then-check):自己完成 `..` 弹栈后,再做段感知的包含检查(`root + '/'`),绝不把规范化交给操作系统。

它是什么

路径遍历(path traversal)是用 .. 上溯、绝对路径或前缀碰撞等手段,让「读工作目录内文件」变成「读任意文件」的逃逸。经典 Web 安全漏洞在 Agent 里原样复活——攻击者(或一次 over-eager 判断)用 .. 层层上溯,把「读工作目录」变成「读整个文件系统」。OWASP Agentic 列表的 ASI02 工具误用与利用 明确把「工具参数缺乏验证」列为 Agent 头号风险族。

三种逃逸形态

.. 上溯(read_file('../../etc/passwd'))、绝对路径(read_file('/etc/passwd'),不需要 ..)、前缀碰撞(根是 /work/agent,路径是 /work/agent-evil/x——字符串前缀「看起来在根内」,实则是兄弟目录)。符号链接是第四种(根内 link -> /etc),本章只提不做,真实产品用 realpath 或容器处理。

防御算法:先规范化、后包含检查

resolveWithinRoot 两步,顺序不可颠倒:先自己规范化.. 弹栈、. 丢弃、空段跳过),再做段感知的包含检查resolved === root || resolved.startsWith(root + '/'),多带一个 /agent-evil 不可能通过)。两个反例:先检查后规范化demo-notes/../../../etc/passwd 检查时在根内、执行时在根外,因为操作系统会替我们规范化)与字符串前缀检查(前缀碰撞)。拒绝的 error 串只回显用户输入、不含根目录绝对路径,避免泄露内部目录结构。

在本教程的位置

第 19 章「工作目录约束与路径逃逸」一节:纯字符串实现、零 import(连 node:path 都不用),练习 stage 1 专门考前缀碰撞。相关词条:沙箱

相关词条

出现在这些章节