CVE-2026-54256: Winter Authenticated IDOR Vulnerability

MODERATE
Advisory Identifier: GHSA-3277-h8g9-qj5f
CVSS 5.4
CWE-284 CWE-639
Published
Advisory Summary

CVE-2026-54256 is a MODERATE (CVSS 5.4) authenticated idor vulnerability (CWE-284: Improper Access Control) affecting Winter libraries in the Packagist ecosystem. The issue involves authenticated idor in backend fileupload widget allows cross-user access to attachment metadata. Remediation is available by upgrading affected packages to version 1.2.13.

CVE-2026-54256 at a Glance

CVE Identifier CVE-2026-54256
GHSA Identifier GHSA-3277-h8g9-qj5f
Severity MODERATE
CVSS v3.1 Base Score 5.4
CWE Classification CWE-284: Improper Access Control
Affected Product Winter
Package Ecosystem Packagist
Published Date
Last Updated

Security Impact

CVSS: 5.4

The security impact metrics below are parsed directly from the CVSS v3.1 vector string (CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:N).

Attack Vector Network (AV:N)
Attack Complexity Low (AC:L)
Privileges Required Low (PR:L)
User Interaction None (UI:N)
Scope Unchanged (S:U)
Confidentiality Low (C:L)
Integrity Low (I:L)
Availability None (A:N)

How to Fix CVE-2026-54256

To remediate this vulnerability, upgrade all affected Winter dependencies to a patched release. Both direct and transitive dependencies should be checked, as frameworks or security libraries may pull in vulnerable versions transitively.

winter/wn-backend-module fixed: 1.2.13
Upgrade winter/wn-backend-module to 1.2.13
Verify Direct and Transitive Dependencies

Run the following command in your project directory to verify that all resolved dependencies use the patched release:

inspect dependencies for winter/wn-backend-module

How to Check if You Are Affected

To determine whether your application is affected by CVE-2026-54256, inspect your project dependencies for Winter:

inspect dependencies for winter/wn-backend-module

Analyze the terminal output to locate any version of Winter in your dependency tree. If any resolved version matches the vulnerable ranges listed in the table below (for example, versions earlier than 1.2.13), your application is affected.

Note: Verify declared build manifests and deployed runtime container environments.

Technical Details

Vulnerability Mechanism & Technical Analysis

This vulnerability is classified under CWE-284: Improper Access Control, where the product does not restrict or incorrectly restricts access to a resource from an unauthorized actor. In Winter, software state validation or input boundaries are circumvented during processing. Review the official source advisory statement below for specific affected components, classes, and reproduction details.

Source Advisory Statement

### Impact The backend `FileUpload` form widget trusted an attacker-controlled `file_id` POST parameter when resolving the attachment it operates on. The lookup (`FileUpload::getFileRecord()`) resolved the posted id against the global `system_files` table without verifying that the file belonged to the widget's own relation, parent record, or deferred-binding session. Any authenticated backend user who can reach a form containing a `fileupload` field — including the built-in **My Account** avatar field, which requires no specific backend permission — could therefore target a `System\Models\File` record belonging to another user or record and: - modify its `title` and `description` via `onSaveAttachmentConfig`, and - change its `sort_order` via `onSortAttachments` (which passed posted ids straight to `setSortableOrder()`, an unscoped `UPDATE ... WHERE id = ?`). The same unscoped lookup is reached by `onLoadAttachmentConfig`, `onSaveAttachmentConfig`, and `onRemoveAttachment`. Because all attachments share the single `System\Models\File` model and `system_files` table, an attacker was not limited to other users' avatars — any attachment on any model could be referenced by id. Attachment ids are sequential integers and are easily enumerated. The confirmed impact is unauthorized integrity modification of arbitrary attachment metadata and ordering. CSRF tokens are still verified on all POST requests, so an attacker must be authenticated to the backend with a valid session. To exploit this issue an attacker needs a backend account with any level of access. ### Patches The `FileUpload` widget now scopes every `file_id` lookup to the widget's own relation, including any files bound through the current deferred-binding session, so a posted id can no longer reference an unrelated `System\Models\File` record: - `getFileRecord()` resolves the id through `getRelationObject()->withDeferred($this->sessionKey)->find(...)` rather than the global file model. This covers `onLoadAttachmentConfig`, `onSaveAttachmentConfig`, and `onRemoveAttachment`. - `onSortAttachments()` intersects the posted ids with the ids that actually belong to the relation before calling `setSortableOrder()`. This security issue has been fixed as of **v1.2.13** (commit [`9cb0ae5f9d837db141ab111c6a7de8eed9603d25`](https://github.com/wintercms/winter/commit/9cb0ae5f9d837db141ab111c6a7de8eed9603d25)). ### Workarounds There is no supported workaround other than upgrading. If you cannot upgrade immediately, you may apply the fix manually in `modules/backend/formwidgets/FileUpload.php`: 1. In `getFileRecord()`, replace `$this->getRelationModel()->find(post('file_id'))` with `$this->getRelationObject()->withDeferred($this->sessionKey)->find(post('file_id'))`. 2. In `onSortAttachments()`, filter the posted `sortOrder` ids to those returned by `$this->getRelationObject()->withDeferred($this->sessionKey)->pluck($keyName)` before calling `setSortableOrder()`.

CVE-2026-54256 Affected Winter Versions

1 component(s)
Fixed Versions:
1.2.13
Product / Package Ecosystem Affected Versions Fixed Version
winter/wn-backend-module
Packagist
< 1.2.13
1.2.13

References

Frequently Asked Questions

