Files
ProxLedger/docs/issues/024-owasp-haertung.md
T
florian.wildeandClaude Opus 5 7775b6211f 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>
2026-09-18 23:45:35 +02:00

1.9 KiB
Raw Blame History

#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.md mit der Zuordnung zu den OWASP Top 10
  • 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.