dorfteich/docs/vs-nfd/90-restrisiken.md
Claude Fable 5 13f0311d8e
Some checks failed
CI / Lint, typecheck, test (pull_request) Successful in 6m55s
CI / Build container images (pull_request) Successful in 4m43s
CI / Auth e2e pack (pull_request) Successful in 9m13s
CI / Import/export fidelity gate (pull_request) Successful in 1m4s
CD / Deploy to Test (push) Blocked by required conditions
CD / Smoke tests against Test (push) Blocked by required conditions
CD / Promote to Int (push) Blocked by required conditions
CI / Auth e2e pack (push) Blocked by required conditions
CI / Import/export fidelity gate (push) Blocked by required conditions
CI / Build container images (push) Blocked by required conditions
CI / Lint, typecheck, test (push) Has been cancelled
CD / Build and push images (push) Has been cancelled
#216: hard AUTH_LOCAL_ENABLED switch over every local credential flow
The deploy-level realization of auth.local.enabled (ADR 0021): FALSE
answers 404 on every local credential flow — login, signup, e-mail
verification, resend, password forgot/reset/change — enforced centrally
in the auth guard via the @LocalCredentialFlow() marker before any
session or CSRF logic runs. Deploy-level on purpose: a compromised Site
Admin cannot reopen the local path, so the runtime-flip residual risk
from ADR 0021 does not materialize (R-02 closed in the risk list).

An enumeration fence fails when an auth route is neither marked nor on
the reviewed allowlist, so a new credential flow cannot ship unswitched.
Stated decisions, each tested: sessions/logout keep working for
externally authenticated users; PAT and feed-token issuance stays
available (API authorization under its own switches, not interactive
sign-in). Bootstrap: complete setup (or SETUP_ADMIN_* pre-seed) before
flipping; the api warns at boot when local auth is off with neither OIDC
nor proxy auth configured. GET /auth/methods reports local:false and the
login page hides the local form and credential links.

Hardening guide: the planned auth.local.enabled row moves from 1.3 into
the live deploy table with the bootstrap ordering, and the verification
checklist gains the login-404 probe.

Refs #216.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AUtYMxwTCMHG9mVHnwbFg8
2026-07-31 12:58:07 +02:00

