Gegenbuch: Anker belegen nichts mehr, Anker-Verlust wird laut (R180-01/-02)
R180-01: Der Code nahm den hoechsten noch vorhandenen refs/notary/seq-* als "hoechsten je". Loescht ein Angreifer nur die oberen Anker und laesst einen niedrigeren stehen, senkt er den Vergleichswert selbst - ein frischer Auditoren-Klon meldete OK, exit 0 auf gewaschenem Stand. Perverser Gradient: Wer alle Refs loeschte, flog auf (Code 4); wer weniger loeschte, kam durch, weil ankerBelegt sowohl die Gewissheit begruendete als auch den Code-4-Diskriminator kurzschloss. Fix: Anker begruenden keine Gewissheit mehr. Sie koennen ein Zurueckspulen widerlegen, aber nie Unversehrtheit belegen. Der Code-4-Diskriminator haengt nicht mehr an ihnen und greift nur im Schreiblauf. R180-02: Der Anker-Push-Fehlschlag war nur eine Warnung mit exit 0 - ausgerechnet bei der tragenden Eigenschaft. Der Normalbetrieb senkte damit den Hoechststand still um eins. Fix: exit 3 bei Fehlschlag, und jeder Lauf zieht fehlende Anker nach, bevor er etwas als OK meldet. Verifiziert: Teil-Loeschung mit frischem Auditoren-Klon -> exit 3 mit Vorbehalt statt exit 0; Anker-Push per Hook abgelehnt -> exit 3 statt Hinweis; Folgelauf traegt den fehlenden Anker nach. README: Der Schutz von refs/notary/* gegen Loeschen und Ueberschreiben ist von der Fussnote zur tragenden Voraussetzung erhoben. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -97,6 +97,41 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung
|
||||
|
||||
## ✅ Erledigt
|
||||
|
||||
- [x] **🛑 Gegenbuch: Anker belegen nichts mehr, Anker-Verlust wird laut (Pentest R180-01/-02)** (2026-08-18)
|
||||
- **R180-01 (MEDIUM)** – Genau die Unsicherheit, die ich selbst benannt
|
||||
hatte, bestaetigt: Der Code nahm den **hoechsten noch vorhandenen**
|
||||
`refs/notary/seq-*` als „hoechsten je“. Loescht ein Angreifer nur die
|
||||
OBEREN Anker und laesst einen niedrigeren stehen, senkt er den
|
||||
Vergleichswert selbst – ein frischer Auditoren-Klon meldete `OK`, exit 0
|
||||
auf gewaschenem Stand.
|
||||
Perverser Gradient: Wer ALLE Refs loeschte, flog auf (Code 4); wer weniger
|
||||
loeschte, kam durch – weil `ankerBelegt` sowohl die Gewissheit begruendete
|
||||
als auch den Code-4-Diskriminator kurzschloss.
|
||||
Fix: **Anker begruenden keine Gewissheit mehr.** Sie koennen ein
|
||||
Zurueckspulen *widerlegen* (hoher Anker nicht mehr im Kopf → Alarm), aber
|
||||
nie Unversehrtheit *belegen*. Der Code-4-Diskriminator haengt nicht mehr an
|
||||
ihnen und greift nur noch im Schreiblauf (ein Auditor hatte nie ein
|
||||
Gedaechtnis, ihm Code 4 vorzuwerfen waere Laerm).
|
||||
- **R180-02 (LOW→MED)** – Der Anker-Push-Fehlschlag war nur eine Warnung mit
|
||||
exit 0, ausgerechnet bei der tragenden Eigenschaft: `main` stand auf dem
|
||||
neuen Checkpoint, der Anker fehlte, niemand holte es nach. Der
|
||||
**Normalbetrieb** senkte damit den Hoechststand still um eins und riss das
|
||||
R180-01-Fenster ohne Angriff auf.
|
||||
Fix: Anker-Push-Fehlschlag → **exit 3**; und jeder Lauf **zieht fehlende
|
||||
Anker nach**, bevor er irgendetwas als OK meldet (Zuordnung ueber die
|
||||
n-te Aenderung am Gegenbuch).
|
||||
- Verifiziert: Teil-Loeschung (main auf seq-2, Anker 3–5 weg, DB gekuerzt),
|
||||
frischer Auditoren-Klon → **exit 3 mit Vorbehalt statt exit 0** (das falsche
|
||||
Gruen ist weg; erkannt wird es in-repo weiterhin nicht, das geht ohne
|
||||
Ref-Schutz nicht); Anker-Push per Hook abgelehnt → **exit 3** statt
|
||||
Hinweis; Folgelauf → „Fehlende Anker nachgetragen: 1“, Anker wieder
|
||||
vollstaendig.
|
||||
- **README:** Der Schutz von `refs/notary/*` gegen Loeschen und Ueberschreiben
|
||||
ist von der Fussnote zur **tragenden Voraussetzung** erhoben – mit der
|
||||
Begruendung, warum Anker nichts belegen koennen, und dem ausdruecklichen
|
||||
Hinweis, dass ein `--check` aus frischem Klon eine Anker-Loeschung nicht
|
||||
erkennt.
|
||||
|
||||
- [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
|
||||
|
||||
Reference in New Issue
Block a user