Vultisig hat im August seine Apps für Android und iOS angepasst: Nach einer Fehlermeldung, die einen Teilnehmer als böswillig einstuft, werden Signaturen nicht mehr automatisch erneut gestartet. Der von ChainSecurity am 21. Oktober offengelegte Fehler hätte einem Angreifer, der bereits einen Unterzeichner kompromittiert hatte, ermöglichen können, über gezielte Nachrichten und die Auswertung von Fehlermeldungen nach und nach den Schlüsselanteil eines weiteren Teilnehmers zu ermitteln.
Betroffen war das ECDSA-Signaturverfahren. Der Fall zeigt ein Risiko bei Wallets mit mehreren Geräten: Entscheidend ist nicht nur, dass ein privater Schlüssel aufgeteilt wird. Die App muss auch die Kommunikation beenden, wenn die Signaturbibliothek dazu auffordert. Denn selbst wenn ein fehlgeschlagener Versuch keine verwendbare Transaktion erzeugt, können die dabei zurückgegebenen Fehlermeldungen Informationen preisgeben.
Fehlermeldungen könnten interne Protokollgeheimnisse offenlegen
Wallets auf Basis sicherer Mehrparteienberechnung verteilen die Signaturberechtigung auf mehrere Schlüsselanteile. Bei einer regulären Signaturrunde arbeiten die Teilnehmer gemeinsam an einer üblichen Blockchain-Signatur, ohne den vollständigen privaten Schlüssel wiederherzustellen. Bei einer Konfiguration mit zwei Geräten benötigt ein Angreifer, der nur eines davon kontrolliert, normalerweise die Mitwirkung des zweiten Geräts.
Der von ChainSecurity beschriebene Angriff setzt voraus, dass ein Teilnehmer bereits kompromittiert ist. Ein Angreifer könnte dem anderen Teilnehmer wiederholt manipulierte Signaturnachrichten senden und beobachten, ob dieser mit einem Fehler reagiert. Nach Einschätzung der Forscher könnten die Antworten schrittweise Hinweise auf einen wiederverwendbaren internen Protokoll-Seed liefern. Bei fortgesetzter Ausnutzung könnte der Angreifer den Schlüsselanteil des zweiten Teilnehmers und schließlich den vollständigen privaten Schlüssel rekonstruieren.
Der Seed ist ein Geheimnis, das intern vom Protokoll verwendet wird. Die Signaturbibliothek ging davon aus, dass die aufrufende App nach einem schwerwiegenden Fehler weitere Signaturversuche unterbindet, bis der Seed rotiert wurde. Ältere App-Versionen setzten diese Vorgabe nicht durch: Sie zeigten eine allgemeine Fehlermeldung an und konnten es erneut versuchen. Das Problem war also nicht, ob eine einzelne fehlgeschlagene Signatur übertragen werden konnte, sondern ob die App weiter mit einem Teilnehmer kommunizierte, den die Bibliothek als böswillig eingestuft hatte.
August-Updates unterbinden automatische Wiederholungen
Die Entwickler führten die relevanten Änderungen für Android und iOS am 21. August zusammen – rund zwei Monate vor der öffentlichen Offenlegung des Problems. Der ältere Code verglich fehlgeschlagene Signaturen mit erfolgreichen Ergebnissen der Bibliothek, behandelte aber Fehler, mit denen ein böswilliger Teilnehmer gesperrt wird, nicht gesondert. Der Signaturvorgang konnte bis zu dreimal wiederholt werden; Nutzer erhielten dabei lediglich eine allgemeine Fehlermeldung. Daraus lässt sich weder ableiten, wie viele Nachrichten zur Wiederherstellung eines Schlüssels nötig wären, noch wie viele Sitzungen ein Angriff erfordern würde.
Die aktualisierten Apps erkennen die Fehlercodes 100 bis 109 der DKLS-Signaturbibliothek für böswillige Teilnehmer. Das gilt unter anderem für den Sitzungsaufbau, die Nachrichtenverarbeitung und den Abschluss der Signatur. Beide Apps ordnen den markierten Teilnehmer einer Gerätekennung zu, verhindern, dass automatische Wiederholungen den Fehler abfangen, und zeigen eine lokalisierte Warnung an, die zur weiteren Nutzung des Geräts abrät. Die Android-App überspringt außerdem den Wiederherstellungsprozess über das Relay.
Damit unterscheiden die Apps nun zwischen einem gewöhnlichen Signaturfehler und der Einschätzung der Kryptografie-Bibliothek, dass ein Teilnehmer böswillig handelt. Bei vorübergehenden Problemen kann ein neuer Versuch helfen. Setzt die App die Kommunikation jedoch fort, obwohl die Bibliothek zum Abbruch auffordert, könnten weitere Informationen offengelegt werden.
Dokumentiert sind die Änderungen in Android PR #5658 und iOS PR #5235. In den Versionshinweisen ist der 21. August für iOS v1.45.71 und der 25. August für Android v1.0.118 angegeben. Beide Versionen enthalten den Fehlerbehebungs-Patch.
Betroffene Vault-Konfigurationen nicht vollständig geklärt
Vultisig beschreibt zwei Signaturmodelle. Bei einem Fast Vault liegt ein Schlüsselanteil auf dem Gerät des Nutzers, ein weiterer bei VultiServer; beide wirken an der Signatur mit. Bei einem Secure Vault verteilt sich die Signatur auf mindestens zwei Geräte, die der Nutzer kontrolliert. VultiServer ist dabei nicht eingebunden. Beide Modelle nutzen verteilte Signaturen, unterscheiden sich aber in ihren betrieblichen Abhängigkeiten. Zwei Teilnehmer einer einzelnen Signatursitzung bedeuten nicht zwangsläufig, dass der gesamte Vault nur zwei Schlüsselanteile umfasst.
Die veröffentlichte Untersuchung und die App-Unterlagen ordnen die betroffenen Versionen den verschiedenen Vault-Konfigurationen nicht vollständig zu. Nutzer können anhand der verfügbaren Informationen daher nicht genau feststellen, welche Konfigurationen betroffen waren und wie die Updates die unterschiedlichen älteren Versionen abdecken.
In der Sicherheitsdokumentation von Vultisig heißt es, Trail of Bits habe 2024 die DKLS23-Bibliothek von Silence Laboratories geprüft. Prüfberichte zu den mobilen und Desktop-Apps sollten nach ihrer Veröffentlichung bereitgestellt werden. Bei der Offenlegung des Problems erklärte ChainSecurity, weder die Vultisig-Korrektur überprüft noch andere Teile des Protokolls auditiert zu haben. Die Änderungen auf Anwendungsebene waren somit nicht Teil der Prüfung.
Offen bleibt, welche veröffentlichten Versionen und Vault-Konfigurationen betroffen waren und ob die Abbruchbedingung sowohl automatische Wiederholungen als auch manuell neu gestartete Signatursitzungen unterbindet. Im Kern geht es darum, ob die App die Anweisung der Bibliothek, die Kommunikation zu stoppen, während des gesamten Signaturvorgangs konsequent umsetzt.