155 lines
7.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Restrisikoliste (VS-NfD, Issue #231)
Zweck: benennen, was **bewusst** offen bleibt. Ein Prüfer, der eine
Lücke hier bereits verzeichnet findet, kann ihr zustimmen; eine
unverzeichnete Lücke diskreditiert die gesamte Einreichung. Jeder
Eintrag nennt das Risiko, warum es akzeptiert ist, die kompensierende
Kontrolle und wer entschieden hat.
**Pflegeregel (verbindlich):** Schließt ein Issue mit einem wissentlich
offenen Rest, wird diese Liste **im selben PR** ergänzt. Die formale
Billigung der Einträge durch den jeweiligen Betreiber ist Teil seiner
Risikoübernahme (Abgrenzungserklärung §8) — Bewertung/Scoring ist
bewusst nicht Teil dieser Liste.
Entscheidungsvermerk: „Projektleitung" = Stefan Waidele;
Entscheidungen sind über die genannten PRs/Issues/ADRs im Repository
nachvollziehbar.
---
## R-01 Attachment-Inhalt trägt keine interne Kennzeichnung
- **Risiko:** Eine heruntergeladene, umbenannte Datei (bzw. eine ohne
Begleitdatei weitergegebene) ist ein eingestuftes Binärobjekt ohne
sichtbare Kennzeichnung.
- **Warum akzeptiert:** Kennzeichnung **in** beliebige Binärformate zu
schreiben hieße, fremde Formate umzuschreiben — ausgeschlossen durch
ADR 0019/0022 (keine Übernahme von Grundfunktions-/Formatgarantien).
- **Kompensation:** Download-Präfix `VS-NfD_` + Begleitdatei/Manifest
im ZIP (#212); alle internen Darstellungen und alle übrigen
Exportkanäle kennzeichnen selbst (#206#211); Upload-Warnung bzw.
serverseitiger Block (#213); organisatorische VS-Handhabung beim
Empfänger.
- **Entscheidung:** Projektleitung, PR #271 / Issue #212, 31.07.2026.
## R-02 Lokale Passwort-Authentifizierung noch nicht abschaltbar — ERLEDIGT (#216, 31.07.2026)
- **Status: geschlossen.** Der harte Schalter existiert als Deploy-Variable
`AUTH_LOCAL_ENABLED=false` (#214#216, ADR 0021): jeder lokale
Credential-Flow (Login, Signup, Verifikation, Passwort
vergessen/zurücksetzen/ändern) antwortet 404; Anmeldung läuft über
OIDC (#214) bzw. Perimeter-Auth (#215). Die im Risiko offene Frage
„Laufzeit oder Deploy-Ebene" ist zugunsten der Deploy-Ebene
entschieden — ein kompromittierter Site-Admin kann den lokalen Pfad
nicht wieder öffnen; damit entsteht KEIN Laufzeit-Restrisiko.
Verbleibender Hinweis (dokumentiert, ADR 0021): bestehende
Argon2id-Passwort-Hashes bleiben nach dem Umschalten in der Datenbank
stehen; ihre Löschung ist bewusst nicht Teil von #216.
- **Entscheidung:** Projektleitung, Issue #216, 31.07.2026 (ursprüngliche
Aufnahme: Maßnahmenplan Rev. 2, 30.07.2026).
## R-03 Plugin-Hash-Pinning verschoben
- **Risiko:** Installierte Plugin-Pakete sind nicht gegen einen
festgeschriebenen Hash verankert (#232); ein manipuliertes Paket
gleichen Namens wäre beim Neuinstallieren nicht erkennbar.
- **Warum akzeptiert:** Die Referenzkonfiguration betreibt Plugins
**gar nicht** (`plugins.enabled=false`, #200) — der Kill-Switch deckt
den VS-NfD-Betriebsmodus vollständig; Pinning lohnt erst, wenn ein
Betreiber Plugins tatsächlich freigibt.
- **Kompensation:** Kill-Switch (alle Plugin-Flächen 404, Dropzone
quarantänisiert); Sandbox mit Capability-Modell + CI-Escape-
Regressionstest (ADR 0008/0025); Install nur durch Site-Admin.
- **Entscheidung:** Projektleitung, ADR 0025 / Issue #232, 30.07.2026.
## R-04 Git-Historie: einmalige Secret-Prüfung mit begrenztem Muster
- **Risiko:** Die einmalige Prüfung der gesamten Repository-Historie
(#198, 30.07.2026) fand **keine** getrackten `.env`-Dateien und
**keine** Treffer der Muster Private-Key-Block / AKIA / ghp\_ /
glpat- / xox[baprs]-. Unstrukturierte Passwörter als schlichte
Strings würde ein generisches Muster jedoch nicht finden.
- **Warum akzeptiert:** Ein Negativbeweis über beliebige Strings ist
nicht führbar; das strukturierte Muster deckt die realistischen
Token-Formate.
- **Kompensation:** CI-Zaun „No tracked .env files or secret material"
auf jedem PR (#198) hält beide Invarianten ab jetzt; Review-Disziplin
- Regel „Passwörter nie als CLI-Argument/Commit".
- **Entscheidung:** Projektleitung, Issue #198, 30.07.2026 (Protokoll
als Kommentar auf #231).
## R-05 Digest-/Benachrichtigungs-Mails tragen Seitentitel (I-23)
- **Risiko:** Zugestellte Mails enthalten Titel (Inhalts-Metadaten)
eingestufter Seiten und liegen beim Empfänger außerhalb der Instanz.
- **Warum akzeptiert:** Es gab bis M26 kein Einstufungs-Metadatum für
eine Unterdrückung; die titelbasierte Unterdrückung wird in M32
(#243#246, `VS_NFD_MODE`) revisitiert.
- **Kompensation:** Kopie zeitlich begrenzt
(`mail.outboxRetentionDays`, #234); Referenzkonfiguration lässt SMTP
unkonfiguriert — dann verlässt kein Titel die Instanz per Mail
(`50-haertungsleitfaden.md` §1.2).
- **Entscheidung:** Projektleitung, PR #255 / Issue #234, 30.07.2026;
Revisit-Marker M32.
## R-06 `page_links.target_slug` überlebt den Ziel-Purge (I-24)
- **Risiko:** Nach dem endgültigen Löschen einer Seite bleibt ihr Slug
(≈ Titel) als Linkziel-Text in den Zeilen verweisender Seiten.
- **Warum akzeptiert:** Der Slug steht ohnehin sichtbar im Inhalt der
verweisenden Seite (deren Autor das Ziel lesen durfte); die Zeile zu
löschen entfernte nichts Sichtbares, bräche aber die gewollte
Phantom-Link-Reauflösung.
- **Kompensation:** Zugriff auf die verweisende Seite bleibt
permissions-geprüft; vollständige Begründung in
`docs/architecture/operations.md` (Purge-Abschnitt).
- **Entscheidung:** Projektleitung, PR #256 / Issue #235, 30.07.2026.
## R-07 Offline-Kopie im Browser (IndexedDB, I-25)
- **Risiko:** Der Editor hält zuletzt geöffnete Seiten als
Yjs-Offline-Kopie in der IndexedDB des Endgeräts
(`apps/web/src/editor/use-collab-provider.ts`); sie übersteht
Browser-Crashes und existiert für unsynchronisierte Offline-Edits.
- **Warum akzeptiert:** Die Kopie ist Voraussetzung für
verlustfreies kollaboratives Arbeiten (CRDT) und liegt in der
Endgeräte-Zone, deren Schutz (Festplattenverschlüsselung,
Gerätekontrolle) nach Abgrenzungserklärung ohnehin der Plattform-
bzw. Organisationsverantwortung zufällt.
- **Kompensation:** VS-Endgeräte-Vorgaben des Betreibers
(Datenträgerverschlüsselung, kontrollierte Geräte); kurze Sessions
(Referenzkonfiguration) begrenzen den angemeldeten Zeitraum.
- **Entscheidung:** Projektleitung, Ist-Aufnahme I-25
(`10-ist-aufnahme.md`), 29.07.2026.
## R-08 Bewusst nicht geplante Funktionen
- **Risiko/Inhalt:** Externe Suchengine (Suche bleibt in Postgres),
Admin-Freigabe von Selbstregistrierungen, Plugin-Netzwerk-Allowlist —
bewusst unscheduled.
- **Warum akzeptiert:** Kein Bedarf im Zielbetrieb: die
Referenzkonfiguration schließt Selbstregistrierung und Plugins ohnehin
aus; die interne Suche vermeidet einen weiteren Dienst mit
Inhaltskopie (die Kopienliste bliebe sonst nicht klein).
- **Kompensation:** entfällt (kein zusätzliches Risiko gegenüber dem
Status quo; Wiedervorlage bei realem Bedarf).
- **Entscheidung:** Projektleitung, Projektplanung (dokumentiert im
Workspace-Handoff), Stand 07/2026.
## R-09 Site-Admin liest jeden Inhalt (Rollen-Bypass)
- **Risiko:** Die App-Rolle Site-Admin umgeht die Permission-Resolution
vollständig (permissions.md) — App-seitig gibt es keine absolute
Trennung zwischen Plattform-Betrieb und Inhalts-Kenntnisnahme.
- **Warum akzeptiert:** Ein Admin ohne Durchgriff könnte zentrale
Pflichten (Purge, Quoten, Störungsanalyse) nicht erfüllen; eine
echte Trennung wäre eine neue Grundfunktion (ADR 0019).
- **Kompensation:** organisatorisch (Vergabe der Rolle nach
Need-to-know, Vier-Augen-Prinzip); Lesetrail für eingestufte Inhalte
macht Zugriffe nachvollziehbar (M29, #222#225 — bis dahin trägt der
bestehende Audit-Trail nur Verwaltungsereignisse); Betriebshandbuch
§6 benennt die Grenze ausdrücklich.
- **Entscheidung:** Projektleitung, permissions.md-Design (Issue #51)
bzw. Aufnahme hier, 31.07.2026.