
List of unsafe ed25519 signature libs
قائمة بمكتبات توقيع ed25519 غير الآمنة احتماليًا والتي توفّر واجهة برمجة تطبيقات عامة يمكن من خلالها تمرير المفتاح السري والمفتاح العام بشكل مستقل كمدخلات لدالة التوقيع. يمكن أن يؤدي سوء استخدام هذه الواجهات العامة إلى كشف المفتاح الخاص.
معظم المستودعات في تحليلنا مدرجة في IANIX :: Things that use Ed25519.
عدد المكتبات المتأثرة: 45
عدد المكتبات التي أصلحت المشكلة بعد الإعلان: 8
آخر تحديث: 4 مايو 2023
لاحظ أنه في الوضع الطبيعي ووفقًا لـ rfc8032 المرتبط بالموضوع، تكون تواقيع EdDSA حتمية، وبالتالي لنفس رسالة الإدخال المراد توقيعها، يتم إرجاع مخرج توقيع فريد يتضمن عنصرين: نقطة منحنى R وكمية قياسية S.
من التفاصيل الخوارزمية أن المفتاح العام للموقّع يشارك فقط في الحساب الحتمي لجزء S من التوقيع، وليس في قيمة R. هذا الأخير يعني أنه إذا تمكن الخصم بطريقة ما من استخدام دالة التوقيع كـ Oracle (يتوقع مفاتيح عامة عشوائية كمدخلات)، فمن الممكن لنفس الرسالة الحصول على توقعين يتشاركان نفس R ويختلفان فقط في جزء S. لسوء الحظ، عند حدوث ذلك، يمكن للمرء بسهولة استخراج المفتاح الخاص؛ هذا منشور StackOverflow يشرح لماذا هذا ممكن.
ومع ذلك، يجب ألا تسمح الواجهات العامة بتمرير زوج مفاتيح خاص/عام منفصل كمدخل توقيع. ولتجنب ذلك، تقوم العديد من التطبيقات بتخزين المفتاح العام مع المفتاح الخاص (أو البذرة) وتعتبر زوج المفاتيح بأكمله هو السر، أو تقوم دائمًا بإعادة اشتقاق المفتاح العام داخل دالة التوقيع. لسوء الحظ، يفشل عدد كبير من المكتبات الموجودة في معالجة هذه المشكلة من خلال السماح بمفاتيح عامة عشوائية كمدخلات دون التحقق مما إذا كان المفتاح العام المُدخل يطابق المفتاح الخاص المُدخل.
بالطبع، هذا لا يعني أن جميع التطبيقات التي تعتمد على هذه المكتبات معرضة لهجمات كشف المفاتيح؛ في الواقع، معظمها آمن على الأرجح بسبب عدم كشف الواجهة المتأثرة عادةً لمستخدميها، وربط زوج المفاتيح العام/الخاص قبل استدعاء sign مباشرة. من ناحية أخرى، حتى عندما لا تكون هذه الواجهات مكشوفة، هناك تطبيقات تستخدم استراتيجيات نماذج تهديد TCB مختلفة حول كيفية إدارة وتخزين المفاتيح الخاصة والعامة. ومع ذلك، لمنع هذا الهجوم، يجب على المطورين أيضًا فرض بروتوكول حماية سلامة للمفاتيح العامة.
هنا، نسرد بعض المكتبات المتأثرة مع المراجع البرمجية ذات الصلة.
الشكل 1. مثال على إساءة استخدام واجهة برمجة التطبيقات في Rust crate باسم ed25519-dalek.
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)
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. تمت معالجة المنطق في هذه القضية: 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)
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 (قام المؤلفون بتعديل الدالة لقبول pk بدلاً من sk الأصلي المكوّن من 64 بايت والخاص بـ nacl والذي يتضمن 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 vanity. على الرغم من أنه يستخدم الواجهة بطريقة غريبة، إلا أن هذا مقصود لأنه يقوم بالفعل بشيء غريب وغير مألوف للغاية فيما يتعلق بتوليد المفاتيح، والمكتبة غير مخصصة للاستخدام في التوقيع.