# Upgrades des Audit-Formats, die alte Beweise bewahren

Ein Upgrade des Audit-Formats ist nur dann sicher, wenn ein Ermittler die exportierten Beweise von gestern mit den Regeln überprüfen kann, die gestern galten. Ein neuer Parser, der eine plausible Ansicht erzeugt, eine erfolgreiche Datenbankmigration und ein grünes Deployment beweisen das nicht. Sie können genau den Bruch verbergen, auf den es ankommt: Ein Datensatz, dessen Bytes unverändert bleiben, dessen Bedeutung, Hash-Eingabe oder Verifiziererverhalten sich aber geändert hat.

Betrachten Sie das Audit-Format als Protokoll mit einem langen Nachlauf. Ihre Anwendung kann sich jede Woche ändern. Beweise können das nicht. Sobald sich jemand auf einen Datensatz verlässt, um zu klären, wer eine Aktion genehmigt hat, welches Zugangsmittel verwendet wurde oder was ein Agent an einen externen Dienst gesendet hat, braucht dieser Datensatz noch lange nach dem Verschwinden des Codes, der ihn geschrieben hat, eine stabile Interpretation.

## Bewahren Sie zuerst die Bytes, dann den Komfort

Das maßgebliche Artefakt ist die ursprüngliche Bytefolge des Datensatzes zusammen mit dem Kontext, der für die Verifizierung erforderlich ist. Eine geparste Zeile in einer aktuellen Datenbank ist eine Arbeitskopie. Ein in einem Dashboard dargestelltes JSON-Objekt ist eine Ansicht. Beides ersetzt nicht die Beweisbytes, die an einer Signatur, einer Hash-Kette oder einer authentifizierten Hülle beteiligt waren.

Diese Unterscheidung klingt kleinlich, bis ein Upgrade ein Feld neu schreibt. Angenommen, Version 1 speicherte ein SSH-Ziel als vom Benutzer eingegebene Zeichenkette:

```json
{"schema_version":1,"event":"ssh.execute","target":"build@prod.example:22","command":"uptime"}
```

Version 2 möchte getrennte Felder, damit nach Host und Port gefiltert werden kann:

```json
{"schema_version":2,"event":"ssh.execute","user":"build","host":"prod.example","port":22,"command":"uptime"}
```

Diese beiden Datensätze können dieselbe Aktion beschreiben, sind aber keine austauschbaren Beweise. Ein v2-Encoder kann einen Hostnamen normalisieren, einen Standardport ergänzen oder ein Ziel ablehnen, das v1 akzeptiert hat. Wenn Sie den ersten Datensatz mit dem zweiten überschreiben, machen Sie eine neue Aussage über das alte Ereignis. Diese Aussage kann richtig sein, aber allein durch den Verweis auf die umgeschriebenen Daten lässt sich das nicht beweisen.

Halten Sie drei Dinge getrennt:

- **Ursprüngliche Beweise**: unveränderliche Bytes, genau so, wie sie in die Audit-Sequenz aufgenommen wurden.
- **Abgeleitete Darstellung**: eine indizierte, dekodierte oder migrierte Form für Suche und Anzeige.
- **Interpretationsnotizen**: dokumentierte Regeln, die Felder, Standardwerte und versionsabhängiges Verhalten erklären.

Eine abgeleitete Darstellung kann neu erstellt werden. Ursprüngliche Beweise können das nicht. Speichern Sie die Originale in einem unveränderlichen Beweis-Bundle oder Objektspeicher, adressieren Sie sie über ihren Digest und lassen Sie jedes abgeleitete Element auf diesen Digest verweisen. Wenn Aufbewahrungsregeln eine Löschung verlangen, zeichnen Sie diese Löschung als eigenes Ereignis auf. Verdichten Sie die Historie nicht heimlich und nennen Sie das Ergebnis ein Upgrade.

