CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-49400

CVE-2026-49400: PHP Object Injection Sandbox Escape in October CMS SessionMaker

Amit Schendel
Amit Schendel
Senior Security Researcher

Sep 15, 2026·6 min read·6 visits

Executive Summary (TL;DR)

October CMS unserialized widget session states without class restrictions, enabling PHP Object Injection and sandbox escapes in sandboxed safe-mode deployments.

A security vulnerability in October Content Management System (CMS) involves the deserialization of untrusted data (CWE-502) within the backend SessionMaker trait. Prior to the patched versions, October CMS stored widget session states as base64-encoded serialized PHP objects. When loading these states, the application consumed them using unserialize() without enforcing class restrictions (allowed_classes). In configurations where cms.safe_mode is enabled to sandbox users with markup editor privileges, an attacker can exploit this behavior to instantiate arbitrary PHP classes and execute arbitrary code via accessible gadget chains.

Vulnerability Overview

The October CMS platform uses a core trait named Backend\Traits\SessionMaker to manage the state of backend widgets. This trait persists user interface configurations, such as active search parameters, sort orientations, selected record identifiers, and filter state values, across distinct HTTP requests. In standard production environments, backend access is restricted to highly trusted administrators who natively possess privileges to execute arbitrary PHP code through the CMS markup editor.

However, in environments where the CMS is configured for multi-tenancy, shared editing, or public demonstration platforms, administrators frequently enable the cms.safe_mode configuration. This safety boundary is specifically designed to isolate and sandbox backend administrative actions, preventing users of the CMS markup editor from executing arbitrary PHP code on the hosting server. Under safe mode, the markup editor is strictly constrained, establishing a security boundary between CMS layout customizers and the lower-level system runtime.

The inclusion of an unrestricted deserialization sink inside the SessionMaker trait creates a path for bypassing this sandbox boundary. Because administrative users with markup editing privileges can interact with and influence session storage paths, they can introduce serialized objects into the backend. When the application automatically processes these objects, the safety sandbox is bypassed, leading to execution of code at the level of the underlying operating system process.

Root Cause Analysis

The fundamental flaw resides in the use of PHP native unserialize() without specifying safety boundaries. In PHP applications, the unserialize() function processes a string representation of a serialized variable and converts it back into a PHP value. If the string represents an object, PHP attempts to instantiate that specific class and execute associated lifecycle hooks, commonly referred to as magic methods.

Prior to the patch, the unsession read operations within Backend\Traits\SessionMaker executed unserialize(base64_decode($value)) directly on data extracted from the application session cache. Because the second parameter of unserialize() was omitted, PHP defaulted to allowing all classes ('allowed_classes' => true). This default behavior permits the creation of any object currently declared within the execution scope of the PHP interpreter, including classes loaded via Composer dependencies.

To exploit this behavior, an attacker must construct a PHP gadget chain. A gadget chain is an ordered sequence of method calls across existing codebase classes where the execution of one magic method (such as __wakeup(), __destruct(), __toString(), or __call()) flows into other methods, ultimately terminating in a dangerous sink such as eval(), system(), or file write operations. Because October CMS is built on top of the Laravel framework and incorporates various third-party packages, numerous potential gadget chains exist within the application classpath.

Code-Level Analysis

Analyzing the implementation of Backend\Traits\SessionMaker reveals the technical difference between the vulnerable and patched states. The vulnerable version uses serialize() and unserialize() without restriction.

// Vulnerable Implementation
trait SessionMaker
{
    public function putSession($key, $value)
    { 
        // Objects are serialized and base64 encoded into session storage
        $serializedValue = base64_encode(serialize($value));
        Session::put($this->getSessionIndex() . '.' . $key, $serializedValue);
    }
 
    public function getSession($key, $default = null)
    { 
        $sessionKey = $this->getSessionIndex() . '.' . $key;
        if (!Session::has($sessionKey)) {
            return $default;
        }
        $value = Session::get($sessionKey);
        // Unsafe deserialization without limiting allowed classes
        return unserialize(base64_decode($value));
    }
}

