GHSA-653j-g8j7-gh54 - ApostropheCMS: No Attempt Throttling on Authenticated Password-Change Endpoint Enables Unlimited Current-Password Guessing
**Summary**
The self-service password-change endpoint verifies the current password but does not use the login module’s failed-attempt counter, throttle, delay, or lockout mechanism. An attacker with a valid authenticated session can submit repeated guesses for the current password without receiving a lockout or throttle response.
**Exact source path**
packages/apostrophe/modules/@apostrophecms/settings/index.js:621-664
**The password-change route is:**
PATCH /api/v1/@apostrophecms/settings/password
**The route calls the password verifier directly through:**
await self.handleProtectedSubform(req, subform, req.body );
**The password verification path is:**
packages/apostrophe/modules/@apostrophecms/settings/index.js:514-542
**async handlePasswordProtectedSubform(req, subform, payload) {
try {
await self.apos.user.verifyPassword(req.user, payload.passwordCurrent);
} catch (e) {
throw self.apos.error(
'forbidden',
'apostrophe:passwordCurrentError',
{ path: 'passwordCurrent' }
);
}
return subform;
}**
**The verifier itself does not increment the login-attempt cache or enforce a delay:**
packages/apostrophe/modules/@apostrophecms/user/index.js:412-487
**By contrast, the login route explicitly calls checkLoginAttempts and addLoginAttempt in:**
packages/apostrophe/modules/@apostrophecms/login/index.js:831-929
**Local PoC**
The test used a disposable authenticated guest session against:
Request:
```
PATCH /api/v1/@apostrophecms/settings/password HTTP/1.1
Host: 127.0.0.1:3000
Cookie: <redacted-authenticated-session>
Content-Type: application/json
{
"password": "new-temporary-password",
"passwordRepeat": "new-temporary-password",
"passwordCurrent": "definitely-wrong-current-password"
}
```
**Equivalent command:**
```
for i in 1 2 3 4 5; do
time curl -i -sS \
-b /path/to/temporary-session-cookie-jar.txt \
-X PATCH \
'http://127.0.0.1:3000/api/v1/@apostrophecms/settings/password' \
-H 'Content-Type: appl
MEDIUM
Severity & confidence
Source severitymedium
Platform severitymedium
Confidencemedium
Exploitationunknown
CVSS5.9
Affected
Vendorsapostrophe
Productsapostrophe
Reporting sources (1)
GitHub Security Advisories
Timeline & provenance
Published2026-10-20T18:17:50
Last updated2026-10-21T06:41:43
Ingested2026-10-20T18:21:26
FreshnessNEAR-REAL-TIME
Threat typeadvisory
Recommended action
Review the advisory and upgrade affected packages to the first patched version.
Next steps
- Identify affected systems in your environment.
- Apply the vendor patch or mitigation guidance.
- Review logs for indicators described in the advisory.
- Follow the affected vendor/product to track updates.
Confidence explanation
Reported by a single or secondary source; treat as indicative, verify before acting.
Source type: vendor · Original: GitHub Security Advisories