Das gilt auch für Logs mit verschlüsselten Datensätzen. Verschlüsselung schützt Inhalte vor unbefugten Lesern. Sie macht eine verlustbehaftete Migration nicht unschädlich. Der Verifizierer muss weiterhin erkennen können, welcher Chiffretext, welcher Header und welche Kettenregel das Ergebnis erzeugt haben.

## Geben Sie jedem Datensatz eine ausdrückliche Version

Fügen Sie jedem Datensatz vor dem Hashen oder Signieren ein explizites `schema_version` hinzu. Leiten Sie die Version nicht aus einer Dateiendung, einer Datenbankmigrationsnummer, einem Anwendungsrelease oder dem Vorhandensein eines kürzlich hinzugefügten Feldes ab.

Diese Ableitung funktioniert genau bis zum ersten forensischen Export. Ein Ermittler erhält einen Ordner mit Datensätzen aus einem Backup, einem Support-Ticket oder von einem Rechner, auf dem die aktuelle Anwendung nicht mehr läuft. Der umgebende Kontext ist unvollständig, der Datensatz aber noch vorhanden. Ein Datensatz, der seine eigene Version trägt, teilt dem Verifizierer mit, welchen Decoder und welche Regeln er benötigt.

Verwenden Sie für ein Format, dessen Regeln Sie selbst festlegen, eine kleine Ganzzahl. Reservieren Sie Version 0 als ungültig, damit ein fehlendes Feld nicht unbemerkt zu einem Legacy-Format wird. Die Version sollte eine eng begrenzte Aufgabe haben: Sie wählt die Grammatik des Datensatzes und das Verifizierungsrezept aus. Machen Sie daraus keine allgemeine Kennung des Produktreleases.

Eine langlebige Hülle kann so aussehen:

```json
{
  "schema_version": 3,
  "record_id": "01J8X7K5W3H0Q9M6P2R4A1C8ZD",
  "recorded_at": "2026-07-22T14:08:31.482Z",
  "kind": "http.request.completed",
  "previous_digest": "sha256:4a4d...",
  "payload": {
    "method": "POST",
    "authority": "api.example.test",
    "status": 201
  }
}
```

Die Version gehört in die authentifizierte Eingabe. Wenn ein Datensatz Version 3 angibt, der Digest aber ohne dieses Feld berechnet wurde, kann ein Angreifer, der gespeicherte Bytes bearbeiten kann, den Verifizierer möglicherweise auf einen anderen Interpretationspfad lenken. Nehmen Sie jedes Feld in die geschützten Bytes auf, das einen Parser, einen Hash-Algorithmus, eine Kanonisierungsregel oder einen Signaturalgorithmus auswählt.

Trennen Sie außerdem die **Version des Datensatzschemas** von der **Version der Ereignisbedeutung**. Die erste beantwortet die Frage: «Wie parse und verifiziere ich diese Bytes?» Die zweite beantwortet: «Was bedeutete dieses Ereignis, als es ausgegeben wurde?»

Wenn Sie beispielsweise `actor` von einem frei eingegebenen Anzeigenamen auf eine stabile Prozessidentität umstellen, kann die JSON-Struktur gleich bleiben, während sich die Aussage ändert. Das ist nicht bloß Schema-Version 4. Es ist eine semantische Änderung. In der Beweisspezifikation muss stehen, ab wann die neue Bedeutung gilt. Dasselbe gilt, wenn sich die Einheit eines Feldes ändert, ein Zeitstempel von Ortszeit auf UTC wechselt oder ein Status statt einer beobachteten Antwort nun eine Richtlinienentscheidung beschreibt.

## Frieren Sie das Verifizierungsrezept ein, nicht nur die Felder

Ein versioniertes Schema ist unvollständig, wenn der Verifizierer das genaue Byte-Rezept, mit dem ein Datensatz authentifiziert wurde, nicht rekonstruieren kann. Die Feldanordnung ist nur ein Teil dieses Rezepts.

Dokumentieren Sie für jede Version:

