GHSA-g5jq-qmqr-qrwf

Suggest an improvement
Source
https://github.com/advisories/GHSA-g5jq-qmqr-qrwf
Import Source
https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/10/GHSA-g5jq-qmqr-qrwf/GHSA-g5jq-qmqr-qrwf.json
JSON Data
https://api.osv.dev/v1/vulns/GHSA-g5jq-qmqr-qrwf
Aliases
Published
2026-10-30T22:58:05Z
Modified
2026-10-30T23:15:05Z
Severity
  • 5.9 (Medium) CVSS_V3 - CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:H/I:L/A:N CVSS Calculator
Summary
Fiber: CORS wildcard origins matched without a dot boundary, allowing credentialed cross-origin reads
Details

Summary

In v2.52.1 and v2.52.2 the CORS middleware matched a wildcard origin such as https://*.example.com by suffix only, without a dot boundary and without comparing the scheme. Any origin whose host ends with the base domain, for example https://evil-example.com or http://notexample.com, was reflected in Access-Control-Allow-Origin, together with Access-Control-Allow-Credentials: true when AllowCredentials is enabled.

v2.52.3 replaced the matcher (#2915) and is not affected. The report was filed against v2.52.15, where the dot boundary holds; see "Other versions" below.

Details

v2.52.1 introduced validateDomain in middleware/cors/utils.go (f0cd3b44, part of the fix for GHSA-fmg4-x8pw-hjhg). It strips scheme and port from both sides and then checks only the suffix, with trimmedPattern = "example.com", so the character before the suffix is never checked:

if strings.HasPrefix(normalizedPattern, "*.") {
	trimmedPattern := normalizedPattern[2:]
	if strings.HasSuffix(normalizedDomain, trimmedPattern) {
		if normalizedDomain != trimmedPattern {
			if strings.TrimSuffix(normalizedDomain, trimmedPattern) != "" {
				return true
			}
		}
	}
}

v2.52.3 (1aac6f61, #2915) replaced it with a scheme-aware prefix/suffix split that keeps the leading dot in the suffix (.example.com).

Proof of concept

app := fiber.New()
app.Use(cors.New(cors.Config{
	AllowOrigins:     "https://*.example.com",
	AllowCredentials: true,
}))
app.Get("/", func(c *fiber.Ctx) error { return c.SendString("secret") })

Request with Origin: https://evil-example.com, as a GET and as a preflight (OPTIONS with Access-Control-Request-Method: GET):

Version https://evil-example.com http://evil-example.com
v2.52.0 not allowed not allowed
v2.52.1, v2.52.2 reflected, Access-Control-Allow-Credentials: true reflected, Access-Control-Allow-Credentials: true
v2.52.3 to v2.52.16 not allowed not allowed

Impact

An app that configures a wildcard-subdomain AllowOrigins with AllowCredentials: true lets any page on a domain that ends with the base domain (for example notexample.com for *.example.com) read authenticated responses cross-origin. Fixed in v2.52.3; upgrade to the latest v2 release.

Other versions

All v2 releases before v2.52.16 also accepted origins with empty labels (https://.example.com, https://a..example.com), and v2.52.3 to v2.52.15 mis-parsed a wildcard entry after a comma and a space ("https://a.com, https://*.example.com"). No registrable domain produces such an origin, so these are hardening rather than part of this advisory. They are fixed in v2.52.16 (#4792).

Database specific
{
    "cwe_ids":  [
        "CWE-346",
        "CWE-942"
    ],
    "github_reviewed":  true,
    "github_reviewed_at":  "2026-10-30T22:58:05Z",
    "nvd_published_at":  "2026-10-29T22:17:01Z",
    "severity":  "MODERATE"
}
References

Affected packages

Go / github.com/gofiber/fiber/v2

Package

Name
github.com/gofiber/fiber/v2
View open source insights on deps.dev
Purl
pkg:golang/github.com/gofiber/fiber/v2

Affected ranges

Type
SEMVER
Events
Introduced
2.52.1
Fixed
2.52.3

Database specific

last_known_affected_version_range
"<= 2.52.2"
source
"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/10/GHSA-g5jq-qmqr-qrwf/GHSA-g5jq-qmqr-qrwf.json"