What is CVE-2026-54256?
CVE-2026-54256 is a security vulnerability in Winter involving Authenticated IDOR in backend FileUpload widget allows cross-user access to attachment metadata under CWE-284: Improper Access Control.
Which Winter versions are affected?
Affected versions include releases prior to 1.2.13 across affected packages: winter/wn-backend-module.
What version fixes CVE-2026-54256?
Upgrading to 1.2.13 (or the latest patched release for your respective branch) resolves the vulnerability.
Is winter/wn-backend-module affected?
Yes, winter/wn-backend-module is affected in releases prior to 1.2.13. Upgrade your dependency to 1.2.13 or later.
What is the CVSS score of CVE-2026-54256?
CVE-2026-54256 has a CVSS v3.1 base score of 5.4 (MODERATE) with vector string CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:N.
What CWE is associated with CVE-2026-54256?
CVE-2026-54256 is classified under CWE-284: Improper Access Control (The product does not restrict or incorrectly restricts access to a resource from an unauthorized actor.).
How can I check Packagist dependencies for CVE-2026-54256?
Run the dependency tree command: 'inspect dependencies for winter/wn-backend-module'. This command lists direct and transitive dependencies in your build configuration so you can verify if a vulnerable version is resolved.
Machine-readable OSV JSON OSV v1.5 Schema
Normalized schema output
{
  "schema_version" : "1.4.0",
  "id" : "GHSA-3277-h8g9-qj5f",
  "modified" : "2026-08-20T18:39:56Z",
  "published" : "2026-08-20T18:39:56Z",
  "aliases" : [ "CVE-2026-54256" ],
  "summary" : "Winter: Authenticated IDOR in backend FileUpload widget allows cross-user access to attachment metadata",
  "details" : "### Impact\n\nThe backend `FileUpload` form widget trusted an attacker-controlled `file_id` POST parameter when resolving the attachment it operates on. The lookup (`FileUpload::getFileRecord()`) resolved the posted id against the global `system_files` table without verifying that the file belonged to the widget's own relation, parent record, or deferred-binding session.\n\nAny authenticated backend user who can reach a form containing a `fileupload` field — including the built-in **My Account** avatar field, which requires no specific backend permission — could therefore target a `System\\Models\\File` record belonging to another user or record and:\n\n- modify its `title` and `description` via `onSaveAttachmentConfig`, and\n- change its `sort_order` via `onSortAttachments` (which passed posted ids\n  straight to `setSortableOrder()`, an unscoped `UPDATE ... WHERE id = ?`).\n\nThe same unscoped lookup is reached by `onLoadAttachmentConfig`, `onSaveAttachmentConfig`, and `onRemoveAttachment`. Because all attachments share the single `System\\Models\\File` model and `system_files` table, an attacker was not limited to other users' avatars — any attachment on any model could be referenced by id. Attachment ids are sequential integers and are easily enumerated.\n\nThe confirmed impact is unauthorized integrity modification of arbitrary attachment metadata and ordering.\n\nCSRF tokens are still verified on all POST requests, so an attacker must be authenticated to the backend with a valid session. To exploit this issue an attacker needs a backend account with any level of access.\n\n### Patches\n\nThe `FileUpload` widget now scopes every `file_id` lookup to the widget's own relation, including any files bound through the current deferred-binding session, so a posted id can no longer reference an unrelated `System\\Models\\File` record:\n\n- `getFileRecord()` resolves the id through `getRelationObject()->withDeferred($this->sessionKey)->find(...)` rather than the global file model. This covers `onLoadAttachmentConfig`, `onSaveAttachmentConfig`, and `onRemoveAttachment`.\n- `onSortAttachments()` intersects the posted ids with the ids that actually belong to the relation before calling `setSortableOrder()`.\n\nThis security issue has been fixed as of **v1.2.13** (commit [`9cb0ae5f9d837db141ab111c6a7de8eed9603d25`](https://github.com/wintercms/winter/commit/9cb0ae5f9d837db141ab111c6a7de8eed9603d25)).\n\n### Workarounds\n\nThere is no supported workaround other than upgrading. If you cannot upgrade immediately, you may apply the fix manually in `modules/backend/formwidgets/FileUpload.php`:\n\n1. In `getFileRecord()`, replace `$this->getRelationModel()->find(post('file_id'))` with `$this->getRelationObject()->withDeferred($this->sessionKey)->find(post('file_id'))`.\n2. In `onSortAttachments()`, filter the posted `sortOrder` ids to those returned by `$this->getRelationObject()->withDeferred($this->sessionKey)->pluck($keyName)` before calling `setSortableOrder()`.",
  "severity" : [ {
    "type" : "CVSS_V3",
    "score" : "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:N"
  } ],
  "affected" : [ {
    "package" : {
      "ecosystem" : "Packagist",
      "name" : "winter/wn-backend-module"
    },
    "ranges" : [ {
      "type" : "ECOSYSTEM",
      "events" : [ {
        "introduced" : "0"
      }, {
        "fixed" : "1.2.13"
      } ]
    } ],
    "database_specific" : {
      "last_known_affected_version_range" : "<= 1.2.12"
    }
  } ],
  "references" : [ {
    "type" : "WEB",
    "url" : "https://github.com/wintercms/winter/security/advisories/GHSA-3277-h8g9-qj5f"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/wintercms/winter/security/advisories/GHSA-qq9m-vfv4-pj5w"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/wintercms/winter/commit/9cb0ae5f9d837db141ab111c6a7de8eed9603d25"
  }, {
    "type" : "PACKAGE",
    "url" : "https://github.com/wintercms/winter"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/wintercms/winter/releases/tag/v1.2.13"
  } ],
  "database_specific" : {
    "cwe_ids" : [ "CWE-284", "CWE-639" ],
    "severity" : "MODERATE",
    "github_reviewed" : true,
    "github_reviewed_at" : "2026-08-20T18:39:56Z",
    "nvd_published_at" : null
  }
}