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>
1.9 KiB
1.9 KiB
#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
- Zugriffskontrolle: jede Server Action prüft die Sitzung selbst, nicht nur der Proxy
- Sitzungen widerrufbar machen (gesperrtes Konto, neues Passwort)
- Login-CSRF: Herkunft der Anmeldung prüfen
- Content-Security-Policy mit Nonce je Anfrage
- Abhängigkeiten ohne bekannte Schwachstellen (
npm audit) - Benutzerverwaltung auf der Kommandozeile (sperren, entsperren, Passwort)
docs/sicherheit.mdmit der Zuordnung zu den OWASP Top 10- Tests für Sitzungsurteil und Herkunftsprüfung
Gefunden und behoben
- Server Actions waren nur durch
proxy.tsgeschü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. - 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.
- Keine CSP. Jetzt mit Nonce und
strict-dynamic. - Sitzungen ließen sich nicht beenden. Ein gesperrtes Konto arbeitete bis zu zwölf Stunden weiter.
npm audit: 4 hohe Meldungen inmysql2unddeepmerge-ts– beides Beiwerk von Prisma. Überoverridesangehoben 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.mdvermerkt. - Zwei-Faktor-Anmeldung: Wer sie braucht, nutzt OIDC.
- Die Einschränkung der OIDC-Anmeldung (erlaubte Domänen, automatisches Anlegen) kommt mit #025.