
List of unsafe ed25519 signature libs
एड25519 सिग्नेचर लाइब्रेरियों की एक सूची जो एक सार्वजनिक API की अनुमति देती हैं जहाँ गुप्त और सार्वजनिक कुंजी को साइनिंग फंक्शन इनपुट के रूप में स्वतंत्र रूप से प्रदान किया जा सकता है। इन सार्वजनिक APIs के दुरुपयोग से प्राइवेट की उजागर हो सकती है।
हमारे विश्लेषण में अधिकांश रिपॉजिटरी IANIX :: Things that use Ed25519 में सूचीबद्ध हैं।
प्रभावित लाइब्रेरियों की संख्या: 45
घोषणा के बाद समस्या ठीक करने वाली लाइब्रेरियों की संख्या: 8
अंतिम अद्यतन: मई 04, 2023
ध्यान दें कि सामान्य रूप से और संबंधित rfc8032 के अनुसार, EdDSA हस्ताक्षर नियतात्मक (deterministic) होते हैं, और इस प्रकार हस्ताक्षर किए जाने वाले समान इनपुट संदेश के लिए, एक अद्वितीय हस्ताक्षर आउटपुट लौटाया जाता है जिसमें दो तत्व शामिल होते हैं: एक वक्र बिंदु R और एक स्केलर S।
एक एल्गोरिथ्मिक विवरण यह है कि हस्ताक्षरकर्ता की सार्वजनिक कुंजी केवल हस्ताक्षर के S भाग की नियतात्मक गणना में शामिल होती है, लेकिन R मान में नहीं। बाद का तात्पर्य है कि यदि कोई प्रतिद्वंद्वी किसी तरह साइनिंग फंक्शन को Oracle के रूप में उपयोग कर सकता है (जो इनपुट के रूप में मनमानी सार्वजनिक कुंजियों की अपेक्षा करता है), तो यह संभव है कि समान संदेश के लिए दो हस्ताक्षर प्राप्त हों जो समान R साझा करते हैं और केवल S भाग में भिन्न होते हैं। दुर्भाग्यवश, जब ऐसा होता है, तो कोई भी आसानी से प्राइवेट की निकाल सकता है; यह StackOverflow पोस्ट पोस्ट बताती है कि यह क्यों संभव है।
यह कहने के बाद, सार्वजनिक APIs को साइनिंग इनपुट के रूप में एक अलग किए गए प्राइवेट/पब्लिक की-पेयर की अनुमति नहीं देनी चाहिए। इससे बचने के लिए, कई कार्यान्वयन सार्वजनिक कुंजी को प्राइवेट की (या सीड) के साथ संग्रहीत करते हैं और पूरे की-पेयर को गुप्त मानते हैं, या वे हमेशा साइनिंग फंक्शन के अंदर सार्वजनिक कुंजी को पुनः व्युत्पन्न (re-derive) करते हैं। दुर्भाग्यवश, बड़ी संख्या में मौजूदा लाइब्रेरियाँ इनपुट सार्वजनिक कुंजी को इनपुट प्राइवेट की के अनुरूप होने की जाँच किए बिना मनमानी सार्वजनिक कुंजियों को इनपुट के रूप में अनुमति देकर इस समस्या का समाधान नहीं कर पाती हैं।
बेशक, इसका मतलब यह नहीं है कि इन लाइब्रेरियों पर निर्भर सभी एप्लिकेशन कुंजी एक्सपोज़र हमलों के प्रति संवेदनशील हैं; वास्तव में, अधिकांश शायद सुरक्षित हैं क्योंकि वे आमतौर पर प्रभावित API को अपने उपयोगकर्ताओं के लिए सार्वजनिक रूप से उजागर नहीं करते हैं और sign कॉल से ठीक पहले अपने पब/प्राइवेट की-पेयर को जोड़ते हैं। दूसरी ओर, भले ही ये APIs उजागर न हों, ऐसे एप्लिकेशन हैं जिनमें प्राइवेट और पब्लिक की को प्रबंधित और संग्रहीत करने के तरीके के बारे में अलग-अलग TCB थ्रेट मॉडल रणनीतियाँ होती हैं। फिर भी, इस हमले को रोकने के लिए, डेवलपर्स को सार्वजनिक कुंजियों के लिए भी एक अखंडता संरक्षण प्रोटोकॉल लागू करना चाहिए।
चित्र 1. ed25519-dalek Rust crate में API दुरुपयोग का एक उदाहरण।
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
और
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
C: Trezor firmware
इस PR में ठीक किया गया: https://github.com/trezor/trezor-firmware/pull/2349 (फिक्स 27 जून, 2022 को मर्ज किया गया)
Java: ed25519-elisabeth (Jack Grigg)
इस commit में ठीक किया गया: https://github.com/cryptography-cafe/ed25519-elisabeth/commit/49545ce47d550fed807522dff86546c812ccbbac (फिक्स 19 जून, 2022 को मर्ज किया गया)
C: Harbour (Viktor Szakats)
इस commit में ठीक किया गया: https://github.com/vszakats/hb/commit/bae610b63d35c6c1793d94a3bf9467c3b1eded18 (फिक्स 30 जून, 2022 को मर्ज किया गया)
Rust/Wasm: polkadot-js/wasm
इस PR में ठीक किया गया: https://github.com/polkadot-js/wasm/pull/381/files (फिक्स 3 जुलाई, 2022 को मर्ज किया गया)
C: horse25519 (Yawning Angel)
इस PR में ठीक किया गया: https://github.com/Yawning/horse25519/pull/3 (फिक्स 15 अगस्त, 2022 को मर्ज किया गया)
Erlang: erlang-libdecaf
इस commit में ठीक किया गया: https://github.com/potatosalad/erlang-libdecaf/commit/16ba07ea122660e95f6cfa9107e28ed58bada713. इस issue में तर्क संबोधित किया गया: ed25519-unsafe-libs/issues/7 (फिक्स 28 अगस्त, 2022 को मर्ज किया गया)
Rust: ed25519-dalek (Isis Agora Lovecruft)
इस PR में ठीक किया गया: https://github.com/dalek-cryptography/ed25519-dalek/pull/205 (फिक्स 22 अक्टूबर, 2022 को मर्ज किया गया)
C: Monocypher (Loup Vaillant)
इस commit में ठीक किया गया: https://github.com/LoupVaillant/Monocypher/commit/da7b5407d20329f21a53ea993f516fb55e2f5e26 (फिक्स 27 फरवरी, 2023 को मर्ज किया गया)
मूल रूप से संवेदनशील के रूप में रिपोर्ट की गई लाइब्रेरियाँ, लेकिन समुदाय की प्रतिक्रिया के आधार पर सूची से हटा दी गईं।
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 (Ed25519 authors)
https://ed25519.cr.yp.to/python/ed25519.py
Python: ed25519 (Python Cryptographic Authority)
https://github.com/pyca/ed25519/blob/main/ed25519.py#L243
(लेखक बताते हैं कि यह वैसे भी साइड चैनलों के विरुद्ध असुरक्षित है)
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: 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 and 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 (लेखकों ने फ़ंक्शन को संशोधित करके मूल nacl 64-बाइट sk के बजाय pk स्वीकार किया, जिसमें pk अंतिम 32 बाइट्स के रूप में शामिल होता है)
C++: amber (Pelayo Bernedo)
https://github.com/bernedogit/amber/blob/master/src/group25519.cpp#L1661
C: FLD ECC AVX2 (Armando Faz-Hern'{a}ndez and Julio L'{o}pez and 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(पब्लिक की वैकल्पिक है। लेखक की टिप्पणी के अनुसार: यदि केवल गुप्त कुंजी प्रदान की जाती है, तो पब्लिक की उससे व्युत्पन्न की जाएगी। यह महत्वपूर्ण ओवरहेड जोड़ता है)
PHP (C रैपर): 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 (पब्लिक की वैकल्पिक है)
Javascript: KinomaJS
https://github.com/Kinoma/kinomajs/blob/701879d37e7fe5001420e0053cd60df6b91e4553/xs6/extensions/crypt/crypt_ed25519.js#L92 (पब्लिक की वैकल्पिक है)
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 नोट: इस रिपॉजिटरी में djb के ref10 ed25519 कार्यान्वयन की एक प्रति शामिल है जिसे किसी अन्य निर्भरता को शामिल करने से बचने के लिए supercop से लिया गया है, लेकिन इरादा एक स्टैंडअलोन निष्पादन योग्य प्रदान करना है जो ed25519 वैनिटी कीपेयर जनरेशन करता है। हालाँकि यह API को एक अजीब तरीके से उपयोग करता है, यह जानबूझकर है क्योंकि यह पहले से ही कुंजी जनरेशन के संबंध में अत्यंत असामान्य और विदेशी कुछ कर रहा है और यह लाइब्रेरी हस्ताक्षर करने के लिए उपयोग किए जाने के लिए नहीं है।