The remediation eliminates PHP object injection by migrating the underlying persistence format to JSON. Since JSON parsing does not instantiate classes or trigger PHP magic methods, the object injection sink is closed. For backwards compatibility during the upgrade cycle, a fallback reader exists but restricts class instantiation by setting the allowed_classes option to false.

// Patched Implementation
trait SessionMaker
{
    public function putSession($key, $value)
    { 
        // Safe serialization using JSON instead of PHP serialize
        $jsonValue = json_encode($value);
        Session::put($this->getSessionIndex() . '.' . $key, $jsonValue);
    }
 
    public function getSession($key, $default = null)
    { 
        $sessionKey = $this->getSessionIndex() . '.' . $key;
        if (!Session::has($sessionKey)) {
            return $default;
        }
        $value = Session::get($sessionKey);
        
        // Attempt to decode using the safe JSON format
        $decoded = json_decode($value, true);
        if (json_last_error() === JSON_ERROR_NONE) {
            return $decoded;
        }
 
        // Secure fallback for legacy base64-serialized data
        $decodedBase64 = base64_decode($value, true);
        if ($decodedBase64 !== false) {
            // Hardened: class instantiation is strictly disabled
            return @unserialize($decodedBase64, ['allowed_classes' => false]);
        }
        return $default;
    }
}

Exploitation Dynamics and Constraints

To successfully exploit CVE-2026-49400, an attacker must overcome major operational hurdles and satisfy specific architectural constraints. First, the application must run with cms.safe_mode enabled. If safe mode is disabled, the vulnerability is functionally redundant because an authenticated backend administrator can already execute arbitrary PHP code directly via the template markup editor.

Second, the attacker must find a code path that allows writing arbitrary, untransformed data into a session key prefixed with widget.. Most standard October CMS widget implementations wrapper user inputs (such as search terms or pagination indexes) inside structured PHP array definitions before persistence. For example, if user input is stored as ['search' => $userInput], the outer structure remains an array rather than an arbitrary object, rendering direct object injection ineffective.

Consequently, exploitation requires identifying a specific component or API endpoint that accepts raw, non-wrapped input strings and writes them directly to the widget session storage. Once such a write vector is found, the attacker generates a target payload using a gadget generator tool, encodes it to base64, and injects it into the target session variable. The payload triggers when the widget state is read during the subsequent page load.

Impact Assessment

The impact of this vulnerability depends heavily on system configuration. Under default installations where cms.safe_mode is disabled, the risk is minimal. Administrative users already possess system-level privileges within the design editor, meaning the vulnerability does not grant any privileges beyond what is already authorized.

In sandboxed or multi-tenant deployments where safe mode is active, the impact is significant. It represents a complete sandbox escape, elevating a constrained backend administrator to an unconstrained system user capable of executing arbitrary operating system commands. This breaks the tenant isolation guarantees of the application.

The CVSS v3.1 base score is calculated as 3.3 (Low Severity) with the vector CVSS:3.1/AV:N/AC:H/PR:H/UI:N/S:U/C:L/I:L/A:N. The low severity score reflects the high attack complexity, the requirement for administrative privileges, and the narrow scope of typical safe-mode configurations.

Technical Appendix

CVSS Score
3.3/ 10
CVSS:3.1/AV:N/AC:H/PR:H/UI:N/S:U/C:L/I:L/A:N

Affected Systems

October CMS 3.x installations running prior to version 3.7.17October CMS 4.x installations running prior to version 4.2.23

Affected Versions Detail

Product
Affected Versions
Fixed Version
October CMS
October CMS
< 3.7.173.7.17
October CMS
October CMS
>= 4.0.0, < 4.2.234.2.23
AttributeDetail
CWE IDCWE-502: Deserialization of Untrusted Data
Attack VectorNetwork (AV:N)
CVSS v3.1 Score3.3
Exploit Statusnone
KEV StatusNot Listed
ImpactSandbox Escape / Remote Code Execution

