Home/ Blog/ Security news/ Article
Blog · Security news

Quarkus fixed a semicolon auth bypass in May. Its encoded cousin just reopened it.

Quarkus fixed a semicolon authorization bypass in May, but CVE-2026-50559 reopens it with URL-encoded characters. What to patch now and how to detect abuse.

Two misaligned translucent corridor maps with a thin route slipping through the seam

Quarkus shipped emergency releases on June 17 to close its second authorization bypass in about six weeks, and the repeat is the real story. In May the framework patched a flaw where a bare semicolon in a URL let a request walk past path-based access rules (CVE-2026-39852). The new one, CVE-2026-50559, does the same trick with the URL-encoded versions of those characters. If you protect Quarkus routes or static files by their path, an unauthenticated request can now reach them, and the patch you applied in May does not stop it.

Upgrade today. Quarkus released fixes across every supported stream: 3.20.6.2, 3.27.4.1, 3.27.5, 3.33.2.1, 3.33.3, 3.36.3, and 3.37.0. The fastest path is to update the Quarkus command-line tool and run quarkus update. Red Hat ships the fix as Red Hat build of Quarkus 3.20.6.SP2.

What CVE-2026-50559 actually does

Quarkus lets you guard endpoints by URL path, for example a rule that says everything under /api/admin requires a role. The bug is that two parts of the framework disagree about what the path in a request really is. The security check reads one version of the path; the router and the static-file handler read another. An attacker lives in that gap.

There are two ways in. The first abuses a matrix parameter, the part of a URL that follows a semicolon (as in /page;key=value). An encoded semicolon, written %3B, slips past the security check because the check only looks for a plain ;. The router then decodes it and still sends the request to the protected method. A call to /api/admin%3Banything can clear a policy meant for /api/admin while landing on the real handler.

The second way targets static files. The handler that serves files fully decodes percent-encoded characters, while the security layer only partially decodes them. Encoded slashes (%2F) and backslashes (%5C) let an attacker describe a path the security layer never recognizes as protected, then have the file server resolve it back to the real, guarded resource. The result is unauthorized read access and information disclosure.

Why the May patch missed it

This is the part worth sitting with. CVE-2026-39852, fixed on May 4, removed the literal semicolon. It did nothing about %3B, and nothing about encoded slashes at all. The root cause, per Quarkus's advisory, is that the routine meant to strip matrix parameters searches for a plain ; and never sees the encoded form. So the first fix closed one spelling of the attack and left the others wide open.

Path-normalization bugs reward this kind of one-character patching with a steady supply of sequels. When your authorization filter and your router do not agree on a single canonical form of the path, every encoding becomes a fresh bypass: the literal character, the percent-encoded character, double encoding, mixed case, overlong forms. Fixing them one glyph at a time is a losing trade. The durable fix is architectural: decode and normalize the path once, to a single canonical form, before either the security layer or the router is allowed to read it. Until that happens, assume more of these are coming.

The static-file vector is the sleeper

Most teams reason hard about who can call their interfaces and forget that the same path policies often guard served files. Build artifacts, internal dashboards, exported config, and backup blobs all tend to sit behind a path rule rather than a code-level check. An information-disclosure rating sounds mild right up until the file it exposes is a configuration dump with a database password in it.

One detail softens the blow. The encoded slash and backslash vectors do not defeat annotation-based security such as @RolesAllowed on a method. If your sensitive endpoints are protected in code rather than only by a path rule, those keep holding. That is also the lesson: defense that rides on the URL string is fragile, because the URL string is exactly what an attacker controls and what every layer parses a little differently.

What to do now

  • Patch. Move to the fixed release in your stream, or run quarkus update. Do not assume the May update covered you, because it did not.
  • Hunt your access logs. Look for requests whose path contains %3B, %2F, %5C, or a stray literal ; aimed at admin or static paths, especially any that returned a 200. That pattern against a route that should demand a login is worth a closer look.
  • Re-test your path rules. For every path-based policy, replay the protected request with an encoded semicolon and an encoded slash appended, then confirm it is now refused.
  • Move what matters into code. Where a route truly must not be reached without a role, back the path rule with an annotation-based check so a normalization slip cannot quietly open it.

CVE-2026-50559 carries a CVSS score of 7.5, all of it confidentiality, with no integrity or availability impact. Read-only does not mean low stakes here. An unauthenticated read against an admin route or a protected file is precisely how credentials and internal data leak in the first place. We have watched the same path-confusion pattern surface in unauthenticated Joomla compromises, in pre-auth Splunk exposure, and in token bypasses like the Perry JWT expiry flaw. The framework changes. The gap between what one layer checks and what another executes does not.

Frequently asked questions

What is CVE-2026-50559 in Quarkus?

CVE-2026-50559 is an authorization bypass in the Quarkus Java framework's HTTP layer. An unauthenticated attacker can reach routes and static files protected by path-based rules by URL-encoding semicolons, slashes, or backslashes in the request path. It carries a CVSS score of 7.5.

Which Quarkus versions fix CVE-2026-50559?

Quarkus fixed CVE-2026-50559 in releases 3.20.6.2, 3.27.4.1, 3.27.5, 3.33.2.1, 3.33.3, 3.36.3, and 3.37.0, shipped as emergency updates on June 17, 2026. Red Hat build of Quarkus 3.20.6.SP2 includes the fix. Running quarkus update moves a project to the patched release in its stream.

How is CVE-2026-50559 different from CVE-2026-39852?

CVE-2026-39852, patched on May 4, 2026, stripped only a literal semicolon from the path before the authorization check. CVE-2026-50559 covers the URL-encoded forms it missed: encoded semicolons, slashes, and backslashes. The May fix does not protect against the encoded bypass, so a separate upgrade is required.

Is CVE-2026-50559 being exploited in the wild?

There is no public evidence of in-the-wild exploitation as of June 19, 2026. The bug is simple to trigger, the fix is public, and proof-of-concept paths are easy to derive, so treat the upgrade as urgent rather than waiting for confirmed attacks.

How do I detect attempts to exploit CVE-2026-50559?

Search HTTP access logs for requests whose path contains %3B, %2F, %5C, or a stray semicolon aimed at admin or static routes, particularly any that returned a 200 status. A successful, unauthenticated hit on a path that should require a login is the signal to investigate.

Ready to meet the Guardians?

Deploys fast - agentless for monitoring and cloud, a lightweight agent for deep endpoint security. Just Suriq, standing watch.