Gegenbuch: Rewind-Waechter statt Probe-Push, Tor vor dem Anhaengen (R179 a/b)

(a) Probe-Push verworfen. Er haette nur den geprobten Ref beurteilt, die eigene
Push-Identitaet gemessen statt die des Angreifers (Bypass-Rechte fuer Admins
gehen genau dann auseinander, wenn es zaehlt), nur einen Zeitpunkt abgedeckt -
und einen zerstoerungsfreien Force-Push gibt es nicht: die bestaetigende
Beobachtung waere derselbe Vorgang wie der Schaden.

Stattdessen ein Fast-Forward-Waechter: Der beobachtete Remote-Kopf wird
ausserhalb des Klons festgehalten; beim naechsten Lauf muss der neue Kopf ein
Nachfahre des alten sein. Das erkennt das Ereignis statt die Regel abzufragen
und wirkt unabhaengig von serverseitigem Schutz. Ein belegter Fast-Forward
gilt als Nachweis und blendet den Rewind-Vorbehalt aus.

(b) Code 3 als Tor vor dem Anhaengen statt als Status danach: Der Schreiblauf
signiert mit dem neuen Checkpoint zugleich ueber den Bestand darunter - ist die
Basis ungeklaert, waere das Anhaengen selbst das Waschmittel. Grundlage nicht
feststellbar -> nichts anhaengen, exit 3. Erster Lauf -> Basislinie, ehrlich
gemeldet, exit 3. Anhaengen geklappt, Push gescheitert -> exit 3 mit "erstellt,
aber NICHT verankert". Nur Anhaengen + Push + belegte Verankerung -> exit 0.

Verifiziert: Basislinie exit 3; Folgelauf exit 0 ohne Vorbehalt; Rewind aus
einem frischen Auditoren-Klon ohne MIN_SEQ und ohne Zusicherung -> Alarm exit 2
(bisher stilles Gruen); kaputtes Push-Ziel -> "erstellt, aber nicht verankert"
exit 3, Folgelauf haelt den ungepushten Commit fail-closed an.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-21 22:29:20 +02:00
co-authored by Claude Opus 5
parent 8d1ffc0df8
commit b6b6f7c0a7
3 changed files with 207 additions and 10 deletions
+30
View File
@@ -97,6 +97,36 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung
## ✅ Erledigt
- [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
Push-Identitaet gemessen statt die des Angreifers Bypass-Rechte fuer
Admins gehen genau dann auseinander, wenn es zaehlt; (3) nur einen
Zeitpunkt abgedeckt und damit die Praesenz-erzeugt-Zuversicht-Falle aus
R179-01 neu gebaut. Und: einen zerstoerungsfreien Force-Push gibt es nicht
die bestaetigende Beobachtung waere derselbe Vorgang wie der Schaden.
- Stattdessen **Fast-Forward-Waechter**: Bei jedem Lauf wird der beobachtete
Remote-Kopf **ausserhalb des Klons** festgehalten
(`~/.opencrm-notary/beobachtungen.jsonl`, per `NOTARY_STATE_FILE`
aenderbar). Beim naechsten Lauf muss der neue Kopf ein Nachfahre des alten
sein sonst Alarm. Das erkennt das **Ereignis** statt die Regel
abzufragen und wirkt unabhaengig davon, ob serverseitiger Schutz existiert.
Ein belegter Fast-Forward gilt als Nachweis und blendet den Rewind-Vorbehalt
aus (im Gegensatz zur blossen Praesenz eines MIN_SEQ-Werts).
- **(b) Code 3 als Tor VOR dem Anhaengen, nicht als Status danach.** Sein
Argument: Der Schreiblauf signiert mit dem neuen Checkpoint zugleich ueber
den Bestand darunter ist die Basis ungeklaert, waere das Anhaengen selbst
das Waschmittel. Jetzt: Grundlage nicht feststellbar → **nichts anhaengen,
exit 3**. Erster Lauf ueberhaupt → Basislinie setzen, aber ehrlich als
solche melden (exit 3, kein gruenes Licht). Anhaengen geklappt, Push
gescheitert → **exit 3 mit „erstellt, aber NICHT verankert“** statt 0 oder
1. Nur Anhaengen + Push + belegte Verankerung → exit 0.
- Verifiziert: Basislinie → exit 3; Folgelauf → exit 0 ohne Vorbehalt;
**Rewind aus einem FRISCHEN Auditoren-Klon ohne MIN_SEQ und ohne
Zusicherung → Alarm exit 2** (das war bisher stilles Gruen); Push-Ziel
kaputt → „erstellt, aber NICHT verankert“ exit 3, Folgelauf haelt den
ungepushten Commit fail-closed an (exit 2). Labor und Port geraeumt.
- [x] **🚦 Gegenbuch: Unsicherheit erreicht jetzt den Rueckgabecode (Pentest R179)** (2026-08-18)
- **R179-b der wichtigere Punkt:** Mein Rewind-Vorbehalt stand in der
Ausgabe, der Exit blieb **0**. Meine eigene README sagt „fuer Cron gilt: