GitHub Advisoryadvisory · Go
GHSA-vfp3-v2gw-7wfq Echo: Encoded slash (%2F) bypasses route-level protection and exposes static files
HIGH
Official page ↗
- Aliases
- CVE-2026-55677
- Ecosystem
- Go
- Packages
- github.com/labstack/echo/v5, github.com/labstack/echo/v4, github.com/labstack/echo
- Severity
- High
- CVSS vector
- CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
- Weaknesses
- CWE-22
- Reviewed
- 2026-08-25
Affected packages
• Go github.com/labstack/echo/v5: < 5.2.0 → fixed in 5.2.0
• Go github.com/labstack/echo/v4: < 4.15.3 → fixed in 4.15.3
• Go github.com/labstack/echo: <= 3.3.10 (no fix yet)
Description
Summary
Echo's router and static file handler disagree on URL path decoding. The router matches routes using the raw encoded path (preserving `%2F` as-is), while `StaticDirectoryHandler` unescapes `%2F` to `/` before resolving filesystem paths. This allows an attacker to bypass route-level access controls and read static files without authorization.
Details
Root cause 1 — `router.go` lines 798-802:
The router uses `req.URL.RawPath` for route matching when `useEscapedPathForRouting` is false (the default). This means `/admin%2Fsecret.txt` is treated as a single path segment and does NOT match the `/admin/*` route pattern.
```go
if !r.useEscapedPathForRouting && req.URL.RawPath != "" {
path = req.URL.RawPath
}
```
Root cause 2 — `echo.go` lines 559-568:
`StaticDirectoryHandler` calls `url.PathUnescape()` on the path parameter before opening files. This converts `%2F` back to `/`, resolving `admin/secret.txt` on disk.
```go
if !disablePathUnescaping {
tmpPath, err := url.PathUnescape(p)
p = tmpPath
}
name := filepath.ToSlash(filepath.Clean(strings.TrimPrefix(p, "/")))
```
PoC (Screenshot)
Sample:
403:
Bypass with encoded slash:
Impact
Unauthorized static file disclosure. Applications that protect route prefixes with authentication middleware while also serving static files from a broader root are vulnerable. An attacker only needs to encode the slash (`/` → `%2F`) in the URL to bypass all route-level protection.
Common affected pattern:
```go
adminGroup := e.Group("/admin", authMiddleware)
e.StaticFS("/", os.DirFS("public"))
```
Related
Alias · CVE (1)
- CVE-2026-55677 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-vfp3-v2gw-7wfq web
- https://nvd.nist.gov/vuln/detail/CVE-2026-55677 advisory
- https://github.com/labstack/echo/pull/3009 web
- https://github.com/labstack/echo/pull/3011 web
- https://github.com/labstack/echo/commit/8d1ae9d3360a71672418856d58753af25f2c3986 web
- https://github.com/labstack/echo/commit/c3fa2a27ff92b2b8db360de614f999ef1da24725 web
- https://github.com/labstack/echo package
- https://github.com/labstack/echo/releases/tag/v4.15.3 web
- https://github.com/labstack/echo/releases/tag/v5.2.0 web