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 路径校验最佳实践
始终使用 realpath: 解析符号链接,防止链接逃逸
规范化顺序: URL 解码 → Unicode 规范化 → 平台规范化 → realpath
白名单优先: 相比黑名单,白名单更安全
日志和审计: 记录所有被拒绝的路径尝试
缓存路径校验: realpath 调用昂贵,使用 LRU 缓存
定期审查: 新的编码方式不断出现,定期更新防护
本节总结:路径校验是防护路径穿越的关键。通过 5 层递进式防护(长度、解码、Unicode、平台、realpath),可以有效应对多种已知和未知的编码攻击。关键是:规范化后必须使用 realpath,并检查最终路径是否在边界内。
最后更新于
