CVE-2026-50559
Authentication/Authorization Bypass via Advanced Path Normalization Vulnerabilities
Quarkus is a Java framework for building cloud-native applications. Prior to versions 3.37.0, 3.36.3, 3.33.2.1, 3.33.3, 3.27.4.1, 3.27.5, and 3.20.6.2, Quarkus HTTP path-based authorization policies can be bypassed using encoded semicolons (%3B) to smuggle matrix parameters past the security layer, and using encoded slashes (%2F) or backslashes (%5C) to access protected static resources. This is a distinct issue from CVE-2026-39852, which addressed only literal semicolon stripping. Versions 3.37.0, 3.36.3, 3.33.2.1, 3.33.3, 3.27.4.1, 3.27.5, and 3.20.6.2 contain a patch.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- None
- User interaction
- None
What an attacker can affect
- Confidentiality
- High
- Integrity
- None
- Availability
- None
Exploit likelihood
What each source reports
CVE List Score used
7.5
Authentication/Authorization Bypass via Advanced Path Normalization Vulnerabilities
Quarkus is a Java framework for building cloud-native applications. Prior to versions 3.37.0, 3.36.3, 3.33.2.1, 3.33.3, 3.27.4.1, 3.27.5, and 3.20.6.2, Quarkus HTTP path-based authorization policies can be bypassed using encoded semicolons (%3B) to smuggle matrix parameters past the security layer, and using encoded slashes (%2F) or backslashes (%5C) to access protected static resources. This is a distinct issue from CVE-2026-39852, which addressed only literal semicolon stripping. Versions 3.37.0, 3.36.3, 3.33.2.1, 3.33.3, 3.27.4.1, 3.27.5, and 3.20.6.2 contain a patch.
- Record
CVE-2026-50559- CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N - Weakness
- CWE-287, CWE-863, CWE-551
- Updated
- 2026-11-02
EUVDEUVD-2026-38084
7.5
Quarkus is a Java framework for building cloud-native applications. Prior to versions 3.37.0, 3.36.3, 3.33.2.1, 3.33.3, 3.27.4.1, 3.27.5, and 3.20.6.2, Quarkus HTTP path-based authorization policies can be bypassed using encoded semicolons (%3B) to smuggle matrix parameters past the security layer, and using encoded slashes (%2F) or backslashes (%5C) to access protected static resources. This is a distinct issue from CVE-2026-39852, which addressed only literal semicolon stripping. Versions 3.37.0, 3.36.3, 3.33.2.1, 3.33.3, 3.27.4.1, 3.27.5, and 3.20.6.2 contain a patch.
- Record
EUVD-2026-38084- CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-qcxp-gm7m-4j5v
7.5
Quarkus: Authentication/Authorization Bypass via Advanced Path Normalization Vulnerabilities
Quarkus HTTP path-based authorization policies can be bypassed using encoded semicolons (%3B) to smuggle matrix parameters past the security layer, and using encoded slashes (%2F) or backslashes (%5C) to access protected static resources. This is a distinct issue from CVE-2026-39852, which addressed only literal semicolon stripping.
Technical Details
The security layer (AbstractPathMatchingHttpSecurityPolicy) normalizes request paths using Vert.x's normalizedPath(), which only decodes unreserved RFC 3986 characters (letters, digits, -, ., _, ~). It then strips matrix parameters by looking for literal ; characters. This creates two mismatches:
- Encoded semicolons (
%3B): Since%3Bis not decoded by normalizedPath(), the matrix parameter stripping in pathWithoutMatrixParams() never sees it. The encoded semicolon and everything after it become part of the path segment, causing policy matching to fail. This affects all path-policy-protected endpoints. - Static resource path mismatch: Static resource handlers (StaticHandlerImpl, FileSystemStaticHandler) perform full
percent-decoding via URIDecoder.decodeURIComponent() and backslash-to-slash conversion before filesystem resolution.
Reserved characters like
%2F(slash) and%5C(backslash) that survive the security layer's partial decoding are fully decoded before file serving.
REST endpoints using Quarkus REST (RESTEasy Reactive) are not affected by the %2F/%5C vectors because the routing layer also uses normalizedPath() — both security and routing agree on the path, so no mismatch exists.
Attack Vectors
Encoded semicolon (matrix parameter smuggling), affects all path-policy-protected endpoints:
/api/admin%3Bbypass=true/data: security sees this as a single segmentadmin%3Bbypass=true, which does not match the/api/admin/* policy. The request passes through unauthenticated./api/secret%3b/data: same mechanism with lowercase hex digit.
Encoded slash/backslash on static resources, affects static files behind path policies:
/static-secret%2Fhtml, security does not match /static-secret.html policy; static handler decodes%2Fto/and may resolve the file./static-secret%5Chtml. static handler decodes%5Cto\, then converts to/.
Double encoding, affects static resources:
/secret%252Fconfidential.html, first decode by normalizedPath() turns%25into%, producing%2F. Static handler's second decode turns%2Finto/.
The following vectors were investigated and confirmed not exploitable:
- Unreserved character encoding (
/api/adm%69n/data):normalizedPath()decodes these. Both security and routing see/api/admin/data. - Null byte injection (
/api/admin%00/data):%00is not decoded bynormalizedPath(). - Encoded dot segments (
/api/%2e%2e/secret/data): Period is unreserved, so%2eis decoded to.bynormalizedPath(), thenremoveDots()normalizes..segments. - REST endpoint bypass via
%2F/%5C: Routing uses the samenormalizedPath()as security. The encoded slash/backslash doesn't match any route.
Root Cause
pathWithoutMatrixParams() operates on the partially-decoded output of normalizedPath(), where reserved characters
remain encoded. It searches for literal ; but never sees %3B. The fix (normalizePath()) performs full percent-decoding
in a loop before stripping matrix parameters, removing null bytes, normalizing backslashes, and resolving dot
segments, aligning the security layer's view of the path with what downstream handlers resolve.
Impact
- Unauthenticated access to endpoints protected by
quarkus.http.auth.permissionpath-based policies via%3Bsmuggling - Static resource exposure by bypassing path policies on protected files via
%2F/%5C - Applications using annotation-based security (
@RolesAllowed,@Authenticated) on JAX-RS resources without path-based …
- Record
GHSA-qcxp-gm7m-4j5v- CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N - Weakness
- CWE-41, CWE-178, CWE-287, CWE-551, CWE-863
- Updated
- 2026-11-02
NVD
7.5
Quarkus is a Java framework for building cloud-native applications. Prior to versions 3.37.0, 3.36.3, 3.33.2.1, 3.33.3, 3.27.4.1, 3.27.5, and 3.20.6.2, Quarkus HTTP path-based authorization policies can be bypassed using encoded semicolons (%3B) to smuggle matrix parameters past the security layer, and using encoded slashes (%2F) or backslashes (%5C) to access protected static resources. This is a distinct issue from CVE-2026-39852, which addressed only literal semicolon stripping. Versions 3.37.0, 3.36.3, 3.33.2.1, 3.33.3, 3.27.4.1, 3.27.5, and 3.20.6.2 contain a patch.
- Record
CVE-2026-50559- CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N - Weakness
- CWE-287, CWE-863, CWE-551
- Updated
- 2026-11-02
OSVGHSA-qcxp-gm7m-4j5v
7.5
Quarkus: Authentication/Authorization Bypass via Advanced Path Normalization Vulnerabilities
Quarkus HTTP path-based authorization policies can be bypassed using encoded semicolons (%3B) to smuggle matrix parameters past the security layer, and using encoded slashes (%2F) or backslashes (%5C) to access protected static resources. This is a distinct issue from CVE-2026-39852, which addressed only literal semicolon stripping.
Technical Details
The security layer (AbstractPathMatchingHttpSecurityPolicy) normalizes request paths using Vert.x's normalizedPath(), which only decodes unreserved RFC 3986 characters (letters, digits, -, ., _, ~). It then strips matrix parameters by looking for literal ; characters. This creates two mismatches:
- Encoded semicolons (
%3B): Since%3Bis not decoded by normalizedPath(), the matrix parameter stripping in pathWithoutMatrixParams() never sees it. The encoded semicolon and everything after it become part of the path segment, causing policy matching to fail. This affects all path-policy-protected endpoints. - Static resource path mismatch: Static resource handlers (StaticHandlerImpl, FileSystemStaticHandler) perform full
percent-decoding via URIDecoder.decodeURIComponent() and backslash-to-slash conversion before filesystem resolution.
Reserved characters like
%2F(slash) and%5C(backslash) that survive the security layer's partial decoding are fully decoded before file serving.
REST endpoints using Quarkus REST (RESTEasy Reactive) are not affected by the %2F/%5C vectors because the routing layer also uses normalizedPath() — both security and routing agree on the path, so no mismatch exists.
Attack Vectors
Encoded semicolon (matrix parameter smuggling), affects all path-policy-protected endpoints:
/api/admin%3Bbypass=true/data: security sees this as a single segmentadmin%3Bbypass=true, which does not match the/api/admin/* policy. The request passes through unauthenticated./api/secret%3b/data: same mechanism with lowercase hex digit.
Encoded slash/backslash on static resources, affects static files behind path policies:
/static-secret%2Fhtml, security does not match /static-secret.html policy; static handler decodes%2Fto/and may resolve the file./static-secret%5Chtml. static handler decodes%5Cto\, then converts to/.
Double encoding, affects static resources:
/secret%252Fconfidential.html, first decode by normalizedPath() turns%25into%, producing%2F. Static handler's second decode turns%2Finto/.
The following vectors were investigated and confirmed not exploitable:
- Unreserved character encoding (
/api/adm%69n/data):normalizedPath()decodes these. Both security and routing see/api/admin/data. - Null byte injection (
/api/admin%00/data):%00is not decoded bynormalizedPath(). - Encoded dot segments (
/api/%2e%2e/secret/data): Period is unreserved, so%2eis decoded to.bynormalizedPath(), thenremoveDots()normalizes..segments. - REST endpoint bypass via
%2F/%5C: Routing uses the samenormalizedPath()as security. The encoded slash/backslash doesn't match any route.
Root Cause
pathWithoutMatrixParams() operates on the partially-decoded output of normalizedPath(), where reserved characters
remain encoded. It searches for literal ; but never sees %3B. The fix (normalizePath()) performs full percent-decoding
in a loop before stripping matrix parameters, removing null bytes, normalizing backslashes, and resolving dot
segments, aligning the security layer's view of the path with what downstream handlers resolve.
Impact
- Unauthenticated access to endpoints protected by
quarkus.http.auth.permissionpath-based policies via%3Bsmuggling - Static resource exposure by bypassing path policies on protected files via
%2F/%5C - Applications using annotation-based security (
@RolesAllowed,@Authenticated) on JAX-RS resources without path-based …
- Record
GHSA-qcxp-gm7m-4j5v- CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N - Weakness
- CWE-178, CWE-287, CWE-41, CWE-551, CWE-863
- Updated
- 2026-11-02
Affected products
- quarkus
- quarkusio quarkus
- red hat cryostat 4 on rhel 9
- red hat openshift serverless
- red hat build of apache camel - hawtio 4
- red hat build of apache camel 3.33 for quarkus 3.33.2.sp1
- red hat build of apache camel 4 for quarkus 3
- red hat build of apicurio registry 3
- red hat build of debezium 3
- red hat build of keycloak
- red hat build of quarkus 3.20.6.sp2
- red hat build of quarkus 3.27.4.sp1
Affected packages
| Package | Affected | Fixed |
|---|---|---|
io.quarkus:quarkus-vertx-httpMaven |
before 3.20.6.2 | 3.20.6.2 |
io.quarkus:quarkus-vertx-httpMaven |
3.21.0.CR1 up to 3.27.4.1 | 3.27.4.1 |
io.quarkus:quarkus-vertx-httpMaven |
3.28.0.CR1 up to 3.33.2.1 | 3.33.2.1 |
io.quarkus:quarkus-vertx-httpMaven |
3.34.0.CR1 up to 3.36.3 | 3.36.3 |
io.quarkus:quarkus-vertx-httpMaven |
3.37.0.CR1 up to 3.37.0 | 3.37.0 |
io.quarkus:quarkus-vertx-httpMaven |
before 3.20.6.2, plus listed versions 0.23.00.23.10.23.20.24.00.25.0 Show 45 moreShow less0.26.00.26.10.27.00.28.00.28.11.0.0.CR11.0.0.CR21.0.0.Final1.0.1.Final1.1.0.CR11.1.0.Final1.1.1.Final1.10.0.CR11.10.0.Final1.10.1.Final1.10.2.Final1.10.3.Final1.10.4.Final1.10.5.Final1.11.0.Beta11.11.0.Beta21.11.0.CR11.11.0.Final1.11.1.Final1.11.2.Final1.11.3.Final1.11.4.Final1.11.5.Final1.11.6.Final1.11.7.Final1.12.0.CR11.12.0.Final1.12.1.Final1.12.2.Final1.13.0.CR11.13.0.Final1.13.1.Final1.13.2.Final1.13.3.Final1.13.4.Final1.13.5.Final1.13.6.Final1.13.7.Final1.2.0.CR11.2.0.Final |
3.20.6.2 |
io.quarkus:quarkus-vertx-httpMaven |
3.21.0.CR1 up to 3.27.4.1, plus listed versions 3.21.03.21.13.21.23.21.33.21.4 Show 37 moreShow less3.22.03.22.0.CR13.22.13.22.23.22.33.23.03.23.0.CR13.23.13.23.23.23.33.23.43.24.03.24.0.CR13.24.13.24.23.24.33.24.43.24.53.25.03.25.0.CR13.25.13.25.23.25.33.25.43.26.03.26.0.CR13.26.13.26.23.26.33.26.43.27.03.27.0.CR13.27.13.27.23.27.33.27.3.13.27.4 |
3.27.4.1 |
io.quarkus:quarkus-vertx-httpMaven |
3.28.0.CR1 up to 3.33.2.1, plus listed versions 3.28.03.28.13.28.23.28.33.28.4 Show 34 moreShow less3.28.53.29.03.29.0.CR13.29.13.29.23.29.33.29.43.30.03.30.0.CR13.30.13.30.23.30.33.30.43.30.53.30.63.30.73.30.83.31.03.31.0.CR13.31.13.31.23.31.33.31.43.32.03.32.0.CR13.32.13.32.23.32.33.32.43.33.03.33.0.CR13.33.13.33.1.13.33.2 |
3.33.2.1 |
io.quarkus:quarkus-vertx-httpMaven |
3.34.0.CR1 up to 3.36.3, plus listed versions 3.34.03.34.13.34.23.34.33.34.4 Show 13 moreShow less3.34.53.34.63.34.73.35.03.35.0.CR13.35.13.35.23.35.33.35.43.36.03.36.0.CR13.36.13.36.2 |
3.36.3 |
History
| Recorded | Changed | Sources |
|---|---|---|
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-50559 is a high vulnerability (CVSS 7.5) in Quarkus, published June 19, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 1.02%, the 63rd percentile. Fixed in io.quarkus:quarkus-vertx-http 3.20.6.2.
References
github.com/quarkusio/quarkus/security/advisories/GHSA-qcxp-gm7m-4j5v
access.redhat.com/security/cve/CVE-2026-50559
bugzilla.redhat.com/show_bug.cgi?id=2486959
security.access.redhat.com/data/csaf/v2/vex/2026/cve-2026-50559.json
access.redhat.com/errata/RHSA-2026:48151
access.redhat.com/errata/RHSA-2026:26586
Show 10 moreShow less
access.redhat.com/errata/RHSA-2026:36820
access.redhat.com/errata/RHSA-2026:26194
access.redhat.com/errata/RHSA-2026:26018
access.redhat.com/errata/RHSA-2026:26017
access.redhat.com/errata/RHSA-2026:34608
access.redhat.com/errata/RHSA-2026:54435
nvd.nist.gov/vuln/detail/CVE-2026-50559
github.com/quarkusio/quarkus/commit/919b80017d85564143a845b38e9cca54aff5b3cc
github.com/advisories/GHSA-qcxp-gm7m-4j5v
github.com/quarkusio/quarkus
Left out here: 307 versions and the rest of 2 source descriptions. The JSON record has them.