- die akzeptierte Datensatzgrammatik und die Pflichtfelder;
- die Text- oder Binärkodierung und die Kanonisierungsregeln;
- die Digest- und Signaturalgorithmen;
- den Domain-Separator, falls Sie einen verwenden;
- die Regel für die Verkettung und die Genesis-Regel;
- das Fehlerverhalten bei fehlerhaften oder unbekannten Eingaben.

RFC 8785 erklärt, warum JSON vor kryptografischen Operationen eine deterministische Darstellung braucht: Gewöhnliches JSON erlaubt mehrere Serialisierungen desselben logischen Werts, während Hashing und Signieren unveränderliche Bytes erfordern. Das JSON Canonicalization Scheme schränkt die Eingabe ein und sortiert Objekteigenschaften deterministisch. Durch seine Formatbeschränkungen weist es außerdem darauf hin, dass doppelte Eigenschaftsnamen und Zahlen außerhalb der unterstützten Darstellung keine harmlosen Details sind.

Dieser Standard ist nur nützlich, wenn Sie das genaue Profil benennen. «Wir hashen JSON» ist kein Rezept. «Wir verwenden den Serialisierer der aktuellen Laufzeit» ist noch schlechter, weil ein Laufzeitupgrade Escaping, Zahlenformatierung oder Reihenfolge ohne eine bewusste Audit-Änderung verändern kann.

Dasselbe Problem tritt bei Binärformaten auf. RFC 8949 definiert Anforderungen an die deterministische Kodierung für CBOR und weist darauf hin, dass eine frühere Sortierkonvention einen ausdrücklich benannten Kompatibilitätsmodus braucht. Ein Verifizierer kann nicht sicher annehmen, dass jeder historische Produzent unter «kanonisch» dasselbe verstanden hat.

Bauen Sie keinen neuen Verifizierer, der beliebiges JSON parst, es mit der heutigen Bibliothek neu serialisiert und anschließend das Ergebnis hasht. Dieses Muster beschädigt alte Beweise auf zwei Arten. Es kann Datensätze ablehnen, die nach dem älteren Rezept gültig waren, und es kann einen Datensatz nach einem neuen Rezept akzeptieren, das den ursprünglichen Digest nie erzeugt hat.

Halten Sie die Versionsauswahl stattdessen nahe an der Byte-Grenze:

```text
read envelope bytes
  -\u003e identify protected schema_version
  -\u003e select verifier V1, V2, or V3
  -\u003e validate that version's grammar
  -\u003e reproduce that version's authenticated bytes
  -\u003e verify digest, signature, and chain link
  -\u003e decode a display model only after verification
```

Das Anzeigemodell kommt absichtlich zuletzt. Ein Renderer darf angenehm sein. Ein Verifizierer darf nicht fantasieren.

## Unbekannte Versionen müssen strikt abgelehnt werden

Wenn ein Verifizierer auf eine Version trifft, die er nicht unterstützt, muss er ausdrücklich `unsupported_version` zurückgeben. Er darf unbekannte Felder nicht als nebensächlich behandeln, das neueste Layout annehmen oder einen allgemeinen Fallback-Decoder ausführen.

Ingenieure sträuben sich oft dagegen, weil sie Vorwärtskompatibilität wollen. Für eine Anwendung, die optionale Präsentationsfelder liest, ist Vorwärtskompatibilität sinnvoll. Bei der Beweisverifizierung ist sie gefährlich, denn ein scheinbar optionales Feld kann später die authentifizierte Interpretation steuern.

Verwenden Sie eine Ergebnisstruktur, die Beweisfehler von Einschränkungen des Werkzeugs trennt:

```json
{
  "record_id": "01J8X7K5W3H0Q9M6P2R4A1C8ZD",
  "schema_version": 4,
  "status": "unsupported_version",
  "verified": false,
  "supported_versions": [1, 2, 3],
  "reason": "Verifier 2.7.0 has no verification recipe for schema version 4"
}
```

