CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-25882
5.50.04%

Panic at the Router: Crashing Go Fiber with a Single Request

Amit Schendel
Amit Schendel
Senior Security Researcher

Feb 24, 2026·5 min read·6 visits

PoC Available

Executive Summary (TL;DR)

Fiber, a high-performance Go web framework, has a hard limit of 30 parameters per route. Before the fix, the router didn't check this limit during request processing. Sending a request to a route with 31+ parameters causes a specific `index out of range` panic, killing the Go routine or the entire application. Update to v2.52.12 or v3.1.0 to fix it.

A critical Denial of Service (DoS) vulnerability exists in the Fiber web framework (v2 and v3) due to an unchecked array index write. By defining a route with more than 30 parameters and sending a matching request, an attacker can trigger a runtime panic, crashing the application. This stems from a hardcoded limit in Fiber's context structure that was not enforced during request routing.

The Hook: Speed Kills

In the world of Go web frameworks, Fiber sells itself on one thing: raw, unadulterated speed. It’s the drag racer of the ecosystem, stripping away the heavy safety features of net/http in favor of fasthttp and zero-allocation practices. To achieve this blistering performance, Fiber makes assumptions. It pre-allocates memory. It avoids garbage collection overhead like the plague.

But here is the thing about drag racers: they don't handle unexpected bumps very well. In their quest to avoid heap allocations, the Fiber developers made a classic optimization trade-off. They decided that no reasonable web developer would ever need more than 30 parameters in a single URL route. I mean, who writes /api/:a/:b/:c.../:z? That would be madness, right?

Well, madness is a security researcher's bread and butter. It turns out that by hardcoding this limit but failing to enforce it at runtime, Fiber left the door open for a trivial Denial of Service. It’s not a complex memory corruption exploit involving ROP chains; it’s a simple case of the code running off the edge of a cliff because it forgot to look down.

The Flaw: A Tale of Fixed Arrays

To understand this bug, you have to look at how Fiber handles request contexts. In a standard Go web server, you might allocate a map or a slice to hold route parameters (like :id or :user). Maps are flexible, but they are slow (relatively speaking) and involve memory allocation. Fiber hates allocation.

So, in ctx.go, Fiber defines its context with a fixed-size array. Not a slice, an array. This is a stack-allocated, fixed-memory structure. Here is the smoking gun:

const maxParams = 30
 
type DefaultCtx struct {
    values [maxParams]string  // The trap is set here
    // ... other fields
}

The values array can hold exactly 30 strings. No more. The vulnerability arises in the routing logic found in path.go. When an HTTP request comes in, Fiber tries to match the URL path against registered routes. If it matches a wildcard or a parameter segment, it iterates a counter and saves the value into this array.

The logic failure (CWE-129) is stunningly simple: Nobody checked if the counter exceeded 30.

The router happily increments the index paramsIterator for every match. If you have a route with 35 parameters, the loop runs 35 times. On the 31st iteration, it tries to write to values[30]. In C or C++, this would be a heap buffer overflow or stack smash, potentially leading to Remote Code Execution. In Go, it triggers a runtime panic: runtime error: index out of range [30] with length 30.

The Exploit: Crashing the Party

Exploiting this is almost too easy. First, we need a target application that has defined a route with a ridiculous number of parameters. You might think, "Nobody does that." But consider:

  1. Auto-generated code: API generators based on database schemas often create deep, nested routes.
  2. SEO spam: Applications handling complex categories like /shop/:category/:subcategory/:brand/:model/:year/....
  3. GraphQL-ish endpoints: REST APIs trying to emulate graph depth.

If an application has a route like this:

app.Get("/:p1/:p2/.../:p35", handler)

The application will start successfully. The bomb is planted. The trigger is a simple HTTP request.

# The payload is just a URL. No shellcode required.
curl http://target.com/v1/v2/v3/v4/v5/v6/v7/v8/v9/v10/v11/v12/v13/v14/v15/v16/v17/v18/v19/v20/v21/v22/v23/v24/v25/v26/v27/v28/v29/v30/v31

When the server receives this, the router iterates. p1 goes to index 0. p30 goes to index 29. p31 attempts to go to index 30. BOOM.

The Go runtime panics. Depending on the middleware configuration (specifically if Recover middleware is used and positioned correctly), this might just kill the request. However, if the panic occurs deep in the routing logic before the recovery middleware wraps the execution, or if the panic unwinds the stack in a way that bypasses the handler, the entire Go routine crashes. In some configurations, this brings down the whole process.

The Fix: Fail Fast, Fail Loud

The remediation chosen by the Fiber team is interesting. They didn't increase the array size (which would increase memory usage for every single request). They didn't change the array to a slice (which would kill performance).

Instead, they implemented a Fail-Fast check at startup. They modified the route registration logic to count the parameters before the server even starts listening.

Here is the diff in path.go:

func parseRoute(pattern string, ...) routeParser {
    // ... existing parsing logic ...
 
    // The Fix: Stop the developer from shooting themselves in the foot
    if len(parser.params) > maxParams {
        panic(fmt.Errorf("Route '%s' has %d parameters, which exceeds the maximum of %d",
            pattern, len(parser.params), maxParams))
    }
    return parser
}

Now, if a developer tries to register that 35-parameter route, the application crashes immediately on boot. This is the correct engineering decision: prevent the vulnerable state from ever existing in a running application.

Takeaway for Developers: Input validation isn't just for user data. It's for developer data too. If your system has hard limits (like a buffer size), you must enforce them at the API boundary, not hope the caller is polite.

Official Patches

Go FiberFiber v2 Patch Release
Go FiberFiber v3 Patch Release

Fix Analysis (1)

Technical Appendix

CVSS Score
5.5/ 10
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N/E:P
EPSS Probability
0.04%
Top 85% most exploited
50,000
Estimated exposed hosts via Shodan

Affected Systems

Fiber v2 < 2.52.12Fiber v3 < 3.1.0

Affected Versions Detail

Product
Affected Versions
Fixed Version
Fiber
gofiber
>= 2.0.0, < 2.52.122.52.12
Fiber
gofiber
>= 3.0.0, < 3.1.03.1.0
AttributeDetail
CWE IDCWE-129
Attack VectorNetwork
CVSS Score5.5 (Medium)
ImpactDenial of Service (DoS)
VulnerabilityIndex Out of Bounds Panic
ComponentFiber Router (getMatch)

MITRE ATT&CK Mapping

T1499Endpoint Denial of Service
Impact
CWE-129
Improper Validation of Array Index

Improper Validation of Array Index

Known Exploits & Detection

GitHubOriginal issue discussion and PoC

Vulnerability Timeline

Vulnerability Discovered
2024-12-24
PoC Confirmed
2024-12-25
Fix Commit Pushed
2025-12-25
Public Disclosure
2026-02-24

References & Sources

  • [1]GHSA Advisory
  • [2]NVD Detail

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.