
Liste unsicherer ed25519-Signaturbibliotheken
Eine Liste potenziell unsicherer Ed25519-Signatur-Bibliotheken, die eine öffentliche API bereitstellen, bei der geheimer und öffentlicher Schlüssel unabhängig voneinander als Eingaben für die Signierfunktion angegeben werden können. Eine missbräuchliche Verwendung dieser öffentlichen APIs kann zur Offenlegung des privaten Schlüssels führen.
Die meisten Repositories in unserer Analyse sind in IANIX :: Things that use Ed25519 aufgeführt.
Anzahl betroffener Bibliotheken: 45
Anzahl der Bibliotheken, die das Problem nach der Ankündigung behoben haben: 8
zuletzt aktualisiert: 4. Mai 2023
Beachte, dass EdDSA-Signaturen gemäß der zugehörigen rfc8032 normalerweise deterministisch sind. Für dieselbe zu signierende Eingabenachricht wird also eine eindeutige Signaturausgabe zurückgegeben, die zwei Elemente enthält: einen Kurvenpunkt R und einen Skalar S.
Ein algorithmisches Detail ist, dass der öffentliche Schlüssel des Unterzeichners nur in die deterministische Berechnung des S-Teils der Signatur einfließt, nicht jedoch in den R-Wert. Das bedeutet, dass ein Angreifer, wenn er die Signierfunktion irgendwie als Orakel nutzen könnte (das beliebige öffentliche Schlüssel als Eingaben erwartet), für dieselbe Nachricht zwei Signaturen erhalten könnte, die dasselbe R teilen und sich nur im S-Teil unterscheiden. Wenn dies geschieht, kann man leider leicht den privaten Schlüssel extrahieren; dieser StackOverflow-Beitrag erklärt, warum dies machbar ist.
Öffentliche APIs sollten es daher NICHT erlauben, ein entkoppeltes privates/öffentliches Schlüsselpaar als Signiereingabe zu verwenden. Um dies zu umgehen, speichern viele Implementierungen den öffentlichen Schlüssel zusammen mit dem privaten Schlüssel (oder Seed) und behandeln das gesamte Schlüsselpaar als Geheimnis, ODER sie leiten den öffentlichen Schlüssel innerhalb der Signierfunktion immer neu ab. Leider versäumen es zahlreiche bestehende Bibliotheken, dieses Problem zu beheben, indem sie beliebige öffentliche Schlüssel als Eingaben zulassen, ohne zu prüfen, ob der eingegebene öffentliche Schlüssel zum eingegebenen privaten Schlüssel gehört.
Natürlich bedeutet das nicht, dass alle Anwendungen mit Abhängigkeiten zu diesen Bibliotheken anfällig für Schlüsseloffenlegungsangriffe sind; tatsächlich sind die meisten wahrscheinlich sicher, weil sie die betroffene API ihren Benutzern normalerweise nicht öffentlich zugänglich machen und ihr öffentliches/privates Schlüsselpaar direkt vor dem sign-Aufruf koppeln. Andererseits gibt es selbst dann, wenn diese APIs nicht exponiert sind, Anwendungen mit unterschiedlichen TCB-Bedrohungsmodellstrategien, wie private und öffentliche Schlüssel verwaltet und gespeichert werden. Um diesen Angriff zu verhindern, sollten Entwickler daher auch ein Integritätsschutzprotokoll für die öffentlichen Schlüssel durchsetzen.
Hier listen wir einige betroffene Bibliotheken zusammen mit den zugehörigen Code-Referenzen auf.
Abb. 1. Ein Beispiel für API-Missbrauch in der Rust-Crate ed25519-dalek.