Dieses Ergebnis sagt etwas Genaues: Das Werkzeug hat die Authentizität nicht festgestellt. Es beschuldigt den Datensatz nicht der Manipulation und tut auch nicht so, als sei er gültig. Halten Sie `invalid`, `incomplete`, `unsupported_version` und `verified` sowohl in der Befehlsausgabe als auch in APIs getrennt.

Eine Hash-Kette bringt eine weitere Kompatibilitätsanforderung mit sich. Die Historie der Kette darf nicht aus einem einzigen finalen Digest abgeleitet werden. Ein Verifizierer braucht versionsabhängige Regeln für den ersten Datensatz, die Reihenfolge der Datensätze, die Kodierung des übergeordneten Digests und jedes Checkpoint-Format. Certificate Transparency bietet hier das richtige Denkmodell: RFC 9162 definiert Konsistenzbeweise, die zeigen, dass ein früherer Baum dasselbe Präfix eines späteren Baums ist, statt Auditoren auf einen neu gemeldeten Root-Hash vertrauen zu lassen.

Ihre Audit-Sequenz verwendet vielleicht keinen Merkle-Baum, aber die Lehre bleibt dieselbe. Wenn sich Kettenregeln ändern, muss die Kontinuität an der Grenze bewiesen werden. Erstellen Sie einen abschließenden v1-Checkpoint mit seinem finalen verifizierten Digest, der Anzahl der Datensätze und der Version. Lassen Sie den ersten v2-Datensatz diesen Checkpoint in einem definierten Feld authentifizieren. Der v2-Verifizierer sollte beide Seiten mit ihren eigenen Regeln prüfen, bevor er eine durchgängige Historie meldet.

Verbinden Sie niemals zwei Historien, indem Sie einen alten Digest als Kommentar oder Anzeigefeld speichern. Die Verbindung muss Teil der geschützten Eingabe sein.

## Migrationen sollen Ableitungen erzeugen, keine Ersetzungen

Eine gute Migration erzeugt neben den Quelldaten einen neuen, reproduzierbaren abgeleiteten Datensatz. Sie hält genug Herkunftsinformationen fest, damit eine andere Person dasselbe Ergebnis erneut erzeugen und mit der Quelle vergleichen kann.

Erfassen Sie für jeden migrierten Datensatz oder Batch:

```json
{
  "source_digest": "sha256:4a4d...",
  "source_schema_version": 1,
  "migration_id": "audit-v1-to-v2",
  "migration_build": "2.7.0+e31c9f4",
  "output_digest": "sha256:77c8...",
  "migrated_at": "2026-07-22T14:12:09Z"
}
```

Der Zeitpunkt `migrated_at` beschreibt die Ableitung, nicht das ursprüngliche Ereignis. Überschreiben Sie `recorded_at` nicht und stellen Sie einen erzeugten v2-Datensatz nicht so dar, als sei er vom alten System ausgegeben worden. Dieser Fehler hat bei internen Untersuchungen mehr Verwirrung verursacht als jeder offensichtliche Parser-Absturz.

Manche Migrationen können nicht verlustfrei sein. Ein v1-Datensatz kann eine einzelne Zeichenkette `target` enthalten, während v2 eine strukturierte URI verlangt. Wenn das Parsen scheitert oder mehrdeutig ist, bewahren Sie die Quellzeichenkette auf und zeichnen Sie einen ausdrücklichen Migrationsstatus auf. Erfinden Sie keinen strukturierten Wert, nur weil Ihr neuer Index einen solchen erwartet.

Zum Beispiel:

```json
{
  "source_digest": "sha256:4a4d...",
  "migration_status": "partial",
  "derived": {
    "target_raw": "build@prod.example:22",
    "host": "prod.example",
    "port": 22
  },
  "unresolved": ["user"]
}
```

Das mag weniger ordentlich aussehen als eine vollständig ausgefüllte Zeile. Es ist ehrlicher. Ein späterer Ermittler sieht sowohl, was der ältere Datensatz sagte, als auch, was die Migration daraus abgeleitet hat.

