Bestandssiegel betriebstauglich gemacht (Pentest R173-01/-02/-03)

R173-01 (HIGH): Das Siegel war ueber HTTP tot. Die generische auditMiddleware
protokolliert den POST /seal-backlog-Request selbst als AuditLog/CREATE mit
demselben endpoint - exakt die Signatur, mit der der Marker gesucht wurde, nur
mit hoeherer id und ohne changesAfter. Der Selektor griff diese Zeile, root war
undefined, Ergebnis: dauerhaft "gebrochen" bei null manipulierten Zeilen.
Mein Testfehler: sealBacklog()/verifyIntegrity() direkt aufgerufen, nie ueber
HTTP - die Middleware lief nie mit. Dieselbe Fehlerklasse wie R165.
Fix: eigener Ressourcentyp AuditBacklogSeal, den die Middleware nie vergibt,
zusaetzlich muss der Marker auswertbares {toId, root} tragen.

R173-02 (MEDIUM): Fehlende Zeilen wurden uebersprungen, das Loeschen eines
gesiegelten Einbruchsbelegs erschien nur als unerklaerte Luecke, waehrend der
Indikator "intakt" meldete. Fix: fehlende gesiegelte Zeilen sind ein
Siegelbruch mit eigener Liste (backlogMissing) und werden namentlich gemeldet.

R173-03 (MEDIUM): Die R170-01-Haertung (Vorbefund im Marker) war auf
seal-backlog nie angewandt, ein Re-Seal absorbierte Manipulationen mit weniger
Spur als ein Rehash. Fix: Der Marker haelt den Befund vor dem Siegeln fest
samt Status und Wurzel des vorherigen Siegels; verify weist die Anzahl
gueltiger Siegel aus und warnt bei mehr als einem.

Verifiziert ueber den echten HTTP-Pfad inkl. Middleware (separate Wegwerf-DB,
Mischbestand 6xV1/4xV2/4xV3): Protokollzeile vorhanden, Status trotzdem
intakt; Loeschen einer gesiegelten Zeile -> gebrochen mit backlogMissing[2];
erneutes Siegeln -> Anzahl 2 gemeldet, Vorbefund im Marker. tsc + vite build
gruen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-21 14:20:32 +02:00
co-authored by Claude Opus 5
parent 2932598c98
commit ac62198a01
3 changed files with 143 additions and 18 deletions
+36
View File
@@ -97,6 +97,42 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung
## ✅ Erledigt
- [x] **🔧 Bestandssiegel betriebstauglich gemacht (Pentest R173-01 HIGH, R173-02/-03 MEDIUM)** (2026-08-18)
- **R173-01 (HIGH) Siegel war ueber HTTP tot.** Die generische
`auditMiddleware` protokolliert den `POST /seal-backlog`-Request SELBST als
`AuditLog / CREATE / endpoint=/api/audit-logs/seal-backlog` exakt die
Signatur, mit der ich den Marker suchte, nur mit hoeherer id und ohne
`changesAfter`. Der Selektor griff diese Zeile, `root` war `undefined`,
Ergebnis: **dauerhaft „gebrochen“ bei null manipulierten Zeilen.** Das
komplette R171-02-Deliverable war damit im Betrieb wertlos.
**Mein Testfehler:** Ich hatte `sealBacklog()`/`verifyIntegrity()` direkt
aufgerufen, nie ueber HTTP die Middleware lief nie mit. Dieselbe
Fehlerklasse wie R165 (Code korrekt, im Betrieb nicht erreichbar).
Fix: eigener Ressourcentyp `AuditBacklogSeal`, den die Middleware nie
vergibt (sie leitet ihn aus dem Pfad ab → `AuditLog`), zusaetzlich muss der
Marker auswertbares `{toId, root}` tragen.
- **R173-02 (MEDIUM) Siegel war blind fuers Loeschen.** `if (!zeile)
continue` uebersprang fehlende Zeilen; das Loeschen eines gesiegelten
Einbruchsbelegs erschien nur als „unerklaerte Luecke“, waehrend der
dedizierte Indikator „intakt“ meldete Entwarnung, waehrend Beweismaterial
verschwindet. Fix: fehlende gesiegelte Zeilen sind ein Siegelbruch mit
eigener Liste (`backlogMissing`) und werden namentlich gemeldet. Deckt
zugleich seine Frage (a) ab: geprueft wird jetzt die gesiegelte Menge
gegen die Live-Population, nicht nur der Inhalt vorhandener Zeilen.
- **R173-03 (MEDIUM) Re-Seal wusch mit weniger Spur als ein Rehash.** Die
R170-01-Haertung (Vorbefund im Marker) war auf `seal-backlog` nie
angewandt. Fix: Der Siegel-Marker haelt jetzt den Befund VOR dem Siegeln
fest (manipulierte/fehlende Zeilen, Ketten-Luecken) samt Status und Wurzel
des vorherigen Siegels; `/verify` weist die Anzahl gueltiger Siegel aus und
weist bei >1 ausdruecklich darauf hin.
- Verifiziert **ueber den echten HTTP-Pfad inkl. Middleware** (separate
Wegwerf-DB, Mischbestand 6×V1/4×V2/4×V3): Middleware-Protokollzeile ist
vorhanden, Status trotzdem `intakt`; Loeschen einer gesiegelten Zeile →
`gebrochen`, `backlogMissing:[2]`, namentlich in der Meldung; erneutes
Siegeln → Anzahl 2 gemeldet, Marker enthaelt „vorheriges Siegel: gebrochen,
Befund fehlend [2]“. Wegwerf-DB geloescht, Dev unberuehrt.
`tsc` + `vite build` gruen.
- [x] **🧿 Bestandssiegel: Altbestand gegen stille Aenderung gesichert (Pentest R171-02, HIGH)** (2026-08-18)
- Der Pentester hat den Fund live reproduziert: Bei Hash-Version 1 sind nur
7 von 24 Spalten gehasht. Ein DB-Schreibzugriff konnte eine