Coin Brief ENDE

Was der Schlüssel abdeckt: drei Ausfälle durch Werte, denen zu viel zugetraut wurde

Drei voneinander unabhängige Vorfälle der vergangenen Wochen haben eine gemeinsame Form, die sich zu benennen lohnt. Jedes Mal vertraute Software darauf, dass ein kleiner gespeicherter Wert – ein Schlüssel, ein Cache-Eintrag, eine Zahl – für etwas Größeres steht, als er tatsächlich kodierte. Die Kryptografie war in Ordnung, und in zwei von drei Fällen schrieb niemand offensichtlich schlechten Code. Die Annahme lief einfach ab – oder galt nie in jedem Fall.

Algorand: ein Anker, der planmäßig veraltete. Seit dem 11. Oktober wird die DNS-Root mit einem neuen Schlüssel signiert, KSK-2024, wie IANA es lange geplant hatte. Algorand-Knoten prüfen DNSSEC standardmäßig und brachten eine eigene Kopie des Root-Vertrauensankers mit. Laufende Knoten arbeiteten weiter; jeder Knoten, der neu startete, konnte nicht mehr validieren und kam erst mit Version 5.0.3 wieder ins Netz, die einen Tag später mit dem neuen Anker erschien. Der gespeicherte Wert – „das ist der Root-Schlüssel" – war beim Schreiben wahr und ab einem bekannten Datum falsch.

Liquid: ein Cache-Schlüssel ohne Kontext. Blockstreams Analyse des Diebstahls aus der Liquid-Föderation vom 6. September führt ihn auf den Rangeproof-Cache von Elements zurück. Seit 2018 fehlten im Cache-Schlüssel Asset-Commitment und Script, sodass ein in einem Kontext geprüfter Beweis in einem anderen durchging. Der Fix im Sommer ergänzte die fehlenden Felder, verkettete sie aber ohne Längenpräfix, sodass eine konstruierte Bytefolge weiter kollidieren konnte. Jedes zwischengespeicherte „gültig" stand für eine Prüfung, die der Knoten gar nicht ausgeführt hatte. Rund 4.000 BTC verließen die Reserve; etwa 602 BTC fehlen noch, Auszahlungen bleiben gestoppt.

Was der Schlüssel abdeckt: drei Ausfälle durch Werte, denen zu viel zugetraut wurde
Was der Schlüssel abdeckt: drei Ausfälle durch Werte, denen zu viel zugetraut wurde — Coin Brief

Bitcoin Core: eine Zahl, die „für immer" heißen sollte. bitcoin-cli -rpcclienttimeout=0 bedeutet laut Dokumentation „kein Timeout" und ist als fünf Jahre umgesetzt. Unter macOS lehnt select() alles über 10^8 Sekunden ab, fünf Jahre sind etwa 1,58 × 10^8 – aus „kein Timeout" wurde „keine Verbindung". Der in den 32.x-Zweig zurückportierte Fix begrenzt die Wartezeit im Socket-Code auf rund 24,8 Tage, einen Wert, den jede Plattform darstellen kann.

Die gemeinsame Lehre. Der Fehler steckte jeweils nicht in der Hauptlogik, sondern in dem, was ein kompakter Wert angeblich mit einschloss: Ein Vertrauensanker enthält den heutigen Root-Schlüssel – nur bis zum Wechsel. Ein Cache-Schlüssel enthält alles, wovon das Ergebnis abhing – nur wenn jedes Feld eindeutig gebunden ist. Eine Sentinel-Zahl bedeutet „unendlich lange" – nur auf Plattformen, die sie annehmen.

Für Betreiber von Krypto-Infrastruktur ist die Checkliste kurz. Jede Stelle finden, an der Software eine eigene Kopie einer externen Vertrauenswurzel mitbringt, und wissen, wer sie aktualisiert. Cache-Schlüssel in Validierungscode wie Konsenscode behandeln und verlangen, dass sie alle Eingaben samt Längen kodieren. Und wo ein „besonderer" Wert für ein Konzept steht – null für unendlich, eine leere Liste für alle –, ihn auf jeder Zielplattform testen. Der Fall Liquid zeigt, was es kostet, wenn die ersten beiden Punkte zusammen mit einer betrieblichen Abkürzung verfehlt werden: einem online gehaltenen Auszahlungsschlüssel ohne Grenze für die Größe einer Auszahlung.

Quellen: go-algorand 5.0.3 — https://github.com/algorand/go-algorand/releases/tag/v5.0.3-stable ; IANA-Vertrauensanker — https://www.iana.org/dnssec/files ; Liquid-Vorfallsanalyse — https://blog.liquid.net/liquid-network-security-incident-assessment/ ; Bitcoin Core PR 36340 — https://github.com/bitcoin/bitcoin/pull/36340

Geschrieben von Victoria Shinder.