From ab7bacfc125f44974423bbd74b51f683505c6b6c Mon Sep 17 00:00:00 2001 From: Thore Cimbal Date: Fri, 21 Aug 2026 12:00:00 +0000 Subject: [PATCH] ledger: #0051 had none, and that is the point of having one MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The framework asks for a run ledger per undertaking, and this one was missing while Authentik and cert-manager were already deployed. It exists now, and it says so at the top: reconstructed from commits rather than kept as the work went, which is exactly the gap a ladder trace is meant to close. Same day the AAR obligation also only got met when asked. The ladder rows carry what actually saved work today: scanning a target image before upgrading, following two documented upgrade sequences instead of jumping, and checking five potentially breaking changes against our own state — all five turned out not to apply. Only one thing was built rather than reused, the temporary disarming of Flux's automatic rollback. The notes carry the failures plainly: an untested first commit of the narrowing caught by its own sabotage check, three of my own numbers corrected, and a boundary in Gate 3 that was never enforceable because Postgres hangs in the same chart. --- docs/ledger/2026-08-21-cve-remediation.md | 85 +++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 docs/ledger/2026-08-21-cve-remediation.md diff --git a/docs/ledger/2026-08-21-cve-remediation.md b/docs/ledger/2026-08-21-cve-remediation.md new file mode 100644 index 0000000..0177291 --- /dev/null +++ b/docs/ledger/2026-08-21-cve-remediation.md @@ -0,0 +1,85 @@ +--- +type: ledger +date: 2026-08-21 +size: L +status: open +related: + - "docs/design/2026-08-21-cve-remediation.md" + - "docs/issues/0051-cve-remediation-pass.md" + - "docs/aar/2026-08-21-spiegel-ausfall.md" +--- + +# Ledger: Den CVE-Bestand abarbeiten (#0051) + +⚠️ **Nachtraeglich geschrieben.** Dieses Ledger entstand erst auf sorbs Nachfrage +„hast du die Arbeiten alle gemaess Framework dokumentiert?", nachdem Authentik +und cert-manager bereits ausgerollt waren. Die Gate- und Slice-Zeilen sind aus +den Commits rekonstruiert, nicht mitlaufend gefuehrt. Das ist genau die Luecke, +gegen die dieses Ledger gedacht ist — und sie gehoert hierhin, nicht in eine +Fussnote. Es ist derselbe Tag, an dem die AAR-Pflicht schon einmal nur auf +Nachfrage erfuellt wurde (`docs/wiki/stolpersteine/aar-pflicht-ohne-werkzeug.md`). + +## Gates + +| gate | commit | approval | status | note | +|---|---|---|---|---| +| 3+4 | 70823b4 | sorb | DONE | Zusammengelegt (eine Datei, eine Zeile, keine Signaturen); Fund: Flux haette selbsttaetig zurueckgerollt. | +| 2 | 80ee448 | sorb | DONE | Gestufter Authentik-Weg belegt; die Pflicht-Zwischenstufe traegt den ganzen CRITICAL-Gewinn. | +| 1 | 24ae5b9 | sorb | DONE | Drei Haufen statt eines Vorhabens; Reichweite Haufen C = einengen auf Betriebenes. | +| 5 | | | BLOCKED | Nicht faellig: Haufen B (68 CRITICAL ohne Fix) und der Rest von Haufen A stehen aus. | + +## Slices + +| slice | commit | status | note | +|---|---|---|---| +| Authentik 0 | df6d291 | DONE | Selbsttaetige Rueckrollung entschaerft (`retries: 3` -> `0`). | +| Authentik 1 | — | DONE | Sicherung von Hand, 167,09 MB, Erfolg nach 20 s. | +| Authentik 2 | a252ac0 | DONE | 2026.5.6; Migrationen sauber, Anmeldung 14:51:04 serverseitig belegt. | +| Authentik 3 | 92add9b | DONE | 2026.8.0; 56 Migrationen, Anmeldung 15:00:35 belegt. | +| Authentik 4 | c9a3ae6 | DONE | Rueckrollung wieder scharf. | +| Haufen C | 4758e35, 59c75c8 | DONE_WITH_CONCERNS | Einengung gebaut; ⚠️ der erste Commit war UNGETESTET, siehe Notes. Wirkt erst nach Redeploy auf CFGMON. | +| cert-manager 1–7 | 93155c2 … 13aecc8 | DONE | v1.14.0 -> v1.21.1 in sieben Stufen, je 3/3 Deployments und 15/15 Zertifikate. | + +## Ladder + +| searched | found | outcome | commit | +|---|---|---|---| +| ob ein Update ueberhaupt etwas bringt, bevor eines gefahren wird | Trivy kann ein Image pruefen, das nirgends laeuft — lokal ausfuehrbar | reused: das vorhandene Scan-Werkzeug als Vorab-Messung; daraus wurde die Methode „vor jedem Update das Zielimage scannen" | | +| eine Anleitung zum Ueberspringen von Fassungsreihen, statt es zu wagen | Authentik: „upgrades MUST follow the sequence of major releases"; cert-manager: „one minor at a time, always the latest patch" | reused: die dokumentierten Wege statt eines Sprungs — beide Male gestuft | | +| ob die Bruchstellen uns treffen, statt sie zu fuerchten | 5 von 5 geprueft, 5 von 5 gegenstandslos (CONN_OPTIONS, WebAuthn-Option, Outposts, ACME-Metriken, cert-manager-edit) | reused: der eigene Bestand als Pruefmassstab; keine vorsorglichen Anpassungen gebaut | | +| einen Rueckweg, bevor die Datenbank migriert wird | #0030 hatte Authentiks Sicherung bereits zurueckgespielt (325.149 Zeilen); Anleitung: „revert to your database backup" | reused: die geprobte Sicherung; nur eine frische Ausloesung von Hand ergaenzt | | +| ob Flux beim Fehlschlag etwas Eigenes tut | CRD: `strategy` defaults to `rollback`, Remediation zwischen jedem Versuch, `remediateLastFailure` bei retries>0 ebenfalls scharf | built: eine Entschaerfung (`retries: 0`) fuer die Dauer des Sprungs — die einzige gebaute Sache, die nicht Fassungsnummer war | df6d291 | +| ob es ein neueres Wiki.js-Image gibt | `2.5` (gleitend) traegt 12 CRITICAL, das „neuere" Release-Tag `2.5.277` traegt 40 | reused: der laufende Stand — das Update waere eine Verschlechterung gewesen | | +| ob Draupnir eine neuere Fassung hat | `v3.1.0` ist die neueste; `develop` ist kein Release | reused: nichts angefasst — „Paket hat einen Fix" heisst nicht „es gibt ein Image damit" | | +| eine Quelle fuer die Einengung von Haufen C, statt einer Ausschlussliste | die Herleitung bildet den laufenden Bestand ohnehin | reused: dieselbe Menge als Filter — keine zweite Liste (ADR-0026) | 4758e35 | + +## Notes + +⚠️ **Der erste Commit der Haufen-C-Einengung war ungetestet, und die Gegenprobe +hat es gefangen.** Nach dem Abschalten des Filters blieben alle 22 Zusicherungen +gruen — meine „Gegenprobe" prueft die Uebersprung-Logik in `herleiten()`, nicht +den Filter in `ziele_registry()`. Drei echte Zusicherungen nachgezogen +(`59c75c8`); dieselbe Sabotage faehrt jetzt einen Test rot. Es ist die +Fehlerklasse dieses Projekts, in der Aenderung, die Rauschen entfernen sollte. + +**Drei eigene Zahlen waren falsch und stehen korrigiert im Entwurf:** „~65 +Ziele" wurden 56 (vier von sechs Repos haben nur einen Tag), „bis zu 65 +Meldungen" wurden 39, und die Normalisierung aenderte jeden Alarm-Fingerabdruck, +sodass alle bekannten Befunde einmalig erneut gemeldet wurden. + +⚠️ **Eine Grenze in Gate 3 war nicht durchsetzbar.** Postgres stand dort unter +„nicht Teil dieses Sprungs" — es haengt aber als Abhaengigkeit im selben Chart +und wanderte 17.9 -> 17.10 -> 17.11 mit. Eine Grenze, die man nicht ziehen kann, +haette so nicht dastehen duerfen. + +**Der Anmeldeweg war je Authentik-Stufe 20–45 s unten** (HTTP 503, Datenbank +startet neu). Bei einer Einzelreplik erwartbar, stand aber nirgends im Plan. + +**Ein Schreibfehler wurde am Diff gefangen, nicht am Ergebnis:** Der erste +Kommentarblock erzeugte jede Zeile sechsfach (benachbarte Zeichenketten-Literale +kleben in Python vor der Wiederholung). Aufgefallen an „50 insertions" fuer neun +Zeilen. + +**Der Ausfall der Ausrollstrecke** hat einen eigenen AAR +(`docs/aar/2026-08-21-spiegel-ausfall.md`) und ist hier nur verlinkt, nicht +wiederholt.