Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
Tools/GitHubGitHub/mystenlabs/ed25519-unsafe-libs
SchwachstellenanalyseExploitationKryptographiePapers & ForschungLernen & BildungKuratierte Ressourcen
GitHubmystenlabs/ed25519-unsafe-libs

ed25519-unsafe-libs

Liste unsicherer ed25519-Signaturbibliotheken

Repository anzeigen
2503548vor 2 JahrenVon Kitploit geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

ed25519-unsafe-libs

Double Public Key Signing Function Oracle Attack auf Ed25519

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

Proof-of-Concept-Implementierungen, die diesen potenziellen Exploit demonstrieren:

  • Rust: ed25519-chalkias-exploit
  • Python: Ed25519 Vulnerability in Python, Buchanan, William J (2022). Ed25519 Vulnerability in Python (Recovering Private Key). Asecuritysite.com.

Vorträge:

  • Eingeladener Vortrag beim Crypto Reading Club des US-amerikanischen National Institute of Standards and Technology (NIST): Folien – Taming the Many EdDSAs (Seiten 28–39), Konstantinos Chalkias, François Garillot, Valeria Nikolaenko (2023). Taming the Many EdDSAs & Ed25519 Signing Attacks.

Nachrichten- und Social-Media-Berichterstattung zu diesem Angriff

  • NIST Crypto Reading Club „Taming the Many EdDSAs" (8. März 2023)
  • The Daily Swig „Dozens of cryptography libraries vulnerable to private key theft" (28. Juni 2022)
  • Risky Biz News „New crypto vulnerability: Tens of cryptography libraries have misimplemented the Ed25519 digital signature algorithm" (28. Juni 2022)
  • SafeHeron-Blogbeitrag „Analysis on Ed25519 Use Risks: Your Wallet Private Key Can Be Stolen" (17. Juni 2022)
  • kryptera.se „Vulnerability in most ed25519 libraries" (auf Schwedisch) (29. Juni 2022)
  • Difesa e Sicurezza und Yoroi „Librerie crittografiche ed25519 potenzialmente non sicure" (auf Italienisch) (1. Juli und 29. Juni 2022)
  • Medium-Beitrag von Prof. Bill Buchanan OBE „Ed25519 is Great, But ..." (1. Juli 2022)
  • Reddit r/crypto (bester Beitrag des Monats – 18. Juni 2022)
  • Reddit r/cryptography (17. Juni 2022)
  • Interessante Tweets:
    • Tweet 1 (von Kostas Kryptos – „The original 26 vulnerable libs")
    • Tweet 2 (von Kostas Kryptos – „Aftermath of the 40 vulnerable libs")
    • Tweet 3 (von Catalin Cimpanu – „40 cryptography libraries are impacted by same Ed25519 misimplementation")

Worum geht es?

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.

Ed25519 API-Missbrauch, der zur Schlüsselextraktion führt Abb. 1. Ein Beispiel für API-Missbrauch in der Rust-Crate ed25519-dalek.

Betroffene Bibliotheken

  • C: OpenGNB
    https://github.com/gnbdev/opengnb/blob/master/libs/ed25519/sign.c#L7

  • C: GNU Nettle
    https://github.com/gnutls/nettle/blob/fe7ae87d1b837e82f7c7968b068bca7d853a4cec/ed25519-sha512-sign.c#L43

  • ASM/C: iroha-ed25519 (Hyperledger Project)
    https://github.com/hyperledger/iroha-ed25519/blob/main/lib/ed25519/ref10/ed25519.c#L27 und https://github.com/hyperledger/iroha-ed25519/blob/main/lib/ed25519/amd64-64-24k-pic/ed25519.c#L30

  • C: ed25519-donna (Andrew Moon)
    https://github.com/floodyberry/ed25519-donna/blob/master/ed25519.c#L59

  • C: ed25519 (Orson Peters)
    https://github.com/orlp/ed25519/blob/master/src/sign.c#L7

  • C: libbrine (Kevin Smith)
    https://github.com/kevsmith/libbrine/blob/master/src/ed25519/sign.c#L7

  • C++: Ed25519 (ArduinoLibs)
    https://rweather.github.io/arduinolibs/classEd25519.html#a36ecf67b4c5d2d39a31888f56af1f8a5

  • C#: ed25519 (Hans Wolff)
    https://github.com/hanswolff/ed25519/blob/master/Ed25519/Ed25519.cs#L146

  • C#: Ed25519 (CryptoManiac)
    https://github.com/CryptoManiac/Ed25519/blob/972829ac688847895d5105f19ca1e5777131b421/Chaos.NaCl/Internal/Ed25519Ref10/keypair.cs#L7

  • Dart: ed25519_dart (Oleksii Semeshchuk)
    https://github.com/semolex/ed25519_dart/blob/master/lib/src/ed25519_dart_base.dart#L200

Behobene Bibliotheken

  • C: Trezor Firmware
    Behoben in diesem PR: https://github.com/trezor/trezor-firmware/pull/2349 (Fix eingefügt am 27. Juni 2022)

  • Java: ed25519-elisabeth (Jack Grigg)
    Behoben in diesem Commit: https://github.com/cryptography-cafe/ed25519-elisabeth/commit/49545ce47d550fed807522dff86546c812ccbbac (Fix eingefügt am 19. Juni 2022)

  • C: Harbour (Viktor Szakats)
    Behoben in diesem Commit: https://github.com/vszakats/hb/commit/bae610b63d35c6c1793d94a3bf9467c3b1eded18 (Fix eingefügt am 30. Juni 2022)

  • Rust/Wasm: polkadot-js/wasm
    Behoben in diesem PR: https://github.com/polkadot-js/wasm/pull/381/files (Fix eingefügt am 3. Juli 2022)

  • C: horse25519 (Yawning Angel)
    Behoben in diesem PR: https://github.com/Yawning/horse25519/pull/3 (Fix eingefügt am 15. August 2022)

  • Erlang: erlang-libdecaf
    Behoben in diesem Commit: https://github.com/potatosalad/erlang-libdecaf/commit/16ba07ea122660e95f6cfa9107e28ed58bada713. Die Logik wird in diesem Issue behandelt: ed25519-unsafe-libs/issues/7 (Fix eingefügt am 28. August 2022)

  • Rust: ed25519-dalek (Isis Agora Lovecruft)
    Behoben in diesem PR: https://github.com/dalek-cryptography/ed25519-dalek/pull/205 (Fix eingefügt am 22. Oktober 2022)

  • C: Monocypher (Loup Vaillant)
    Behoben in diesem Commit: https://github.com/LoupVaillant/Monocypher/commit/da7b5407d20329f21a53ea993f516fb55e2f5e26 (Fix eingefügt am 27. Februar 2023)

Falschmeldungen (wahrscheinlich sicher)

Bibliotheken, die ursprünglich als verwundbar gemeldet wurden, aber aufgrund von Community-Feedback von der Liste entfernt wurden.

  • Go: threshold-ed25519 — Threshold Signatures using Ed25519
    https://gitlab.com/unit410/threshold-ed25519/-/blob/main/pkg/ed25519.go#L161 -> siehe Bericht https://github.com/MystenLabs/ed25519-unsafe-libs/pull/9 (gemeldet am 27. Okt. 2022 von nitronit)
Tool herunterladen
  • Tweet 4 (von Kenny Paterson – „Potential for widespread EdDSA private key recovery, cf. http://kopenpgp.com where same vector exploited in OpenPGP libs")
  • Tweet 5 (von Steven Galbraith – „A hazard for deterministic signatures: better check it is the correct public key!")
  • Tweet 6 (von Riyaz Faizullabhoy – „If you’re using EdDSA in prod please take a look")
  • Tweet 7 (von Bart Preneel – „Reminder that implementing cryptographic algorithms securely and correctly is hard").
  • CTF-Herausforderungen (Capture the Flag), die diesen Angriff thematisieren:
    • ImaginaryCTF - JWT25519 (200 Pkt.) (30. Juni 2022)
  • Dart: riclava_ed25519 (riclava)
    https://github.com/riclava/ed25519/blob/master/lib/ed25519.dart#L125

  • Clojure: ed25519 (Kevin Downey)
    https://github.com/hiredman/ed25519/blob/master/src/ed25519/core.clj#L168

  • Haskell: hs-scraps (Vincent Hanquez)
    https://github.com/vincenthz/hs-scraps/blob/master/Crypto/Signature/Ed25519.hs#L115

  • Java: ed25519-java (k3d3)
    https://github.com/k3d3/ed25519-java/blob/master/ed25519.java#L144

  • Java: ed25519 (Bjorn Arnelid)
    https://github.com/BjornArnelid/ed25519/blob/master/src/ed25519/application/Ed25519.java#L32

  • Java: Punisher.NaCl (Arpan Jati)
    https://github.com/arpanj/Punisher.NaCl/blob/c9619ca3028b90d0556c0473e4eba1d429a3744c/Punisher.NaCl/src/Punisher/NaCl/Ed25519Operations.java#L72

  • Java: ED25519 (Mick Michalski)
    https://github.com/michami/ED25519/blob/master/ED25519.java#L60

  • Java: vRallev/ECC-25519 (Ralf Wondratschek)
    https://github.com/vRallev/ECC-25519/blob/master/ECC-25519-Java/src/main/java/net/vrallev/java/ecc/Ecc25519Helper.java#L102

  • Perl: Crypt::Ed25519 (Marc Lehmann)
    https://metacpan.org/release/MLEHMANN/Crypt-Ed25519-0.9/view/Ed25519.pm#$signature-=-Crypt::Ed25519::sign-$message,-$public_key,-$private_key

  • Python: ed25519.py (Autoren von Ed25519)
    https://ed25519.cr.yp.to/python/ed25519.py

  • Python: ed25519 (Python Cryptographic Authority)
    https://github.com/pyca/ed25519/blob/main/ed25519.py#L243 (Die Autoren erwähnen, dass es ohnehin nicht gegen Seitenkanäle sicher ist)

  • Python: python-pure25519 (Brian Warner)
    https://github.com/warner/python-pure25519/blob/master/pure25519/eddsa.py#L21

  • Python: nmed25519 (naturalmessage)
    https://github.com/naturalmessage/nmed25519/blob/master/nmed25519.py#L150

  • Python: ed25519.py (Shiho Midorikawa)
    https://gist.github.com/elliptic-shiho/f41fd75cc30646a61d7ad63043fdd56e#file-ed25519-py-L77

  • Python: Bindings für ed25519-dalek: py-ed25519-bindings
    https://github.com/polkascan/py-ed25519-bindings/blob/master/src/lib.rs#L111

  • Swift: ed25519swift (pebble8888)
    https://github.com/pebble8888/ed25519swift/blob/master/Ed25519ref/ed25519s.swift#L120

  • JS: supercop.js (1p6 Flynx)
    https://github.com/1p6/supercop.js/blob/master/index.js#L29

  • JS: substack/ed25519-supercop (James Halliday)
    https://github.com/substack/ed25519-supercop/blob/master/index.js#L3

  • C: libeddsa (Philipp Lay)
    https://github.com/phlay/libeddsa/blob/master/lib/ed25519-sha512.c#L85

  • C#: SommerEngineering/Ed25519 (Thorsten Sommer)
    https://github.com/SommerEngineering/Ed25519/blob/master/Ed25519/Signer.cs#L80

  • CUDA: ChorusOne/solanity
    https://github.com/ChorusOne/solanity/blob/master/src/cuda-ecc-ed25519/sign.cu#L10

  • C: ncme/c25519 (Daniel Beer und Nikolas Rösener)
    https://github.com/ncme/c25519/blob/master/src/edsign.c#L115

  • C: luazen (Phil Leblanc)
    https://github.com/philanc/luazen/blob/master/src/x25519.c#L508 (Die Autoren haben die Funktion so geändert, dass sie pk akzeptiert, anstelle des ursprünglichen 64-Byte-sk von NaCl, das pk als letzte 32 Bytes enthält)

  • C++: amber (Pelayo Bernedo)
    https://github.com/bernedogit/amber/blob/master/src/group25519.cpp#L1661

  • C: FLD ECC AVX2 (Armando Faz-Hernández und Julio López und Ricardo Dahab)
    https://github.com/armfazh/fld-ecc-vec/blob/master/src/sign255.c#L391

  • Elixir: mwmiller/ed25519_ex (Matt Miller)
    https://github.com/mwmiller/ed25519_ex/blob/master/lib/ed25519.ex#L146(Der öffentliche Schlüssel ist optional. Laut Kommentar des Autors: Wenn nur der geheime Schlüssel angegeben wird, wird der öffentliche Schlüssel daraus abgeleitet. Dies verursacht erheblichen Mehraufwand)

  • PHP (C-Wrapper): php-ed25519-ext
    https://github.com/encedo/php-ed25519-ext/blob/master/ed25519-ext.c#L93

  • Nim: niv/ed25519.nim (Bernhard Stöckner)
    https://github.com/niv/ed25519.nim/blob/master/ed25519.nim#L26

  • TypeScript: mipher (Marco Paland)
    https://github.com/mpaland/mipher/blob/master/src/x25519.ts#L936

  • Lua: LuaMonocypher
    https://github.com/philanc/luamonocypher/blob/main/src/luamonocypher.c#L268

  • Crystal: monocypher.cr
    https://github.com/konovod/monocypher.cr/blob/master/src/monocypher.cr#L39

  • Python: py_ssh_keygen_ed25519 (Péter Szabó)
    https://github.com/pts/py_ssh_keygen_ed25519/blob/master/ed25519_compact.py#L128 (Der öffentliche Schlüssel ist optional)

  • JavaScript: KinomaJS
    https://github.com/Kinoma/kinomajs/blob/701879d37e7fe5001420e0053cd60df6b91e4553/xs6/extensions/crypt/crypt_ed25519.js#L92 (Der öffentliche Schlüssel ist optional)

  • Haskell: gen-ed25-keypair
    https://github.com/awakesecurity/gen-ed25-keypair

  • C: horse25519 (Yawning Angel)
    https://github.com/Yawning/horse25519/blob/master/src/ref10/sign.c#L7 Hinweis: Dieses Repo enthält eine Kopie von djbs ref10-ed25519-Implementierung, die aus supercop übernommen wurde, um keine weitere Abhängigkeit einziehen zu müssen; die Absicht ist jedoch, ein eigenständiges ausführbares Programm bereitzustellen, das eine Ed25519-Vanity-Schlüsselpaar-Erzeugung durchführt. Obwohl die API auf ungewöhnliche Weise verwendet wird, ist dies beabsichtigt, da ohnehin etwas äußerst Exotisches und Ungewöhnliches in Bezug auf die Schlüsselerzeugung durchgeführt wird und die Bibliothek nicht für die Signierung gedacht ist.