Repository navigation
Update module github.com/labstack/echo/v4 to v4.16.1 [SECURITY] - #210
Open
renovate[bot] wants to merge 1 commit into
Open
renovate[bot] wants to merge 1 commit into
renovate[bot] wants to merge 1 commit into
Conversation
renovate
Bot
force-pushed
the
renovate/go-github.com-labstack-echo-v4-vulnerability
branch
from
October 23, 2026 13:16
e30c2f5 to
62d97f8
Compare
renovate
Bot
force-pushed
the
renovate/go-github.com-labstack-echo-v4-vulnerability
branch
from
October 28, 2026 20:58
62d97f8 to
dbf0e27
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
v4.15.2→v4.16.1Echo: Encoded slash (%2F) bypasses route-level protection and exposes static files
CVE-2026-55677 / GHSA-vfp3-v2gw-7wfq
More information
Details
Summary
Echo's router and static file handler disagree on URL path decoding. The router matches routes using the raw encoded path (preserving
%2Fas-is), whileStaticDirectoryHandlerunescapes%2Fto/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.golines 798-802:The router uses
req.URL.RawPathfor route matching whenuseEscapedPathForRoutingis false (the default). This means/admin%2Fsecret.txtis treated as a single path segment and does NOT match the/admin/*route pattern.Root cause 2 —
echo.golines 559-568:StaticDirectoryHandlercallsurl.PathUnescape()on the path parameter before opening files. This converts%2Fback to/, resolvingadmin/secret.txton disk.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:
Severity
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:NReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Echo: WebSocket proxy can retain connections and handlers after client disconnect
CVE-2026-118262 / GHSA-9969-6676-49h5
More information
Details
Impact
Echo's Proxy middleware could retain a handler, copy goroutines and network connections after a WebSocket client disconnected if the upstream kept its connection open. The raw proxy waited for both copy directions to finish without reliably closing the other connection when one direction ended. Rejected upgrade responses with HTTP keep-alive were one way to trigger this behavior.
Repeated connections can accumulate resources and cause denial of service. The impact depends on the proxy route's accessibility, upstream behavior and configured connection deadlines. This is a medium-severity resource-retention issue; no confidentiality or integrity impact is claimed.
Affected versions and patch
Affected versions are v4.15.0 through v4.16.0 and v5.0.0 through v5.4.0. The regression was introduced by commit e2133320c7, merged in #2852.
Upgrade to v4.16.1 or v5.4.1. The patch uses Go's HTTP reverse proxy, preserves ordinary HTTP handling for rejected upgrades, and closes both sides of a WebSocket tunnel when either direction ends. It also covers an upstream that receives client EOF but deliberately keeps its side open.
Fix commits: v4, v5.
Workarounds
Disable WebSocket proxy routes until upgrading, or apply bounded connection lifetimes and resource limits at the frontend and upstream. Server idle timeouts alone may not cover hijacked WebSocket connections.
Credits
Reported by @irisitymichaelgrundberg.
Severity
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:NReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Echo: BodyDump captures request and response bodies without size limits in v4
CVE-2026-118260 / GHSA-f48p-c9v4-h7xv
More information
Details
Impact
Echo v4's opt-in BodyDump middleware read complete request bodies into memory and retained complete response bodies without a capture limit. A client able to submit large requests to a route using BodyDump could cause large allocations before the application handler ran. Large responses, including responses whose size can be influenced by a client, also caused an additional unbounded capture allocation.
Repeated or concurrent requests can exhaust process memory and cause denial of service. BodyDump is not enabled by default. Deployments with effective request limits may reduce the request-side exposure; response capture requires separate consideration.
Affected versions and patch
Echo v4 versions through v4.16.0 are affected. Upgrade to v4.16.1.
The patch adds
BodyDumpConfig.MaxRequestBytesandMaxResponseBytes, each defaulting to 5 MiB when zero. A value of-1explicitly restores unlimited capture. The complete request remains readable by the handler and the complete response is delivered to the client; only the callback's captured data is bounded. Request close behavior and read errors are preserved.Fix commit.
Workarounds
Disable BodyDump on exposed routes, particularly large uploads and downloads. Alternatively, enforce body-size limits before BodyDump and independently bound the responses that the application generates.
Credits
Reported by @q490107865. The patch also incorporates request-body preservation work from @jakezwang in #3105.
Severity
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:NReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Echo: Rejected WebSocket upgrades can bypass Echo route-level access controls
CVE-2026-118264 / GHSA-cxf3-9h37-7rr8
More information
Details
Impact
Echo's Proxy middleware selected a raw tunnel when the client requested a WebSocket upgrade, before validating whether the configured upstream accepted it. If the upstream returned an ordinary HTTP response and kept the connection alive, subsequent HTTP requests on that connection were forwarded directly to the same upstream without passing through Echo's router or route-specific middleware.
This can bypass authentication or authorization enforced only at Echo's routes. Exploitation requires an accessible proxy route, an upstream that rejects the upgrade without closing the connection, and a target resource on that upstream without independent authorization. The issue does not provide arbitrary-host proxying or bypass the upstream's own authentication.
Affected versions and patch
The raw proxy implementation is present throughout the v4 and v5 release lines up to v4.16.0 and v5.4.0. Runtime reproductions confirmed v4.15.0, v4.16.0, v5.0.0 and v5.4.0; source history also shows the missing upgrade-response validation in v4.0.0.
Upgrade to v4.16.1 or v5.4.1. The patch routes WebSocket upgrades through Go's HTTP reverse proxy and enters a tunnel only after a valid upstream upgrade response. Rejected upgrades remain ordinary HTTP requests.
Fix commits: v4, v5.
Workarounds
Reject WebSocket upgrade requests before they reach affected Echo proxy routes, or enforce authorization independently at every upstream resource. Merely returning a non-101 response from the upstream does not prevent the vulnerable raw tunnel.
Credits
Reported by @Duodum.
Severity
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:N/SC:N/SI:N/SA:NReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Echo: Decompress permits unbounded gzip expansion in v4
CVE-2026-118261 / GHSA-h7wr-284f-5qvc
More information
Details
Impact
Echo v4's opt-in Decompress middleware exposed a gzip-decoded request stream without limiting its expanded size. A small compressed request could therefore produce a very large decoded body. Handlers that read or bind that body could consume excessive memory or CPU, and repeated or concurrent requests could cause denial of service.
The middleware is not enabled by default. A limit on the compressed request size alone does not bound the decompressed size. Applications that already apply an effective body limit after decompression have reduced exposure.
Affected versions and patch
Echo v4 versions through v4.16.0 are affected. Upgrade to v4.16.1.
The patch adds
DecompressConfig.MaxDecompressedSize, defaulting to 100 MiB when zero. A value of-1explicitly disables the limit. Reading beyond the cap returnsErrStatusRequestEntityTooLarge(HTTP 413), including through JSON and XML binding. Bodies exactly at the configured limit remain valid. Streaming enforcement requires callers to handle body-read errors.Fix commit.
Workarounds
Disable gzip request decompression on exposed routes, or place BodyLimit after Decompress so the application limit applies to decoded bytes. Apply suitable request deadlines and concurrency limits as well.
Credits
Reported by @q490107865. The exact-limit behavior incorporates @Shubham-Padkonde's work in #3136.
Severity
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:NReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Release Notes
labstack/echo (github.com/labstack/echo/v4)
v4.16.1Compare Source
Security fixes
Upgrade with
go get github.com/labstack/echo/v4@v4.16.1.Go 1.26 or later is now required to use patched
golang.org/x/dependencies. Build deployments with a supported, patched Go toolchain.golang.org/x/netto v0.60.0 and related dependencies, addressing GO-2026-6617, GO-2026-6612, GO-2026-6611, GO-2026-6610 and GO-2026-6603.Behavior to review when upgrading
BodyDumpConfig.MaxRequestBytesandMaxResponseBytescontrol capture limits. Zero selects the 5 MiB default;-1disables a limit. These limits affect captured logging data only: handlers and clients still receive complete bodies.DecompressConfig.MaxDecompressedSizecontrols the decompressed-body limit. Zero selects the 100 MiB default;-1disables it. Apply any smaller application body limit after decompression, and handle request-body read errors.The proxy removes incoming
Forwardedheaders as defensive hardening. Backends relying on that header should use forwarding headers generated from the configured trusted IP extractor and scheme. WebSocket requests now honor the configured proxy transport, response modifier, target path and query in the same way as HTTP requests;wsandwsstargets remain supported.Other changes
This release includes router fixes for escaped colons, inline verbs and parameter storage, binding support for OpenAPI date formats, and documentation updates. Benchmark comparisons now run only for pull requests with shorter samples.
Thanks to @Duodum, @irisitymichaelgrundberg, @q490107865, @Hama1cco, @jakezwang and @Shubham-Padkonde for reports and contributions, and to the contributors credited in the individual commits.
Validation: upstream lint checks and race tests passed on Linux, macOS and Windows with Go 1.26 and 1.27. Local tests on patched toolchains, vet, staticcheck and govulncheck also passed; govulncheck reported no reachable vulnerabilities. The module graph still contains an advisory for the unused, unmaintained
golang.org/x/crypto/openpgppackage (GO-2026-5932), which Echo does not import and for which no fixed dependency version is available.Full changelog: labstack/echo@v4.16.0...v4.16.1
v4.16.0Compare Source
Security
This release fixes several security issues. Upgrading is recommended. Some fixes change behavior; read "Behavior changes to check before upgrading" below.
Context.Scheme()now uses theX-Forwarded-Proto,X-Forwarded-Protocol,X-Forwarded-SslandX-Url-Schemeheaders only when the request comes directly from a loopback, link-local or private network address or a unix socket. Before this, any client could sendX-Forwarded-Proto: httpsover plain HTTP and skipHTTPSRedirect. WhenX-Forwarded-Protois present, only it is used (its last value), and the scheme is returned in lowercase. the newEcho#SchemeExtractorfield selects the strategy:ExtractSchemeFromHeaders(...TrustOption)(default),ExtractSchemeDirect()orLegacySchemeExtractor(). The Secure middleware now sets HSTS based onContext.Scheme(). The Proxy middleware always setsX-Forwarded-ProtofromContext.Scheme()and removesX-Forwarded-Ssl,X-Forwarded-ProtocolandX-Url-Schemebefore forwarding. GHSA-2ffq-g2xg-c22pContext.JSONPandContext.JSONPBlobaccept only a callback that is empty, a JavaScript identifier or a dot-separated path of identifiers (ASCII letters, digits,_and$). Any other callback returns a 400 Bad Request error that wraps the newErrInvalidJSONPCallback, and nothing is written. JSONP responses now carryX-Content-Type-Options: nosniff. JSONP lets any website read the response with the user's cookies, so do not use it for data that needs authentication. GHSA-h9g5-28mm-hx3gGET,HEAD,OPTIONS,TRACEorCONNECT. Before this, with theMethodFromFormorMethodFromQuerygetter and MethodOverride registered withUsebefore the CSRF middleware,_method=GETskipped the CSRF check. Register MethodOverride withEcho#Pre. GHSA-r7w9-592q-9vg4/%09/evil.example/redirected browsers toevil.example. GHSA-v753-g4cw-jm48/admin%2Fsecret.txtor/%61dmin/secret.txtcan no longer reach a file under a guarded/admin/*route. GHSA-375p-5qhx-8wq4 The Static middleware andStaticDirectoryHandler(used byEcho.Static,Echo.StaticFS,Group.StaticandGroup.StaticFS) no longer serve paths with a.,..or empty segment, such as/assets/../admin/secret.txt, also after path unescaping. GHSA-3pmx-cf9f-34xrgolang.org/x/textto v0.40.0 (GO-2026-5970).Client IP address (no code change in v4)
Without
Echo#IPExtractor,Context.RealIP()in v4 trusts theX-Forwarded-ForandX-Real-IPheaders from any client, so the rate limiter can be bypassed and the Proxy middleware forwards a spoofedX-Real-IP(GHSA-246p-cpwv-v3jq, GHSA-99jh-6h7p-pp36). Changing this default in v4 would put all clients behind a proxy into one rate-limit bucket, so v4 keeps it. Set an extractor that matches your deployment:v5 uses the direct peer address by default since v5.1.0.
Behavior changes to check before upgrading
100.64.0.0/10) address, itsX-Forwarded-Protois now ignored:HTTPSRedirectredirects in a loop and the Secure middleware stops sending HSTS. This affects, for example, Cloudflare, CloudFront and Azure Front Door connecting to a public origin, the GCP external HTTP(S) load balancer including GKE Ingress (35.191.0.0/16,130.211.0.0/22), and networks that use100.64.0.0/10(such as Alibaba Cloud SLB or EKS custom networking). Trust the proxy's address ranges:echo.LegacySchemeExtractor()restores the old behavior but is not safe unless every request passes through a proxy that sets these headers. Serverless adapters or middleware that setRemoteAddrto the client's address also makeX-Forwarded-Protoignored (or, if they take it from a header, spoofable).X-Forwarded-Proto. A proxy on a trusted address that passes the client'sX-Forwarded-Protothrough (for example nginx withoutproxy_set_header X-Forwarded-Proto $scheme;) still lets the client choose the scheme. An invalidX-Forwarded-Protovalue now results inhttpinstead of falling back to the other scheme headers.httptest.NewRequestsetsRemoteAddrto192.0.2.1:1234, which is not trusted, so tests that setX-Forwarded-Protonow seehttp. Setreq.RemoteAddr = "10.0.0.1:1234"or usee.SchemeExtractor = echo.LegacySchemeExtractor()in such tests.X-Forwarded-Ssl,X-Forwarded-ProtocolandX-Url-Schemeare no longer forwarded to the upstream;X-Forwarded-Protocarries the scheme.GET(for example withX-HTTP-Method-Override: GETto send a long query in a POST body) is no longer done; such requests keep the POST method./assets//app.js) now return 404; in HTML5 mode the index is still served. The Static middleware no longer finds file names that the client sends with non-default escaping (for example%2C,%40or lowercase hex like%c3%a9) unlessStaticConfig.EnablePathUnescapingis set;Echo.Statichas behaved this way since v4.15.4. WithStaticConfig.EnablePathUnescapingorEcho#EnablePathUnescapingStaticFiles, encoded dots (%2e%2e) no longer traverse directories, but encoded slashes are still decoded, so do not combine these options with route-based access control.Context.JSONPreturns an error for callbacks that are not JavaScript identifiers.Documentation
Echo#Useit runs before route and group middleware, so route guards do not protect the files it serves.If your company depends on Echo, please consider sponsoring it.
v4.15.4Compare Source
Security
Fixes GHSA-vfp3-v2gw-7wfq: an encoded path separator (
%2For%5C) in a static file URL could bypass route-level middleware (e.g. authentication on a sibling route) and disclose static files. BothStaticDirectoryHandler(used byStatic/StaticFS) and theStaticmiddleware are affected. Backport of the v5 fix (#3016, released in v5.2.1). Thanks to @a-tt-om and @oran-gugu for reporting.Make serving static file releated methods and middleware not unescape path by default - so how the way Router interprets paths and Static methods/middleware is consistent.
Given following situation:
Then requests to
/admin%2fprivate.txtwould not be matched toGET /admin/*route (routing does not look unescaped path) and static file serving will use unescaped path to serve the file.Note: this way of "guarding" subfolders will never work for for paths like
/assets/../admin%2fprivate.txtwhich willpath.Clean("/assets/../admin%2fprivate.txt")to/admin/private.txtand are servable if static file serving is configured to unescape paths.If you want to guard routes - use middlewares on
Static*methods and beforeStaticmiddleware.Breaking change / migration: If you serve files whose names contain URL-encoded characters (e.g.,
/hello%20world.txt→hello world.txt), you must now opt in:for static middleware
Full Changelog: labstack/echo@v4.15.3...v4.15.4
v4.15.3: - Static encoded-separator route bypass fix (GHSA-vfp3-v2gw-7wfq)Compare Source
Security
Fixes GHSA-vfp3-v2gw-7wfq: an encoded path separator (
%2For%5C) in a static file URL could bypass route-level middleware (e.g. authentication on a sibling route) and disclose static files. BothStaticDirectoryHandler(used byStatic/StaticFS) and theStaticmiddleware are affected. Backport of the v5 fix (#3009, released in v5.2.0). Thanks to @a-tt-om and @oran-gugu for reporting.Full Changelog: labstack/echo@v4.15.2...v4.15.3
Configuration
📅 Schedule: (UTC)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.