Gegenbuch: Gedaechtnis ins Substrat verlegt, Verlust laut behandelt (R180)

"Erste Beobachtung -> exit 3" galt genau einen Lauf. Danach baselinete der
Waechter auf den aktuellen Kopf - nach einem Rewind also auf den gewaschenen
Stand - und meldete dauerhaft gruen. Der Angreifer musste nur ein einziges
exit 3 ueberstehen, ausgerechnet den Code, den der Betreiber bei
Remote-Ausfaellen ohnehin staendig sieht. Damit war der Waechter, der Rewind
ohne Notar-Host-Integritaet fangen sollte, wieder an genau diese gekoppelt.

Fix: Jeder verankerte Checkpoint bekommt einen eigenen Ref refs/notary/seq-N.
Der ueberlebt einen Force-Push auf den Zweig - die hoechste je existierende
Nummer ist damit aus dem Server rekonstruierbar. Geprueft wird, ob der hoechste
verankerte Checkpoint noch im aktuellen Kopf enthalten ist und ob die Reihe
mindestens so lang ist wie verankert.

Laute Verlustbehandlung mit Diskriminator "traegt der Remote schon
Checkpoints?": keine Historie -> Genesis, einmalig NOTARY_GENESIS_ACK; Historie
vorhanden aber kein Gedaechtnis -> Anomalie, Code 4, keine stille Adoption,
erst nach NOTARY_ADOPT_ACK.

Verifiziert: Genesis ohne Bestaetigung -> Code 4; mit Bestaetigung Kette
aufgebaut samt refs/notary/seq-1..5; Rewind -> exit 2 auch nach Loeschen des
lokalen Speichers und bei jedem Folgelauf (vorher: ein exit 3, danach dauerhaft
gruen); zusaetzlich Anker-Refs geloescht -> Code 4 statt stiller Uebernahme.

Dokumentiert: Die Anker-Refs muessen serverseitig ebenfalls vor Loeschen und
Ueberschreiben geschuetzt sein, sonst verschiebt sich das Problem eine Ebene.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-22 09:10:02 +02:00
co-authored by Claude Opus 5
parent b6b6f7c0a7
commit 1a252c5059
3 changed files with 179 additions and 2 deletions
+34
View File
@@ -97,6 +97,40 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung
## ✅ Erledigt
- [x] **🧠 Gegenbuch: Gedaechtnis ins Substrat verlegt, Verlust laut behandelt (Pentest R180)** (2026-08-18)
- Sein Durchrechnen war zwingend: „erste Beobachtung → exit 3“ galt **genau
einen Lauf**. Danach baselinete der Waechter auf den AKTUELLEN Kopf nach
einem Rewind also auf den gewaschenen Stand und meldete dauerhaft gruen.
Der Angreifer musste nur **ein einziges exit 3** ueberstehen, ausgerechnet
den Code, den der Betreiber bei Remote-Ausfaellen ohnehin staendig sieht.
Damit war der Waechter, der Rewind OHNE Notar-Host-Integritaet fangen
sollte, wieder an genau diese Integritaet gekoppelt.
- **Eigentlicher Fix (sein Vorschlag): Gedaechtnis ins Append-only-Substrat.**
Jeder verankerte Checkpoint bekommt einen eigenen Ref
`refs/notary/seq-N`. Der ueberlebt einen Force-Push auf den Zweig, weil er
ein anderer Ref ist die hoechste je existierende Nummer ist damit aus dem
Server rekonstruierbar. Geprueft wird: ist der hoechste verankerte
Checkpoint noch im aktuellen Kopf enthalten, und ist die Reihe mindestens
so lang wie verankert.
- **Laute Verlustbehandlung mit seinem Diskriminator** („traegt der Remote
schon Checkpoints?“): keine Historie → echte Genesis, einmalig
`NOTARY_GENESIS_ACK=true`; Historie vorhanden, aber kein Gedaechtnis →
**Anomalie**, eigener **Code 4**, **keine stille Adoption**, erst nach
`NOTARY_ADOPT_ACK=true`. Eine Baseline zu setzen heisst „ich verbuerge
mich, DAS ist der wahre Kopf“ dieser Akt wird nicht automatisch
wiederholt.
- Verifiziert: Genesis ohne Bestaetigung → **Code 4**; mit Bestaetigung →
Kette aufgebaut, `refs/notary/seq-1..5` auf dem Server; Rewind auf
Checkpoint 2 → Alarm **exit 2**, und zwar **auch nach Loeschen des lokalen
Speichers** und bei jedem Folgelauf (vorher: ein exit 3, danach dauerhaft
gruen); zusaetzlich die Anker-Refs geloescht → **Code 4** statt stiller
Uebernahme, erst nach ausdruecklicher Bestaetigung weiter (dann exit 3 mit
Vorbehalt, nicht gruen). Labor und Port geraeumt.
- **Ehrlich dokumentiert:** Die Anker-Refs muessen serverseitig ebenfalls vor
Loeschen/Ueberschreiben geschuetzt sein sonst verschiebt sich das Problem
nur eine Ebene weiter. Server-API-Abfrage der Protection bleibt bewusst
weg (er hat sie selbst nur als Plausibilisierung eingeordnet).
- [x] **👀 Gegenbuch: Rewind-Waechter statt Probe-Push, Tor vor dem Anhaengen (Pentest R179 a/b)** (2026-08-18)
- **(a) Probe-Push verworfen seine Analyse war zwingend.** Ein Testpush
haette (1) nur den geprobten Ref beurteilt, nicht `main`; (2) die EIGENE