| name | go-vuln-path-traversal |
| description | Use when auditing Go code involving file path operations, archive extraction, symlink handling, container volume mounts, or HTTP file serving. Covers CWE-22/59. Keywords: path traversal, directory traversal, filepath.Join, symlink, archive extraction, zip slip, tar, volume mount, go-git, Helm chart, os.Open, filepath.Clean |
Go Path Traversal Vulnerability Patterns (CWE-22/59)
当审计 Go 代码中涉及文件路径操作、归档解压、符号链接处理、容器卷挂载时加载此 Skill。
Detection Strategy
Sources(攻击入口):
- HTTP 请求参数中的文件名/路径(
r.URL.Query().Get("file"))
- Archive 条目路径(
tar.Header.Name, zip.File.Name)
- Git 仓库中的文件路径(go-git clone/checkout)
- gRPC 请求中的文件路径字段
- Helm chart 中的文件引用
- 用户上传的文件名(
multipart.FileHeader.Filename)
Sinks(危险操作):
os.Open(path), os.Create(path), os.ReadFile(path)
os.WriteFile(path, data, perm)
filepath.Join(base, userInput) -- 当 userInput 为绝对路径时覆盖 base
os.Symlink(target, link), os.Readlink(path)
http.ServeFile(w, r, path), http.FileServer(http.Dir(root))
io.Copy 写入用户控制的路径
- Container runtime 的 volume mount 路径解析
Sanitization(路径安全屏障):
filepath.Clean(path) -- 规范化路径但不防止绝对路径
filepath.Rel(base, target) -- 计算相对路径,返回 .. 开头则越界
strings.HasPrefix(filepath.Clean(path), base) -- Clean 后前缀检查
filepath.EvalSymlinks(path) -- 解析所有符号链接后再检查
securejoin.SecureJoin(base, path) -- filepath-securejoin 库
检测路径:
grep -rn "filepath.Join" --include="*.go"
grep -rn "os.Open\|os.Create\|os.ReadFile\|os.WriteFile\|os.MkdirAll" --include="*.go"
grep -rn "tar.NewReader\|zip.OpenReader\|archive/tar\|archive/zip" --include="*.go"
grep -rn "os.Symlink\|os.Readlink\|os.Lstat\|filepath.EvalSymlinks" --include="*.go"
grep -rn "http.ServeFile\|http.FileServer\|http.Dir" --include="*.go"
grep -rn "filepath.Clean\|filepath.Rel\|securejoin\|SecureJoin" --include="*.go"
- 定位文件操作的 Sink 函数(
os.Open, os.Create, http.ServeFile 等)
- 回溯路径参数的来源,确认是否包含用户输入
- 验证路径是否经过安全检查:
filepath.Join(base, input) 是否考虑了 input 为绝对路径的情况?
- Archive 解压是否检查了条目路径包含
.. 或绝对路径?
- 是否先
filepath.EvalSymlinks 再做路径检查(防止 symlink TOCTOU)?
http.FileServer 的 root 目录是否限制了访问范围?
- 若无安全检查或检查可被绕过 -> 标记为候选漏洞
Detection Checklist
False Positive Exclusion Guide
以下模式不是此类漏洞:
filepath.Join 用于拼接硬编码路径 -- 如 filepath.Join(configDir, "settings.yaml"),无用户输入
http.FileServer 仅服务静态资源目录 -- 且路径参数不可被用户控制
os.ReadFile 读取配置文件 -- 路径来自环境变量或命令行参数(非 HTTP 输入)
- 测试代码中的临时目录操作 --
t.TempDir() 中的文件操作
以下模式需要深入检查:
filepath.Clean 后直接使用 -- Clean 不防止绝对路径,需要额外的前缀检查
strings.Contains(path, "..") 作为唯一检查 -- 可被 ....// 等变体绕过
- Lstat + Open 分开调用 -- 存在 TOCTOU 窗口
io.Copy 目标路径来自 archive header -- Zip Slip 经典模式
Real-World Cases
详见 references/cases.md(7 个真实案例,需要时加载)。