CVE-2026-33541: Miraheze/ts portal Denial of Service Vulnerability

MODERATE
Advisory Identifier: GHSA-f346-8rp3-4h9h
CVSS 6.5
CWE-400 CWE-770
Published
Advisory Summary

CVE-2026-33541 is a MODERATE (CVSS 6.5) denial of service vulnerability (CWE-400: Uncontrolled Resource Consumption) affecting Miraheze/ts portal libraries in the Packagist ecosystem. The issue involves tsportal's uncontrolled user creation via validation side effects leads to potential denial of service. Remediation is available by upgrading affected packages to version 34.

CVE-2026-33541 at a Glance

CVE Identifier CVE-2026-33541
GHSA Identifier GHSA-f346-8rp3-4h9h
Severity MODERATE
CVSS v3.1 Base Score 6.5
CWE Classification CWE-400: Uncontrolled Resource Consumption
Affected Product Miraheze/ts portal
Package Ecosystem Packagist
Published Date
Last Updated

Security Impact

CVSS: 6.5

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:N/I:N/A:H).

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 None (C:N)
Integrity None (I:N)
Availability High (A:H)

How to Fix CVE-2026-33541

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

miraheze/ts-portal fixed: 34
Upgrade miraheze/ts-portal to 34
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 miraheze/ts-portal

How to Check if You Are Affected

To determine whether your application is affected by CVE-2026-33541, inspect your project dependencies for Miraheze/ts portal:

inspect dependencies for miraheze/ts-portal

Analyze the terminal output to locate any version of Miraheze/ts portal in your dependency tree. If any resolved version matches the vulnerable ranges listed in the table below (for example, versions earlier than 34), 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-400: Uncontrolled Resource Consumption, where the product does not properly control the allocation and maintenance of a limited resource. In Miraheze/ts portal, 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

### Summary A flaw in TSPortal allowed attackers to create arbitrary user records in the database by abusing validation logic. While validation correctly rejected invalid usernames, a side effect within a validation rule caused user records to be created regardless of whether the request succeeded. This could be exploited to cause uncontrolled database growth, leading to a potential denial of service (DoS). ### Details When submitting a Data Processing Agreement (DPA) request in TSPortal, the `DPAAlreadyLive` validation rule previously called `User::findOrCreate()`. This method created a user record if one did not already exist. Although username validation (via `MirahezeUsernameRule`) correctly rejected invalid usernames, the `DPAAlreadyLive` rule was still executed during validation. Because it performed a state-changing operation, it created user records even when the overall validation failed and no DPA was created. As a result: - Validation correctly rejected invalid input - However, user records were still inserted into the database as a side effect These records were created: - Without a successful DPA request - Without audit logging tied to a completed action - Without visibility into their origin ### Impact An attacker could exploit this behavior by automating requests with invalid usernames, resulting in: - Mass creation of arbitrary user records - Unbounded database growth - Increased storage and indexing overhead - Potential degradation of application performance At scale, this could lead to a denial of service condition due to resource exhaustion. ### Proof of Concept 1. Submit a DPA request using an invalid username 2. Ensure the request fails validation due to `MirahezeUsernameRule` 3. Observe that a corresponding user record is still created in the database This behavior was confirmed prior to remediation. ### Root Cause The issue stemmed from: - Performing state-changing operations (`findOrCreate`) inside validation logic - Validation rules executing regardless of overall validation success - Lack of separation between validation and persistence layers ### Mitigation The issue has been fixed by removing database write operations from validation logic. Specifically: - Replaced `User::findOrCreate()` with a non-mutating lookup (`User::firstWhere(...)`) - Ensured validation rules only perform read operations - Prevented user creation unless all validation passes

CVE-2026-33541 Affected Miraheze/ts portal Versions

1 component(s)
Fixed Versions:
34
Product / Package Ecosystem Affected Versions Fixed Version
miraheze/ts-portal
Packagist
< 34
34

References

Frequently Asked Questions

