12.4 路径校验与注入防护

路径校验是Harness安全中 最复杂且最关键 的环节。文件系统是Agent最常访问的资源,路径穿越攻击也是最易发动的攻击。一个强大的路径校验器需要应对多个层次的编码和规范化攻击。

本节从路径穿越的常见攻击向量入手,介绍Claude Code的5层递进式防护机制,并通过实际案例展示其如何应对各种攻击。

12.4.1 路径穿越攻击向量

向量1:相对路径穿越

相对路径穿越的攻击示例:

工作目录: /tmp/agent/
请求: ../../../etc/passwd
规范化: /etc/passwd
结果: 逃逸成功

向量2:URL编码穿越

URL编码穿越的攻击示例:

请求: ..%2f..%2fetc%2fpasswd
解码: ../../etc/passwd
规范化: /etc/passwd
结果: 逃逸成功

向量3:双重URL编码穿越

攻击示例如下:

向量4:Unicode标准化攻击

具体示例如下:

向量5:反斜杠注入

攻击模式如下:

向量6:符号链接逃逸

具体场景如下:

向量7:Case Sensitivity/Insensitivity

案例如下:

12.4.2 Claude Code 的 pathValidation.ts - 5层防护

Claude Code实现了5层递进式防护,每一层都针对特定的攻击向量:

12.4.3 攻击向量验证

让我们用上述PathValidator来验证它对各种攻击的防护:

12.4.4 路径校验在工具调用中的应用

实现如下:

12.4.5 路径校验的性能考虑

路径校验涉及多次字符串操作和可能的文件系统调用(realpath),需要考虑性能。然而,LRU缓存带来的TOCTOU(Time-of-Check-Time-of-Use)窗口不可忽视:缓存在validate()时通过,但从缓存命中到实际访问文件之间,文件系统状态可能发生变化(如符号链接被修改、权限改变、文件被删除等)。这个时间窗口虽然通常很小(毫秒级),但在高并发或对手主动利用的场景中可能被exploited。

建议:

  • 缓存TTL应设置较短(≤1秒),权衡性能与风险

  • 关键安全操作(如删除、修改权限)应禁用缓存,每次都调用realpath

  • 定期重新验证长生命周期的路径

12.4.6 路径校验最佳实践

  1. 始终使用realpath: 解析符号链接,防止链接逃逸

  2. 规范化顺序: URL解码 → Unicode规范化 → 平台规范化 → realpath

  3. 白名单优先: 相比黑名单,白名单更安全

  4. 日志和审计: 记录所有被拒绝的路径尝试

  5. 缓存路径校验: realpath调用昂贵,使用LRU缓存

  6. 定期审查: 新的编码方式不断出现,定期更新防护


本节总结:路径校验是防护路径穿越的关键。通过 5 层递进式防护(长度、解码、Unicode、平台、realpath),可以有效应对多种已知和未知的编码攻击。关键是:规范化后必须使用 realpath,并检查最终路径是否在边界内

最后更新于