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



GHSA-MPMW-F6H6-3G26

GHSA-mpmw-f6h6-3g26: Insecure Direct Object Reference in Winter CMS My Account Controller

Amit Schendel
Amit Schendel
Senior Security Researcher

Aug 21, 2026·5 min read·3 visits

Executive Summary (TL;DR)

In Winter CMS 1.2.13, low-privilege backend users can access other users' full profile details, including emails, usernames, and administrative roles, due to an unscoped FormController query combined with unrouted CRUD endpoints in the My Account controller.

An Insecure Direct Object Reference (IDOR) vulnerability was identified in Winter CMS version 1.2.13. The vulnerability exists within the newly introduced Backend\Controllers\MyAccount controller, which utilizes the FormController behavior without appropriate model query scoping or routing controls. This allows authenticated, low-privilege backend users to retrieve sensitive personal and administrative data of other backend accounts by enumerating record identifiers via standard CRUD routes.

Vulnerability Overview

In version 1.2.13 of Winter CMS, developers introduced a dedicated backend controller Backend\Controllers\MyAccount inside the winter/wn-backend-module package. This addition aimed to isolate profile management functionalities for backend users, addressing a previous privilege escalation risk (GHSA-j5jq-cr68-v2xx) in the core Users controller.

To ensure all backend users could adjust their own account settings without needing high-level administrative permissions, the controller set its $requiredPermissions property to an empty array. This configuration opened the controller to any authenticated session on the backend.

However, because the controller implemented the platform's standard FormController behavior, it implicitly inherited routing capabilities for multiple CRUD actions. This inheritance exposed a significant attack surface to low-privilege backend accounts.

Root Cause Analysis

The core vulnerability lies in the interaction between the MyAccount controller and the FormController behavior. This behavior dynamically registers endpoints such as /create, /update/{id}, and /preview/{id} to facilitate model operations.

Because these routes take an identifier variable straight from the request URI, they feed the parameter directly into the model lookup logic. In the default configuration, the underlying FormController relies on the formFindModelObject() method, which performs a lookup against the unmodified database query of the associated model, Backend\Models\User.

No scoping mechanism was implemented in the initial release of MyAccount to limit query execution to the active user's session identifier. Consequently, any low-privilege authenticated user could execute direct object queries against any arbitrary database record key simply by incrementing the identifier in the URI.

Code Analysis

To fully understand the flaw, we must analyze the code structure before and after the remediation applied in version 1.2.14.

In the vulnerable implementation of MyAccount.php, the controller declared the FormController behavior but lacked any controls to suppress actions or scope queries:

class MyAccount extends Controller
{
    public $implement = [
        \Backend\Behaviors\FormController::class,
    ];
 
    protected $requiredPermissions = [];
}

The patch introduced in commit cdbc8f5a23db27f72ccec658a8e5769e6d9f6dcb establishes a defense-in-depth architecture. It implements a routing-level restriction and a query-level security policy:

// modules/backend/controllers/MyAccount.php
class MyAccount extends Controller
{
    public $implement = [
        \Backend\Behaviors\FormController::class,
    ];
 
    // Guard the default CRUD actions to prevent routing exposure
    protected $guarded = ['create', 'update', 'preview'];
 
    protected $requiredPermissions = [];
 
    // Restrict all FormController query operations to the active session key
    public function formExtendQuery(Builder $query): void
    {
        $query->whereKey($this->user->getKey());
    }
}

By adding the $guarded array, the system instructs the controller's dispatcher to decline external requests targeting these actions. Additionally, overriding formExtendQuery guarantees that even if a routing bypass occurs, the database query restricts output to the current active user's primary key.

Exploitation Methodology

Exploiting this vulnerability requires an attacker to possess valid credentials for any backend role, regardless of its permission level. Upon authenticating and obtaining a valid session cookie, the attacker can leverage standard browser tools or HTTP clients to send targeted requests.

Because the underlying vulnerability belongs to the Insecure Direct Object Reference (IDOR) class, exploitation consists of sequentially scanning the ID parameter in the URL. A typical attack lifecycle is illustrated below:

The following HTTP transaction demonstrates how an attacker retrieves private profile details belonging to the administrator account (ID 1) while authenticated as a low-privilege user:

GET /backend/backend/myaccount/preview/1 HTTP/1.1
Host: target-wintercms.local
Cookie: winter_session=eyJpdiI6Ik...
Connection: close

The response contains sensitive data fields rendered within the administration form structure:

HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
 
<input type='text' name='User[login]' value='admin_root' readonly />
<input type='email' name='User[email]' value='security_admin@company.corp' readonly />
<input type='text' name='User[first_name]' value='Super' readonly />
<input type='text' name='User[last_name]' value='Administrator' readonly />

Security Regression Testing

A notable aspect of the patch for GHSA-mpmw-f6h6-3g26 is the inclusion of dedicated integration tests. The maintainers added MyAccountSecurityTest.php to verify that routing restrictions and model lookups function correctly under adversarial conditions.

The test suite validates that record-scoped actions are strictly non-routable via the controller's action mechanism:

public function testRecordScopedActionsAreNotRoutable(): void
{
    $controller = new MyAccount;
    foreach (['create', 'update', 'preview'] as $action) {
        $this->assertTrue($controller->methodExists($action));
        $this->assertFalse($controller->actionExists($action));
    }
}

Additionally, the test suite verifies that attempts to request another user's record using the internal form-finding routines will fail and throw an ApplicationException:

