Description
Catalyst::Seal versions before 0.03 for Perl allow one request to disable a path or route a later one past an authorization check via a dispatch memo keyed on the request path alone.

Catalyst::Seal replaces the dispatcher's prepare_action with a version that memoises how a path resolved: which dispatch type matched, at which level, and what was left over as arguments. The key is the request path and nothing else. Action roles that match on the method, content type, scheme or query make that resolution depend on state the key does not carry, so the memo answers for a request it was not built from.

A path that resolves to no action is memoised as well, and replaying that entry returns without consulting any dispatch type, so no action is set and the request fails. A GET of a path whose action is declared POST-only therefore disables that path for every later request, the correct POST included. An entry that did resolve replays the level the earlier descent reached. Where a POST-only action sits below a shallower action on the same path, a GET memoises the shallow route, and a later POST is dispatched there with an auto() guarding the deeper controller never running.

The memo is cleared only when an action is registered, which happens at setup, so an entry lasts for the life of the process, and its cap of 2048 entries bounds how many paths one caller can disable. In the configuration measured, the misroute lands on the less privileged action, so it is an authorization check not running rather than a privilege gain.
Published: 2026-09-24
Score: 8.8 High
EPSS: < 1% Very Low
KEV: No
Impact: Authorization bypass via request path memoization
Action: Immediate Patch
AI Analysis

Impact

A request to a Catalyst::Seal application can create an entry in a dispatch memo that is keyed only on the request path. This memo can be reused for subsequent requests regardless of their method, content type, or query. As a result, a POST‑only route can be disabled by a preceding GET, or a less privileged route can be dispatched instead of a deeper, more privileged one. The vulnerability allows an attacker to bypass authorization checks by reusing or replaying these memo entries, potentially enabling execution of actions that are otherwise protected.

Affected Systems

Perl applications that use Catalyst::Seal versions earlier than 0.03 are affected. The flaw is present in Catalyst::Seal 0.02 and any earlier releases. Upgrading to 0.03 or later removes the memoization logic that uses only the request path as a key.

Risk and Exploitability

The vulnerability can be exploited remotely by sending crafted HTTP requests to the target application. An attacker does not need elevated privileges to mount an attack; merely the ability to send requests to the web server is sufficient. The exploit does not require any known public exploits, but the EPSS score <1% indicates a low probability of exploitation. The existence of the flaw and its ability to bypass authorization checks suggests a high likelihood of targeted exploitation in environments where Catalyst::Seal is deployed. The CVSS score 8.8 indicates the flaw has high severity. The flaw is not listed in the CISA KEV catalog, indicating no confirmed real‑world exploitation at the time of this analysis.

Generated by OpenCVE AI on September 26, 2026 at 00:12 UTC.

Remediation

Vendor Solution

Upgrade to Catalyst-Seal 0.03 or later.


Vendor Workaround

For deployments that are not able to upgrade to Catalyst-Seal 0.03, set CATALYST_SEAL=0 in the application's environment, which leaves the application as stock Catalyst.


OpenCVE Recommended Actions

  • Upgrade to Catalyst‑Seal version 0.03 or later.
  • If an upgrade cannot be performed immediately, set the environment variable CATALYST_SEAL=0 for the application to disable the seal functionality and revert to standard Catalyst dispatch behavior
  • Restart the application after setting the environment variable to ensure the change takes effect
  • Review the application's routing configuration to identify any POST‑only actions that may be affected by path memoization and adjust or remove such routes as a precaution

Generated by OpenCVE AI on September 26, 2026 at 00:12 UTC.

Tracking

Sign in to view the affected projects.

Advisories

No advisories yet.

History

Mon, 28 Sep 2026 20:15:00 +0000

Type Values Removed Values Added
First Time appeared Perl
Perl catalyst::seal
Vendors & Products Perl
Perl catalyst::seal

Sat, 26 Sep 2026 07:30:00 +0000

Type Values Removed Values Added
Metrics ssvc

{'options': {'Automatable': 'no', 'Exploitation': 'none', 'Technical Impact': 'total'}, 'version': '2.0.3'}


Fri, 25 Sep 2026 17:30:00 +0000

Type Values Removed Values Added
Metrics cvssV3_1

{'score': 8.8, 'vector': 'CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H'}


Fri, 25 Sep 2026 01:30:00 +0000


Thu, 24 Sep 2026 22:00:00 +0000

Type Values Removed Values Added
Description Catalyst::Seal versions before 0.03 for Perl allow one request to disable a path or route a later one past an authorization check via a dispatch memo keyed on the request path alone. Catalyst::Seal replaces the dispatcher's prepare_action with a version that memoises how a path resolved: which dispatch type matched, at which level, and what was left over as arguments. The key is the request path and nothing else. Action roles that match on the method, content type, scheme or query make that resolution depend on state the key does not carry, so the memo answers for a request it was not built from. A path that resolves to no action is memoised as well, and replaying that entry returns without consulting any dispatch type, so no action is set and the request fails. A GET of a path whose action is declared POST-only therefore disables that path for every later request, the correct POST included. An entry that did resolve replays the level the earlier descent reached. Where a POST-only action sits below a shallower action on the same path, a GET memoises the shallow route, and a later POST is dispatched there with an auto() guarding the deeper controller never running. The memo is cleared only when an action is registered, which happens at setup, so an entry lasts for the life of the process, and its cap of 2048 entries bounds how many paths one caller can disable. In the configuration measured, the misroute lands on the less privileged action, so it is an authorization check not running rather than a privilege gain.
Title Catalyst::Seal versions before 0.03 for Perl allow one request to disable a path or route a later one past an authorization check via a dispatch memo keyed on the request path alone
Weaknesses CWE-1023
CWE-706
References

Subscriptions

Perl Catalyst::seal
cve-icon MITRE

Status: PUBLISHED

Assigner: CPANSec

Published:

Updated: 2026-09-25T16:35:28.629Z

Reserved: 2026-09-03T21:41:23.076Z

Link: CVE-2026-85491

cve-icon Vulnrichment

Updated: 2026-09-25T00:18:42.592Z

cve-icon NVD

Status : Deferred

Published: 2026-09-24T22:17:02.027

Modified: 2026-09-25T17:17:16.240

Link: CVE-2026-85491

cve-icon Redhat

No data.

cve-icon OpenCVE Enrichment

Updated: 2026-09-28T19:43:10Z

Weaknesses
  • CWE-1023

    Incomplete Comparison with Missing Factors

  • CWE-706

    Use of Incorrectly-Resolved Name or Reference