Vermeiden Sie die beliebte Empfehlung, jeden alten Eintrag durch den aktuellen Writer laufen zu lassen und das als Upgrade zu bezeichnen. Sie ist beliebt, weil sie einen Codepfad vereinfacht und Berichte einheitlich macht. Für Beweise ist sie falsch, denn Writer wenden gewöhnlich aktuelle Standardwerte an, lassen veraltete Felder weg und normalisieren Werte. Das Ergebnis kann für die Suche nützlich sein, ist aber eine Übersetzung und kein ursprüngliches Zeugnis.

## Ein dauerhaftes Fixture-Korpus fängt die stillen Brüche ab

Kompatibilität ist ein Testbestandteil, kein Versprechen in einer Release-Notiz. Erstellen Sie für jede veröffentlichte Schema-Version ein Beweiskorpus und führen Sie es gegen jeden Verifier-Build aus, der Unterstützung für diese Version beansprucht.

Das Korpus braucht mehr als einige wenige Standardfälle. Bewahren Sie bytegenaue Fixtures für diese Fälle auf:

- einen normalen gültigen Datensatz und eine gültige Kette mit mehreren Datensätzen;
- Grenzzeitstempel, Unicode-Text, leere optionale Werte und von dieser Version akzeptierte numerische Grenzwerte;
- einen Datensatz mit einem geänderten Payload-Byte;
- einen Datensatz mit geändertem übergeordnetem Digest oder veränderter Reihenfolge;
- fehlerhafte, doppelte, abgeschnittene Eingaben und Eingaben mit unbekannter Version.

Speichern Sie erwartete Ergebnisse, nicht nur erwartete dekodierte Objekte. Der Test sollte das Beweisergebnis und die Diagnosekategorie prüfen. Ein Verifizierer, der einen gültigen Datensatz korrekt als ungültig markiert, ist trotzdem fehlgeschlagen. Ein Verifizierer, der einen fehlerhaften Datensatz in eine allgemeine Parser-Ausnahme verwandelt, ist weniger spektakulär fehlgeschlagen, erschwert aber Untersuchungen.

Verwenden Sie ein Manifest, das Fixture-Digests und das erwartete Verhalten des Verifizierers festschreibt:

```yaml
fixture: v1/0007-http-request.json
sha256: 4a4d5f0c...
expect:
  status: verified
  schema_version: 1
  chain_position: 7

fixture: v1/0007-http-request-tampered.json
sha256: 91af2a7d...
expect:
  status: invalid
  error_code: payload_digest_mismatch
```

Testen Sie anschließend mehr als eine Richtung.

1. Der älteste noch aufbewahrte Verifizierer muss sein ursprüngliches Korpus weiterhin verifizieren.
2. Der aktuelle Verifizierer muss jedes aufbewahrte historische Korpus verifizieren.
3. Ein Writer-Kandidat muss Datensätze erzeugen, die der aktuelle Verifizierer unter der neuen Version akzeptiert.
4. Eine Migrationskandidatin muss den angegebenen Quelldigest bewahren und die erwartete Ableitung erzeugen.
5. Jeder Verifizierer muss Fixtures ablehnen, die für nicht unterstützte zukünftige Versionen erstellt wurden.

Schreiben Sie erwartete Fixtures nicht bei jedem fehlgeschlagenen Test neu. Prüfen Sie zuerst die Bytes, die ausgewählte Verifiziererversion und den Fehlercode. Fixture-Aktualisierungen sollten selten sein, wie eine Protokolländerung geprüft werden und eine Begründung enthalten, die ein beabsichtigtes neues Fixture von veränderten Beweisen unterscheidet.

Fügen Sie rund um Parser Property-Tests hinzu, verwechseln Sie diese aber nicht mit dem dauerhaften Korpus. Zufällige Eingaben finden Abstürze und ungewöhnliche Grenzfälle. Benannte Fixtures bewahren die Fälle, aus denen Sie bereits auf die harte Tour gelernt haben, einschließlich Datensätzen aus echten Releases, nachdem Sie sensible Inhalte entfernt haben.

