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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user