MITRE ATT&CK Mapping

T1190Exploit Public-Facing Application
Initial Access
T1059Command and Scripting Interpreter
Execution
CWE-502
Deserialization of Untrusted Data

The application deserializes untrusted data without sufficiently verifying that the resulting data will be valid, or without restricting the types of objects that can be created.

References & Sources

  • [1]October CMS GitHub Security Advisory
  • [2]NVD Entry for CVE-2026-49400
  • [3]CVE.org Authority Record

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•about 1 hour ago•CVE-2026-46696
3.3

CVE-2026-46696: Safe Mode Sandbox Bypass in October CMS via Session Store and Forwarded Builder Calls

CVE-2026-46696 identifies a critical sandbox bypass vulnerability in the October CMS platform that affects the Twig template security policy when safe mode is enabled. An authenticated backend user with permissions to modify CMS markup templates can chain unrestricted session store method access with Eloquent database query forwarding omissions. This chain allows the attacker to execute arbitrary raw SQL queries to read system secrets and subsequently write those secrets directly to the active session payload, achieving unauthorized administrative privilege escalation.

Alon Barad
Alon Barad
2 views•8 min read
•about 3 hours ago•CVE-2026-56668
8.1

CVE-2026-56668: Privilege Escalation and Cross-Client Audience Bypass in ZITADEL OAuth2 Token Exchange

A security vulnerability in ZITADEL's backend implementation of the OAuth2 Token Exchange endpoint allows authenticated clients to perform scope escalation and cross-client audience bypass. Prior to version 4.15.3, the Token Exchange flow lacked crucial validation logic, enabling low-privilege tokens to be exchanged for high-privilege tokens or tokens valid within other client applications, violating the OAuth2 delegation model.

Alon Barad
Alon Barad
7 views•7 min read
•about 4 hours ago•CVE-2026-76081
5.5

CVE-2026-76081: Improper Role Revocation in ZITADEL Dynamic Project Grants

CVE-2026-76081 is a logical vulnerability in ZITADEL's role cascading logic where updating a Project Grant to drop multiple adjacent roles simultaneously fails to clean up associated User Grants due to an in-place slice mutation error in Go.

Amit Schendel
Amit Schendel
8 views•6 min read
•about 5 hours ago•GHSA-2XMM-M4WV-3FJH
3.9

GHSA-2XMM-M4WV-3FJH: Incomplete Scheme Validation in October CMS Image Resizer

This report provides a technical analysis of GHSA-2XMM-M4WV-3FJH, an incomplete scheme validation vulnerability in the image resizing utility of October CMS. By exploiting this flaw, authenticated or privileged users can pass dangerous URI schemes to trigger deserialization of untrusted metadata.

Alon Barad
Alon Barad
4 views•5 min read
•about 7 hours ago•CVE-2026-59178
9.8

CVE-2026-59178: Authentication Bypass in ESPHome Device Builder Dashboard

An authentication bypass vulnerability in ESPHome Device Builder Dashboard allows unauthenticated remote attackers to gain administrative access. The flaw is caused by a backward compatibility break during an environment variable rename that silently disables dashboard authentication upon upgrade.

Alon Barad
Alon Barad
5 views•6 min read
•about 10 hours ago•CVE-2026-61534
9.1

CVE-2026-61534: Prototype Pollution in confetti yayson JSON:API Deserialization Engine

A critical prototype pollution vulnerability was discovered in the confetti yayson library prior to version 4.3.0. The library deserializes JSON:API structures into internal cache dictionaries mapped with standard JavaScript objects. An attacker can control the cache keys by supplying '__proto__' in properties like type or id, modifying the prototype of all JavaScript objects process-wide.

Amit Schendel
Amit Schendel
4 views•7 min read