# 召回(revert)：labstack/echo#1718 — 还原安全修复以重新引入漏洞

- 修复 PR: https://github.com/labstack/echo/pull/1718  (Go 目录穿越 path.Clean->filepath.Clean)
- 方法: checkout 修复提交 `4422e3b66b9fd498ed1ae1d0242d660d0ed3faaa` 后 git revert -n 把工作区改回**有漏洞**状态, 审查该 diff
- 期望：security/ai_smell 维度指出被还原掉的漏洞

## 还原后的工作区 diff（节选）
```
```

## review
```
ReviewGate 审查中（3 个维度并行：security, logic, ai_smell）…
闸口：BLOCK ✗ 阻断合并    3 文件改动 · 4 条可信发现 · 0 条已过滤

echo.go
  ✗ [logic · high · conf 0.86] L489
    【安全·目录穿越】将 filepath.Clean 替换为 path.Clean 后，在 Windows 上存在目录穿越漏洞。path.Clean 仅将 '/' 识别为路径分隔符，不识别 Windows 的反斜杠 '\'。攻击者可通过 URL 编码或直接发送含 '\..\' 的路径（如 /images/..\..\secret.txt），path.Clean 会将 '\..\' 视为普通文件名字符而不消除，但随后 filepath.Join 内部的 filepath.Clean（Windows 上识别 '\' 为分隔符）会重新解析这些 '\..\'，导致路径逃逸出 root 目录。原代码使用 filepath.Clean 可正确在 Windows 上同时处理 '/' 和 '\' 两种分隔符。（另由 ai_smell/security 维度同时标记）
    ↳ 建议：恢复使用 filepath.Clean 而非 path.Clean，因为此处需要 OS 感知的路径清理来防御目录穿越攻击。如果意图是统一使用 path 包的语义，则需要额外处理 Windows 反斜杠，例如在 Clean 之前将 '\' 替换为 '/'。

echo_test.go
  ▲ [security · med · conf 0.68] L62
    【安全】测试重构中删除了两个目录穿越安全测试用例：`"do not allow directory traversal (backslash - windows separator)"` 和 `"do not allow directory traversal (slash - unix separator)"`。这两个用例专门验证静态文件服务能正确拒绝 `..\` 和 `../` 路径穿越攻击。在同时将 filepath.Clean 改为 path.Clean（降低了 Windows 穿越防护）的背景下，删除这些安全回归测试会使得未来类似安全问题更难被发现。
    ↳ 建议：保留或重新添加目录穿越测试用例，覆盖正斜杠 `/../` 和反斜杠 `..\` 两种穿越方式，确保安全防护持续有效。
  ✗ [ai_smell · high · conf 0.68] L67
    【ai_smell - 假设漂移/复制未适配】重写 TestEchoStatic 时删除了原有的目录遍历安全测试用例（Windows 反斜杠 ..\\ 和 Unix 斜杠 ../ 遍历），新测试完全没有覆盖目录穿越场景。与 path.Clean 的安全削弱叠加，形成防护弱化+测试盲区的双重问题。
    ↳ 建议：恢复目录遍历测试用例，并增加针对 Windows 反斜杠穿越的测试（验证 path.Clean 或 filepath.Clean 能否正确处理）。

middleware/static.go
  ✗ [logic · high · conf 0.86] L170
    【安全·目录穿越】与 echo.go:489 相同问题。path.Clean 在 Windows 上不识别反斜杠 '\' 为路径分隔符，导致含 '\..\' 的恶意路径无法被正确清理，随后被 filepath.Join 内部的 filepath.Clean 重新解析后可能逃逸 root 目录。这是同一类安全回归。（另由 ai_smell/security 维度同时标记）
    ↳ 建议：恢复使用 filepath.Clean 或将 '\' 统一替换为 '/' 后再调用 path.Clean。

```
