Summary
CVE-2026-15747 is a critical-severity (CVSS 9.1) BREACH compression oracle vulnerability in Mojolicious, the Perl real-time web framework, affecting versions 4.59 through 9.47. The flaw allows an unauthenticated, remote attacker to recover a victim session’s CSRF token from gzip-compressed HTTP responses and subsequently submit forged authenticated requests, fully bypassing the framework’s built-in CSRF protection. Mojolicious 9.48, released July 14, 2026, resolves the issue.
Technical details
- Root cause: The
_csrf_tokenhelper generates and caches a single token per session, returning the identical value on every call. The_csrf_fieldhelper embeds this static value as a hiddencsrf_tokeninput in every protected form. Because the token never changes within a session, it is a stable, predictable secret present in every CSRF-protected response. - Trigger conditions: The attack requires that (1) gzip compression is enabled on the server, (2) attacker-controlled input is reflected in the same compressed response that carries the CSRF token, and (3) the attacker can issue repeated queries and observe resulting compressed response lengths — the standard prerequisites for a BREACH oracle.
- Attack vector: Remote and unauthenticated over the network. An attacker submits crafted requests varying a guessed token prefix; differences in compressed response lengths leak bits of the real token character by character.
- Impact: Successful token recovery allows the attacker to pass
csrf_protectvalidation and submit forged requests on behalf of a logged-in victim, enabling unauthorized state changes, account takeover, and other high-impact authenticated actions.
Affected software
- Mojolicious (Perl) — versions 4.59 through 9.47 (all versions before 9.48)
Severity
- CVSS v3.1 Base Score: 9.1 (Critical)
- Vector:
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N
Mitigation and recommended actions
- Immediate: Upgrade Mojolicious to version 9.48 or later. The fix replaces the static per-session token with a per-request masked token: each response returns a fresh random mask XORed with the underlying session-bound secret, ensuring the value exposed in any given response is unique and the compression oracle yields no usable signal.
- If immediate patching is not feasible: Disable HTTP response compression (gzip) at the application or reverse-proxy level. Because the BREACH attack depends entirely on observing length differences in compressed output, disabling compression eliminates the side-channel.
IONIX Status
The IONIX research team is tracking ongoing exploitation attempts and recommends immediate patching. Potentially affected assets are outlined in this post.

