VDB
EN
HIGH 7.5

GHSA-vfp3-v2gw-7wfq

Echo: Encoded slash (%2F) bypasses route-level protection and exposes static files

빠른 조치

GHSA-vfp3-v2gw-7wfq — github.com/labstack/echo/v5: 아래 명령으로 수정 버전으로 올리세요.

go get github.com/labstack/echo/v5@v5.2.0

상세

### 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: <img width="1291" height="970" alt="image" src="https://github.com/user-attachments/assets/0bc58059-3e6d-4678-ab25-a5c79b006738" />

403: <img width="526" height="194" alt="image" src="https://github.com/user-attachments/assets/2f55ffdd-87b2-4a1b-8a13-130ebad0f257" />

Bypass with encoded slash: <img width="592" height="203" alt="image" src="https://github.com/user-attachments/assets/1191cd39-ae8f-4d7e-8fb1-cb9cf31f484f" />

### 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")) ```

이 버전이 영향받나요?

사용 중인 패키지 버전을 입력하면 즉시 평가합니다.

영향 패키지

Go / github.com/labstack/echo/v5
최초 영향 버전: 0 수정 버전: 5.2.0
수정 go get github.com/labstack/echo/v5@v5.2.0
Go / github.com/labstack/echo/v4
최초 영향 버전: 0 수정 버전: 4.15.3
수정 go get github.com/labstack/echo/v4@v4.15.3
Go / github.com/labstack/echo
최초 영향 버전: 0

No fixed version published yet for github.com/labstack/echo (go modules). Pin to a known-safe version or switch to an alternative.

참고