Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessSend double-encoded request path (/..%252fsecret.txt)
-
ExploitStatic middleware re-decodes already-decoded URL.Path
-
ExecutionSeparator reconstructed before filesystem resolution
-
ImpactReach guarded file and read contents
Vulnerability Assessment
| Weakness |
CWE
|
| Exploitation Conditions | Exploitable only when Echo's middleware.Static is registered GLOBALLY and a file meant to be protected sits under that Static root behind a separate guarded route; the attacker then supplies a double-encoded separator (e.g. %252F or %2e%2e%2f) that the middleware decodes a second time, reconstructing the path before filesystem resolution. Limiting factors: no authentication is required (PR:N per the vector) and no user interaction (UI:N), but the specific global-registration-plus-guarded-route deployment and the double-encoding requirement give it high attack complexity (AC:H); per the maintainer, reading files outside the configured root could not be reproduced, so impact is bounded to in-root files reachable past the route guard. Upgrading to the fixed versions is the stated remedy, with the only noted workaround being to keep protected files outside the Static middleware's root directory. |
| Impact | Signals point to a real but moderate, config-dependent issue rather than a drop-everything emergency. The CVSS 3.1 vector (AV:N/AC:H/PR:N/UI:N, base 5.9, C:H/I:N/A:N) describes a network-reachable, unauthenticated confidentiality-only flaw whose exploitation is gated by high attack complexity. No EPSS score and no KEV status were supplied, and the vuln.today decision label is 'this_month' (not act_now/emergency), so the aggregate urgency is patch-this-cycle, not immediate. There is no input flag of a confirmed public exploit; however, the fix commit (a9ede66a) ships regression tests that spell out the exact triggering vectors (/..%252fsecret.txt and /%2e%2e%2fsecret.txt), so the mechanism is fully public even if no packaged exploit is listed. A key conflict must be flagged: the GHSA 'Impact' line claims 'arbitrary file read from server filesystem,' but the same advisory's maintainer analysis states that reading files OUTSIDE the configured root could NOT be reproduced, and the confirmed impact was only that a double-encoded slash (%252F) could reach a file UNDER a guarded route when the Static middleware is registered globally - i.e. a route-guard/access-control bypass to in-tree static content, not unbounded filesystem disclosure. This materially lowers real-world impact versus the headline path-traversal framing, and the C:H in the supplied vector is arguably optimistic given the maintainer's narrower reproduction. Net: a genuine access-control bypass worth remediating on a normal patch cadence, with the true blast radius depending on whether sensitive files sit under a globally-registered Static root behind a route guard. |
| Exploit ScenarioDerived | An app registers Echo's middleware.Static globally and relies on a separate route guard (e.g. auth on a group) to protect certain static files. A remote attacker requests a double-encoded path such as GET /..%252fsecret.txt or /%2e%2e%2fsecret.txt; the middleware decodes the already-decoded path a second time, reconstructing the separator before filesystem resolution and reaching a file the guarded route was meant to shield. No packaged exploit is listed in the inputs, but the fix commit's regression tests publicly document the precise vectors, and the high attack complexity reflects the specific global-registration-plus-guarded-route layout required. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 28, 2026
Path traversal in the Echo Go web framework's middleware.Static (all versions prior to 4.15.3 on the v4 branch and prior to 5.2.0 on the v5 branch) allows unauthenticated remote attackers to have Go's already-decoded Request.URL.Path unescaped a second time, so double-encoded separators such as %252F or %2e%2e%2f are reconstructed into traversal sequences before filesystem resolution. Successful exploitation is configuration-dependent: the Static middleware must be registered globally and a file intended to be protected must sit under that Static root behind a separate guarded route, which is why the issue is rated high complexity with confidentiality-only impact; the maintainer could not reproduce reads outside the configured root, bounding impact to in-root files reachable past the route guard. Fixes are released in v4.15.3 and v5.2.0, and no public exploit code or active exploitation has been identified at the time of analysis.
RemediationAI
Vendor-released patch: upgrade github.com/labstack/echo/v4 to 4.15.3 and github.com/labstack/echo/v5 to 5.2.0, the versions in which middleware/static.go stops unescaping an already-decoded URL.Path; the advisory further recommends v4.16.0 / v5.4.0 or later, which bundle additional fixes for encoded and dot-segment paths. Because Go modules are vendored or pinned, verify the resolved module version in go.mod/go.sum and in any container image rebuilds, then redeploy. The advisory's stated workaround, for teams that cannot upgrade immediately, is to keep files that need protection outside the Static middleware's root directory, so no traversal or double-decoded path can resolve to them; additionally, avoid registering Static globally where a route-level guard is expected to protect co-located files, since global registration is the condition that makes the guarded route reachable. Note that neither workaround removes the underlying double-unescape, and the vendor treats upgrading as the complete fix; relevant advisories are https://github.com/labstack/echo/security/advisories/GHSA-xwq5-6cqp-vx96, https://github.com/labstack/echo/pull/3006, https://github.com/labstack/echo/issues/2599 and the release pages at https://github.com/labstack/echo/releases/tag/v4.15.3 and https://github.com/labstack/echo/releases/tag/v5.2.0.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 3 packages in go, euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
Echo is a Go HTTP web framework, and its static file serving is implemented in middleware/static.go through StaticConfig.ToMiddleware(). Go's net/http package already percent-decodes http.Request.URL.Path before a handler sees it, but the vulnerable code unconditionally set pathUnescape := true and called url.PathUnescape() a second time on the already-decoded value. This is a classic CWE-174 double-decoding flaw (the GitHub advisory also frames it as CWE-22 path traversal): an attacker-supplied %252F becomes %2F after the first decode and / after the second, and %2e%2e%2f likewise collapses back into ../, so traversal sequences are re-assembled at the point where the middleware resolves the path against the configured Root/Filesystem. The fix sets pathUnescape := false, with the code comment noting that only the wildcard param from a group route may still be escaped. The commit (a9ede66) also added regression tests: TestStatic_servesFileWithPercentInName confirms files with literal percent signs (e.g. /100%25.txt, /foo%2520bar.txt) are served correctly, and TestStatic_percentEncodedTraversalIsBlocked confirms /..%2fsecret.txt, /..%252fsecret.txt and /%2e%2e%2fsecret.txt do not escape the root or leak files above it. Affected Go modules are go/github.com/labstack/echo/v4 and go/github.com/labstack/echo/v5; any application embedding those module versions and enabling the Static middleware inherits the behavior.
Know when the next one hits your stack
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:N/A:N
Network and unauthenticated (PR:N) but AC:H for the global-Static-plus-guarded-route and double-encoding prerequisites; C:L (not H) because the maintainer confirmed only guarded in-root files, not arbitrary filesystem read; no integrity or availability impact.
Primary rating from Vendor (github).
CVSS VectorVendor: github
Lifecycle Timeline
1DescriptionCVE.org
Echo is a Go web framework. Prior to 4.15.3 and 5.2.0, middleware.Static can decode an already decoded Request.URL.Path a second time. Double-encoded separators can consequently be reconstructed before filesystem resolution. This can reach a file under a guarded route when the static middleware is registered globally. This issue is fixed in 4.15.3 and 5.2.0.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Path traversal exploits occur when applications use user-controlled input to construct file system paths without proper validation.
Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.
EUVD-2026-112461
GHSA-xwq5-6cqp-vx96
NVD
CVE.org
Exploit-DB