From 7fe3ffd936e27d995598359addd7df9650775432 Mon Sep 17 00:00:00 2001 From: Claude Fable 5 Date: Fri, 31 Jul 2026 10:01:11 +0200 Subject: [PATCH] #231: residual-risk list MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit docs/vs-nfd/90-restrisiken.md: nine entries, each with risk, why it is accepted, compensating control and decider — unmarked attachment content (#212), local auth not yet switchable incl. the open runtime- flippability question (#216), deferred plugin hash pinning (#232), the one-time git-history secret check with its pattern caveat (#198), digest-mail titles (I-23, revisit M32), page_links slug residue (I-24), the IndexedDB endpoint copy (I-25), deliberately unscheduled features, and the Site-Admin read bypass. Binding same-PR maintenance rule stated; referenced from the delimitation statement and consumed by the Grundschutz mapping. Co-Authored-By: Claude Fable 5 (1M context) --- docs/vs-nfd/20-massnahmenplan.md | 2 +- docs/vs-nfd/90-restrisiken.md | 154 +++++++++++++++++++++++++++++++ 2 files changed, 155 insertions(+), 1 deletion(-) create mode 100644 docs/vs-nfd/90-restrisiken.md diff --git a/docs/vs-nfd/20-massnahmenplan.md b/docs/vs-nfd/20-massnahmenplan.md index 3dd34e8..c93d129 100644 --- a/docs/vs-nfd/20-massnahmenplan.md +++ b/docs/vs-nfd/20-massnahmenplan.md @@ -194,7 +194,7 @@ nach sich zieht. (Airgap-Kapitel verweist auf offene #218–#221) - [ ] **Zuarbeit IT-Grundschutz** APP.3.1 und CON.11.1, je Anforderung „Produkt / Betreiber / nicht anwendbar" · 3–4 AT · #230 -- [ ] **Restrisikoliste** mit bewusst offenen Punkten · 1 AT · #231 +- [x] **Restrisikoliste** mit bewusst offenen Punkten · 1 AT · #231 → `90-restrisiken.md` --- diff --git a/docs/vs-nfd/90-restrisiken.md b/docs/vs-nfd/90-restrisiken.md new file mode 100644 index 0000000..f6e76c7 --- /dev/null +++ b/docs/vs-nfd/90-restrisiken.md @@ -0,0 +1,154 @@ +# 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 + +- **Risiko:** Bis #216 (M27) existiert kein Schalter + `auth.local.enabled=false`; die Anwendung führt eigene + Passwort-Konten, obwohl die Behördenumgebung Fremdauthentisierung + vorsieht. Zusätzlich ist noch offen, ob der Schalter zur Laufzeit + umschaltbar sein wird oder einen Neustart verlangt — das entscheidet + #216 und trägt es hier nach. +- **Warum akzeptiert:** Reihenfolge der Umsetzung (M26 vor M27); + produktiver VS-NfD-Betrieb beginnt erst nach M27. +- **Kompensation:** Referenzkonfiguration (`50-haertungsleitfaden.md`): + Registrierung geschlossen, kurze Sessions (12 h absolut / 2 h idle), + Argon2id-Hashes, Rate-Limits, Audit der Anmeldungen. +- **Entscheidung:** Projektleitung, Maßnahmenplan Rev. 2 (M27-Planung), + 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.