## Testen Sie die Upgrade-Grenze so, wie ein Ermittler sie erleben würde

Das größte Risiko liegt meist an der Grenze zwischen Versionen, nicht in einer der beiden Versionen allein. Schreiben Sie ein Szenario, das vor dem Upgrade beginnt und danach endet. Fragen Sie anschließend, ob eine unabhängige Person die gesamte Sequenz erklären kann.

Betrachten Sie eine Kette, in der v1 die Genehmigung einer Agent-Sitzung, mehrere HTTP-Aufrufe und den Widerruf der Sitzung aufzeichnet. Version 2 führt ein detaillierteres Feld für das Ergebnis einer Anfrage und eine neue Prüfsummenkodierung ein. Der Test sollte mit einem v1-Genesis-Datensatz beginnen, gültige v1-Einträge anhängen, den dokumentierten Grenz-Checkpoint erzeugen, v2-Einträge anhängen und das gesamte Bundle exportieren.

Der erwartete Verifizierungsbericht muss den Übergang klar zeigen:

```text
$ audit verify evidence-bundle
verified v1 records: 18
verified v1 terminal digest: sha256:6c12...e98a
verified v1-to-v2 continuity checkpoint
verified v2 records: 6
chain status: verified
```

Führen Sie nun die Fehler aus, die Upgrades in der Praxis verursachen:

- Entfernen Sie den letzten v1-Datensatz, lassen Sie die v2-Datensätze aber bestehen.
- Ändern Sie den v1-Digest des Checkpoints.
- Verwenden Sie einen v2-Datensatz mit einer v1-Versionskennung.
- Exportieren Sie nur das v2-Segment und verlangen Sie eine Bewertung der vollständigen Historie.
- Führen Sie einen Verifizierer vor v2 gegen das gemischte Bundle aus.

Ein korrektes System gibt unterschiedliche Antworten. Die ersten drei Fälle sind ungültig. Der vierte darf als unvollständiges Segment verifiziert werden, wenn das Bundle seinen Start-Checkpoint angibt. Es darf aber nicht behaupten, die vollständige Historie verifiziert zu haben. Der fünfte gibt `unsupported_version` zurück, nachdem er alle v1-Beweise gemeldet hat, die er verifizieren konnte, sofern das Befehlsdesign Teilberichte zulässt. Er darf nicht das gesamte Bundle als verifiziert melden.

Hier entdecken Teams, dass ihre Journale und Dashboards Quellgrenzen verbergen. Eine Benutzeroberfläche, die Datensätze zu einer Zeitachse zusammenführt, kann in Ordnung sein, sofern sie einen Schemaübergang kennzeichnet und einem Prüfer die Ansicht der ursprünglichen Hülle ermöglicht. Lassen Sie Ermittler eine Formatänderung nicht aus dem plötzlichen Auftauchen eines Feldes ableiten.

## Halten Sie den Verifizierer klein genug, damit er die Anwendung überlebt

Der Audit-Verifizierer sollte weniger Abhängigkeiten und weniger Berechtigungen haben als die Anwendung, die Datensätze erzeugt. Wenn das Lesen alter Beweise das Starten einer grafischen Anwendung, eine Kontoverbindung, das Öffnen eines Zugangsdaten-Tresors oder das Herunterladen eines Kompatibilitätspakets erfordert, hängt Ihr Beweisplan von Bedingungen ab, die im ungünstigsten Moment verschwinden.

Teilen Sie die Verantwortlichkeiten auf:

- Die Anwendung schreibt Datensätze und zeigt die aktuelle Aktivität an.
- Ein kompakter Verifizierer liest ein exportiertes Bundle, wählt versionierte Rezepte aus und gibt einen maschinenlesbaren Bericht aus.
- Ein Renderer kann verifizierte Datensätze in Tabellen und Zeitachsen umwandeln, ohne an der Authentizitätsentscheidung beteiligt zu sein.

