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:
@@ -91,8 +91,22 @@ 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.
|
||||
> ### ⚠ Ohne serverseitigen Schutz dieser Refs bringt das Verfahren nichts
|
||||
>
|
||||
> `refs/notary/*` muss auf dem Server **gegen Löschen und Überschreiben**
|
||||
> gesperrt sein. Das ist keine Empfehlung, sondern die tragende Voraussetzung –
|
||||
> genauso wie die Rewind-Sperre auf `main`.
|
||||
>
|
||||
> Der Grund ist eine unangenehme Asymmetrie: Das Skript kennt nur den
|
||||
> **höchsten noch vorhandenen** Anker, nicht den höchsten je erzeugten. Wer
|
||||
> *alle* Anker löscht, fliegt auf (Code 4). Wer nur die **obersten** löscht und
|
||||
> einen niedrigeren stehen lässt, senkt damit den Vergleichswert selbst – und
|
||||
> in-repo ist das von „gab es nie" nicht zu unterscheiden.
|
||||
>
|
||||
> Deshalb begründen Anker **keine** Unversehrtheit. Sie können ein
|
||||
> Zurückspulen *widerlegen* (wenn ein hoher Anker nicht mehr im Kopf steckt),
|
||||
> aber nie belegen, dass nichts fehlt. Ein `--check` aus frischem Klon erkennt
|
||||
> eine Anker-Löschung **nicht** – es meldet dann Code 3 mit Vorbehalt, nicht 0.
|
||||
|
||||
### Wenn das Gedächtnis trotzdem fehlt
|
||||
|
||||
|
||||
Reference in New Issue
Block a user