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:
@@ -76,6 +76,36 @@ für den geprobten Ref, und die bestätigende Beobachtung wäre derselbe Vorgang
|
||||
wie der Schaden. Deshalb wird das **Ereignis** erkannt statt die Regel
|
||||
abgefragt.
|
||||
|
||||
### Das Gedächtnis liegt im Server, nicht nur auf diesem Rechner
|
||||
|
||||
Jeder verankerte Checkpoint bekommt zusätzlich einen eigenen unveränderlichen
|
||||
Ref `refs/notary/seq-N`. Der überlebt einen Force-Push auf `main`, weil er ein
|
||||
**anderer Ref** ist. Damit lässt sich die höchste je existierende Nummer aus dem
|
||||
Server rekonstruieren – auch wenn der lokale Beobachtungsspeicher fehlt.
|
||||
|
||||
Warum das nötig ist: Läge das Gedächtnis nur lokal, müsste ein Angreifer nach
|
||||
einem Zurückspulen bloß diese Datei löschen. Der nächste Lauf meldete dann
|
||||
„erste Beobachtung" – **ein einziges** Code-3, das im Alltag neben echten
|
||||
Remote-Ausfällen untergeht – und würde anschließend den zurückgespulten Stand
|
||||
als Ausgangspunkt übernehmen. Ab da wäre alles dauerhaft grün. Ein gutartiger
|
||||
Standardzustand, den ein Angreifer gezielt herstellen kann, ist kein sicherer
|
||||
Standardzustand.
|
||||
|
||||
> **Diese Refs gehören ebenfalls serverseitig geschützt** (kein Löschen, kein
|
||||
> Überschreiben). Sonst verschiebt sich das Problem nur eine Ebene weiter.
|
||||
|
||||
### Wenn das Gedächtnis trotzdem fehlt
|
||||
|
||||
Das Skript unterscheidet zwei Fälle – der Unterschied entscheidet alles:
|
||||
|
||||
| Lage | Bedeutung | Verhalten |
|
||||
|---|---|---|
|
||||
| kein Speicher, **keine** notarisierte Historie | echte Erstinbetriebnahme | einmalig `NOTARY_GENESIS_ACK=true`, sonst Code 4 |
|
||||
| kein Speicher, **aber** Historie vorhanden | Gedächtnis ging *nach* der Etablierung verloren | **Code 4**, keine stille Übernahme; erst nach `NOTARY_ADOPT_ACK=true` |
|
||||
|
||||
Eine Baseline zu setzen heißt „ich verbürge mich, *das* ist der wahre Kopf".
|
||||
Dieser Akt wird nicht automatisch wiederholt.
|
||||
|
||||
Zwei Konsequenzen für den Betrieb:
|
||||
|
||||
- **Die Datei gehört nicht in den Klon** und sollte möglichst auf getrenntem
|
||||
@@ -154,6 +184,7 @@ Deshalb gilt jetzt:
|
||||
| 0 | alles in Ordnung, Checkpoint angehängt (bzw. Prüfung bestanden) |
|
||||
| 1 | Betriebsfehler (Konfiguration, Commit oder Push fehlgeschlagen) |
|
||||
| 2 | **Befund** – Widerspruch zwischen CRM und Gegenbuch, oder ungültige Signatur |
|
||||
| 4 | **Wächter-Gedächtnis fehlt** – Erstinbetriebnahme unbestätigt, oder Speicher nach der Etablierung verloren |
|
||||
| 3 | beglaubigter Stand nicht abschließend feststellbar – Remote fehlt/unerreichbar, erste Beobachtung, Zurückspulen nicht ausschließbar, **oder** Checkpoint erstellt aber nicht verankert |
|
||||
|
||||
Für Cron gilt: **jeder** Code außer 0 gehört gemeldet. Code 2 ist der Alarm,
|
||||
|
||||
Reference in New Issue
Block a user