Machen Sie den Verifizierer deterministisch. Bei demselben Bundle und denselben Befehlsoptionen sollte er dieselben Statuscodes und dieselbe Berichtsstruktur zurückgeben. Nehmen Sie die Release-Kennung des Verifizierers in den Bericht auf, lassen Sie diese Kennung aber nicht das Beweisergebnis verändern.

Für Sallyport ist `sp audit verify` die richtige Prüfung, die in einem Upgrade-Runbook erhalten bleiben sollte. Der Befehl verifiziert die verschlüsselte Hash-Kette offline über den Chiffretext und benötigt den Tresorschlüssel nicht. Speichern Sie den Bericht des Befehls neben einem unveränderten Export, bevor Sie die Anwendung ändern, und verifizieren Sie denselben Export danach erneut.

Das Wort «offline» braucht eine klare Bedeutung. Es heißt, dass der Verifizierer das Kettenergebnis anhand der verfügbaren Beweise und seiner integrierten Verifizierungsrezepte feststellen kann. Es heißt nicht, dass er fehlende Datensätze rekonstruieren, bestimmen kann, wer einen Rechner bedient hat, oder beweisen kann, dass ein Benutzer eine Genehmigungskarte verstanden hat. Ein gut gestalteter Bericht sagt genau, welche Aussage er geprüft hat.

Veröffentlichen Sie die Spezifikation des Beweisformats zusammen mit dem Quellcode des Verifizierers und den Fixtures. Ein Quellcode-Release ohne Fixture-Korpus lässt künftige Maintainer über die Kompatibilität im Unklaren. Ein Korpus ohne schriftliches Rezept lässt sie rätseln, ob ein bestandener Test eine bewusste Regel oder einen Zufall einer einzelnen Implementierung widerspiegelt.

## Legen Sie eine Stilllegungsrichtlinie fest, bevor der erste Notfall eintritt

Sie können die Unterstützung eines historischen Formats erst einstellen, wenn Sie entschieden haben, was mit den Beweisen geschieht, die dieses Format verwenden. Diese Entscheidung gehört zu Sicherheit, Recht, Betrieb und den Personen, die Vorfälle untersuchen. Sie sollte nicht als Nebenfolge des Löschens eines alten Pakets eintreten.

Erstellen Sie eine Support-Tabelle mit den aufbewahrten Versionen, den Verifizierer-Releases, die sie lesen können, der erwarteten Aufbewahrungsdauer der Beweise und dem Verfahren für ein Ausnahmearchiv. Wenn Sie einen Reader stilllegen wollen, stellen Sie einen eigenständigen Archivverifizierer bereit und frieren Sie zuerst dessen Fixture-Korpus ein. Bewahren Sie seine Build-Anweisungen und erwarteten Prüfsummen zusammen mit der Beweisdokumentation auf.

Versprechen Sie nicht leichtfertig dauerhafte Unterstützung. Algorithmen altern, Betriebssysteme ändern sich und alte Parser können Sicherheitsmängel enthalten. Bewahren Sie aber einen Weg auf, um aufbewahrte Beweise zu verifizieren. Manchmal bedeutet das ein isoliertes Archivwerkzeug, das nur lokale Dateien akzeptiert. Manchmal bedeutet es, ein Container- oder Image einer virtuellen Maschine mit aufgezeichneten Hashes aufzubewahren. Die Wahl hängt von Ihrer Umgebung ab. Die Pflicht bleibt, einen künftigen Ermittler nicht dazu zu zwingen, eine verschwundene Toolchain aus dem Gedächtnis nachzubauen.

Der erste Schritt ist konkret: Exportieren Sie ein kleines echtes Beweis-Bundle, führen Sie den Verifizierer aus und schreiben Sie anschließend jede verwendete versionsabhängige Regel auf. Wenn Sie dieses Rezept nicht beschreiben und das Ergebnis nach einem Testupgrade nicht reproduzieren können, haben Sie noch keinen Upgrade-Plan. Sie hoffen lediglich, dass alte Beweise lesbar bleiben.