public function testTheFormLookupIsPinnedToTheCurrentUser(): void
{
    $controller = new MyAccount;
    $this->assertEquals(
        $this->mallory->getKey(),
        $controller->formFindModelObject($this->mallory->getKey())->getKey()
    );
    $this->expectException(ApplicationException::class);
    $controller->formFindModelObject($this->alice->getKey());
}

Impact Assessment

The security impact of this vulnerability is classified as Medium, receiving a CVSS v3.1 score of 4.3. The primary compromise occurs at the confidentiality level, as unauthorized backend users can harvest sensitive configuration and contact details belonging to administrative accounts.

The exposed data includes login names, email addresses, assigned security roles, group memberships, and superuser flags. In complex enterprise deployments, exposing these fields assists attackers in conducting targeted social engineering, credential stuffing, or spear-phishing campaigns against administrators.

Importantly, integrity and availability remain unaffected. While the default AJAX write-handlers like update_onSave were technically reachable, pre-existing model-level authorization guards added in version 1.2.13 successfully blocked cross-user database writes, preventing attackers from altering administrative records.

Technical Appendix

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

Affected Systems

Winter CMS backend module (winter/wn-backend-module)

Affected Versions Detail

Product
Affected Versions
Fixed Version
winter/wn-backend-module
Winter CMS
== 1.2.131.2.14
AttributeDetail
CWE IDCWE-639
Attack VectorNetwork (AV:N)
Privileges RequiredLow (PR:L)
Exploit StatusProof of Concept Available
CISA KEV StatusNot Listed
Vulnerability ClassInsecure Direct Object Reference

MITRE ATT&CK Mapping

T1592Gather Victim Host Information
Reconnaissance
T1078Valid Accounts
Initial Access
CWE-639
Authorization Bypass Through User-Controlled Key

The system fails to adequately verify if an authenticated user is authorized to access a requested backend record key, allowing the retrieval of arbitrary user model instances.

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•GHSA-7MPF-4465-7FC2
2.0

GHSA-7mpf-4465-7fc2: Stored Cross-Site Scripting in Winter CMS Backend List Widget

A Stored Cross-Site Scripting (XSS) vulnerability exists in the Backend List widget of Winter CMS (winter/wn-backend-module). When a list column is configured with the 'image' type and displays attacker-controlled input, the lack of sanitization in the image URL allows injection of arbitrary HTML attributes, potentially executing malicious scripts in the session of administrators viewing the list.

Amit Schendel
Amit Schendel
2 views•5 min read
•about 3 hours ago•GHSA-FM29-4MQ3-PHG6
8.1

GHSA-FM29-4MQ3-PHG6: Missing Authorization in Winter CMS ImportExportController Behavior

Winter CMS contains an authorization bypass vulnerability within its ImportExportController behavior. Due to a design flaw in the request lifecycle processing, permissions configured for data import and export operations are not validated during AJAX-based requests, allowing authenticated users with limited privileges to perform unauthorized data exfiltration or database manipulation.

Alon Barad
Alon Barad
4 views•5 min read
•about 4 hours ago•GHSA-5CWR-5JXG-PCF6
8.4

GHSA-5CWR-5JXG-PCF6: Stored Cross-Site Scripting via Improper Cache Sanitization in Winter CMS Custom Styles

Winter CMS versions prior to 1.2.14 are vulnerable to Stored Cross-Site Scripting (XSS) within the administrative backend interface. The flaw resides in the custom styles rendering pipeline for Brand Settings and Editor Settings. An attacker with privileges to modify backend branding or editor configurations can inject arbitrary JavaScript, which is written to the cache without sanitization. Subsequent page requests that result in a cache hit completely bypass output sanitization filters, leading to JavaScript execution in the sessions of other administrative users.

Amit Schendel
Amit Schendel
5 views•6 min read
•about 5 hours ago•GHSA-P2CH-C2C3-4XM5
8.8

GHSA-P2CH-C2C3-4XM5: Cross-Site Request Forgery in Winter CMS AJAX Routing

Winter CMS contains a routing bypass vulnerability that allows Cross-Site Request Forgery (CSRF) attacks to trigger administrative AJAX handlers. Due to case-insensitivity in PHP's method resolution and an insufficiently strict check in the backend controller system, an attacker can invoke these handler methods through lowercase HTTP GET requests, bypassing default CSRF token validation.

Amit Schendel
Amit Schendel
4 views•4 min read
•about 6 hours ago•GHSA-HQ84-X37P-J6Q5
6.1

GHSA-HQ84-X37P-J6Q5: Reflected Cross-Site Scripting in Winter CMS Backend Table Widget

A reflected Cross-Site Scripting (XSS) vulnerability exists in the backend Table widget of Winter CMS. The vulnerability is located within the search input template partial, where the application retrieves raw user inputs from the query parameters and renders them directly inside a raw-text script container without sanitization. An attacker can exploit this behavior by passing a crafted tag containing raw-text terminators, leading to code execution in the context of the victim's session.

Amit Schendel
Amit Schendel
3 views•5 min read
•about 7 hours ago•GHSA-92HV-J533-69WC
3.7

GHSA-92HV-J533-69WC: Information Disclosure via ETag Conditional Matching in Wagtail CMS

An information disclosure vulnerability in the document serving subsystem of Wagtail CMS allows unauthorized users to verify if private documents match guessed SHA-1 hashes due to improper order of authentication checks.

Amit Schendel
Amit Schendel
4 views•7 min read