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).
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:
These records were created:
An attacker could exploit this behavior by automating requests with invalid usernames, resulting in:
At scale, this could lead to a denial of service condition due to resource exhaustion.
MirahezeUsernameRuleThis behavior was confirmed prior to remediation.
The issue stemmed from:
findOrCreate) inside validation logicThe issue has been fixed by removing database write operations from validation logic.
Specifically:
User::findOrCreate() with a non-mutating lookup (User::firstWhere(...)){
"cwe_ids": [
"CWE-400",
"CWE-770"
],
"github_reviewed": true,
"github_reviewed_at": "2026-03-27T15:42:20Z",
"nvd_published_at": "2026-03-26T21:17:05Z",
"severity": "MODERATE"
}