feat(security): Haertung nach OWASP Top 10 (#024)
Drei echte Luecken gefunden und geschlossen: 1. Die 27 Server Actions verliessen sich allein auf proxy.ts. Jede prueft die Sitzung jetzt selbst und schlaegt gegen die Datenbank nach, ob das Konto noch gilt - damit lassen sich Sitzungen ueberhaupt erst widerrufen. 2. Der Anmelde-Endpunkt prueft die Herkunft des Formulars; vorher war Login-CSRF moeglich. 3. Content-Security-Policy mit Nonce je Anfrage und strict-dynamic. Dazu: npm audit ist ohne Befund (mysql2 und deepmerge-ts per overrides angehoben statt Prisma zurueckzustufen), eine Benutzerverwaltung fuer die Kommandozeile und docs/sicherheit.md mit allem, was bewusst offen bleibt - keine Rollen, keine Zwei-Faktor-Anmeldung. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,34 @@
|
||||
# #024 Härtung nach OWASP
|
||||
**Status:** erledigt
|
||||
**Meilenstein:** v0.15.0
|
||||
**Labels:** security, backend
|
||||
**Geschätzt:** 4 h **Tatsächlich:** 0 h 45 min
|
||||
|
||||
## Ziel
|
||||
Vor der Freigabe als fertiges Produkt eine Durchsicht gegen die OWASP Top 10 – und die gefundenen
|
||||
Lücken schließen, statt sie zu vermerken.
|
||||
|
||||
## Aufgaben
|
||||
- [x] Zugriffskontrolle: jede Server Action prüft die Sitzung selbst, nicht nur der Proxy
|
||||
- [x] Sitzungen widerrufbar machen (gesperrtes Konto, neues Passwort)
|
||||
- [x] Login-CSRF: Herkunft der Anmeldung prüfen
|
||||
- [x] Content-Security-Policy mit Nonce je Anfrage
|
||||
- [x] Abhängigkeiten ohne bekannte Schwachstellen (`npm audit`)
|
||||
- [x] Benutzerverwaltung auf der Kommandozeile (sperren, entsperren, Passwort)
|
||||
- [x] `docs/sicherheit.md` mit der Zuordnung zu den OWASP Top 10
|
||||
- [x] Tests für Sitzungsurteil und Herkunftsprüfung
|
||||
|
||||
## Gefunden und behoben
|
||||
1. **Server Actions waren nur durch `proxy.ts` geschützt.** Keine einzige Aktion prüfte selbst. Der
|
||||
Proxy greift zwar auch bei POST, aber eine einzige Schicht ist zu wenig für 27 schreibende Endpunkte.
|
||||
2. **Login-CSRF möglich:** Der Anmelde-Endpunkt ist ein gewöhnliches Formular und prüfte die Herkunft
|
||||
nicht. Eine fremde Seite hätte jemanden in ein untergeschobenes Konto anmelden können.
|
||||
3. **Keine CSP.** Jetzt mit Nonce und `strict-dynamic`.
|
||||
4. **Sitzungen ließen sich nicht beenden.** Ein gesperrtes Konto arbeitete bis zu zwölf Stunden weiter.
|
||||
5. **`npm audit`: 4 hohe Meldungen** in `mysql2` und `deepmerge-ts` – beides Beiwerk von Prisma. Über
|
||||
`overrides` angehoben statt Prisma zurückzustufen; danach keine Meldung mehr.
|
||||
|
||||
## Bewusst nicht umgesetzt
|
||||
- **Rollen:** Wer angemeldet ist, darf alles. Für ein internes Werkzeug vertretbar, in `docs/sicherheit.md` vermerkt.
|
||||
- **Zwei-Faktor-Anmeldung:** Wer sie braucht, nutzt OIDC.
|
||||
- Die Einschränkung der OIDC-Anmeldung (erlaubte Domänen, automatisches Anlegen) kommt mit #025.
|
||||
Reference in New Issue
Block a user