What is CVE-2026-33541?
CVE-2026-33541 is a security vulnerability in Miraheze/ts portal involving TSPortal's Uncontrolled User Creation via Validation Side Effects Leads to Potential Denial of Service under CWE-400: Uncontrolled Resource Consumption.
Which Miraheze/ts portal versions are affected?
Affected versions include releases prior to 34 across affected packages: miraheze/ts-portal.
What version fixes CVE-2026-33541?
Upgrading to 34 (or the latest patched release for your respective branch) resolves the vulnerability.
Is miraheze/ts-portal affected?
Yes, miraheze/ts-portal is affected in releases prior to 34. Upgrade your dependency to 34 or later.
What is the CVSS score of CVE-2026-33541?
CVE-2026-33541 has a CVSS v3.1 base score of 6.5 (MODERATE) with vector string CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H.
What CWE is associated with CVE-2026-33541?
CVE-2026-33541 is classified under CWE-400: Uncontrolled Resource Consumption (The product does not properly control the allocation and maintenance of a limited resource.).
How can I check Packagist dependencies for CVE-2026-33541?
Run the dependency tree command: 'inspect dependencies for miraheze/ts-portal'. 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-f346-8rp3-4h9h",
  "modified" : "2026-03-27T15:42:20Z",
  "published" : "2026-03-27T15:42:20Z",
  "aliases" : [ "CVE-2026-33541" ],
  "summary" : "TSPortal's Uncontrolled User Creation via Validation Side Effects Leads to Potential Denial of Service",
  "details" : "### Summary\nA flaw in TSPortal allowed attackers to create arbitrary user records in the database by abusing validation logic. While validation correctly rejected invalid usernames, a side effect within a validation rule caused user records to be created regardless of whether the request succeeded. This could be exploited to cause uncontrolled database growth, leading to a potential denial of service (DoS).\n\n### Details\nWhen submitting a Data Processing Agreement (DPA) request in TSPortal, the `DPAAlreadyLive` validation rule previously called `User::findOrCreate()`.\n\nThis method created a user record if one did not already exist.\n\nAlthough username validation (via `MirahezeUsernameRule`) correctly rejected invalid usernames, the `DPAAlreadyLive` rule was still executed during validation. Because it performed a state-changing operation, it created user records even when the overall validation failed and no DPA was created.\n\nAs a result:\n- Validation correctly rejected invalid input\n- However, user records were still inserted into the database as a side effect\n\nThese records were created:\n- Without a successful DPA request\n- Without audit logging tied to a completed action\n- Without visibility into their origin\n\n### Impact\nAn attacker could exploit this behavior by automating requests with invalid usernames, resulting in:\n\n- Mass creation of arbitrary user records\n- Unbounded database growth\n- Increased storage and indexing overhead\n- Potential degradation of application performance\n\nAt scale, this could lead to a denial of service condition due to resource exhaustion.\n\n### Proof of Concept\n1. Submit a DPA request using an invalid username\n2. Ensure the request fails validation due to `MirahezeUsernameRule`\n3. Observe that a corresponding user record is still created in the database\n\nThis behavior was confirmed prior to remediation.\n\n### Root Cause\nThe issue stemmed from:\n- Performing state-changing operations (`findOrCreate`) inside validation logic\n- Validation rules executing regardless of overall validation success\n- Lack of separation between validation and persistence layers\n\n### Mitigation\nThe issue has been fixed by removing database write operations from validation logic.\n\nSpecifically:\n- Replaced `User::findOrCreate()` with a non-mutating lookup (`User::firstWhere(...)`)\n- Ensured validation rules only perform read operations\n- Prevented user creation unless all validation passes",
  "severity" : [ {
    "type" : "CVSS_V3",
    "score" : "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H"
  } ],
  "affected" : [ {
    "package" : {
      "ecosystem" : "Packagist",
      "name" : "miraheze/ts-portal"
    },
    "ranges" : [ {
      "type" : "ECOSYSTEM",
      "events" : [ {
        "introduced" : "0"
      }, {
        "fixed" : "34"
      } ]
    } ],
    "database_specific" : {
      "last_known_affected_version_range" : "<= 33"
    }
  } ],
  "references" : [ {
    "type" : "WEB",
    "url" : "https://github.com/miraheze/TSPortal/security/advisories/GHSA-f346-8rp3-4h9h"
  }, {
    "type" : "ADVISORY",
    "url" : "https://nvd.nist.gov/vuln/detail/CVE-2026-33541"
  }, {
    "type" : "PACKAGE",
    "url" : "https://github.com/miraheze/TSPortal"
  }, {
    "type" : "WEB",
    "url" : "https://issue-tracker.miraheze.org/T15115"
  } ],
  "database_specific" : {
    "cwe_ids" : [ "CWE-400", "CWE-770" ],
    "severity" : "MODERATE",
    "github_reviewed" : true,
    "github_reviewed_at" : "2026-03-27T15:42:20Z",
    "nvd_published_at" : "2026-03-26T21:17:05Z"
  }
}