| Package | Affected versions | Patched versions |
|---|---|---|
| miraheze/ts-portal | < 34 | 34 |
| tsportal | < 34 | 34 |
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:
Running one of these products? Scan your site to see whether it exposes a vulnerable version.
Scan my site freeUser::findOrCreate() with a non-mutating lookup (User::firstWhere(...))