In der Implementierung des Kyber-Verschlüsselungsalgorithmus, der den Wettbewerb um kryptografische Algorithmen gewonnen hat, die resistent gegen Angriffe mit Quantencomputern sind, wurde eine Schwachstelle entdeckt. Diese erlaubt Angriffe über seitliche Kanäle, um geheime Schlüssel zu rekonstruieren, basierend auf der Messung der Zeit, die für die Entschlüsselung des vom Angreifer bereitgestellten Chiffretexts benötigt wird. Das Problem betrifft sowohl die Referenzimplementierung des Mechanismus zur Schlüsselinkapselung CRYSTALS-Kyber KEM als auch viele externe Verschlüsselungsbibliotheken, die Kyber unterstützen, einschließlich der pqcrypto-Bibliothek, die im Messenger Signal verwendet wird.
Die Schwachstelle mit dem Codenamen KyberSlash beruht auf der Verarbeitung beim Dekodieren der Berechnung "t = (((t < 1) + KYBER_Q/2)/KYBER_Q) & 1;", bei der der Dividend den geheimen Wert "t" vom Typ "double" enthält, während der Divisor den allgemein bekannten öffentlichen Wert KYBER_Q darstellt. Das Problem besteht darin, dass die Zeit für die Division keine Konstante ist und in unterschiedlichen Kontexten die Anzahl der CPU-Schleifen, die für die Division benötigt werden, von den Eingabewerten abhängt. Daher kann anhand der Variationen in der Ausführungszeit eine Vorstellung von der Art der beim Teilen verwendeten Daten gewonnen werden.
Daniel J. Bernstein, ein bekannter Experte für Kryptographie, konnte eine funktionierende Demonstration eines Angriffs in der Praxis vorbereiten. In zwei von drei durchgeführten Experimenten gelang es, den geheimen Schlüssel Kyber-512 vollständig wiederherzustellen, indem die Dekodierungszeit der Daten auf einem Raspberry Pi 2 gemessen wurde. Diese Methode kann auch für die Schlüssel Kyber-768 und Kyber-1024 angepasst werden. Für den erfolgreichen Angriff ist es erforderlich, dass der vom Angreifer festgelegte Ciphertext mit demselben Schlüsselpaar verarbeitet wird und die Zeit der Operation genau gemessen werden kann.
In einigen Bibliotheken wurde eine weitere Schwachstelle (KyberSlash2) entdeckt, die ebenfalls durch die Verwendung eines geheimen Wertes bei der Division entsteht. Der Unterschied zur ersten Variante liegt im Aufruf während der Verschlüsselung (in den Funktionen poly_compress und polyvec_compress) und nicht während der Entschlüsselung. Diese zweite Variante kann jedoch nur dann nützlich sein, wenn die Prozedur in Rekryptographierungsvorgängen verwendet wird, in denen der Output des verschlüsselten Textes als vertraulich betrachtet wird.
Die Vulnerabilität wurde bereits in folgenden Bibliotheken behoben:
- zig/lib/std/crypto/kyber_d00.zig (22. Dezember),
- pq-crystals/kyber/ref (30. Dezember),
- symbolicsoft/kyber-k2so (19. Dezember),
- cloudflare/circl (8. Januar),
- aws/aws-lc/crypto/kyber (4. Januar),
- liboqs/src/kem/kyber (8. Januar).
Bibliotheken, die ursprünglich nicht von der Schwachstelle betroffen sind:
- boringssl/crypto/kyber,
- filippo.io/mlkem768,
- formosa-crypto/libjade/tree/main/src/crypto_kem,
- kyber/common/amd64/avx2,
- formosa-crypto/libjade/tree/main/src/crypto_kem/kyber/common/amd64/ref,
- pq-crystals/kyber/avx2,
- pqclean/crypto_kem/kyber*/avx2.
Die Schwachstelle bleibt in folgenden Bibliotheken unbehoben:
- antontutoveanu/crystals-kyber-javascript,
- Argyle-Software/kyber,
- debian/src/liboqs/unstable/src/kem/kyber,
- kudelskisecurity/crystals-go,
- mupq/pqm4/crypto_kem/kyber* (20. Dezember wurde nur eine Variante der Schwachstelle behoben),
- PQClean/PQClean/crypto_kem/kyber*/aarch64,
- PQClean/PQClean/crypto_kem/kyber*/clean,
- randombit/botan (am 20. Dezember wurde nur eine Variante der Schwachstelle korrigiert),
- rustpq/pqcrypto/pqcrypto-kyber (am 5. Januar wurde die Korrektur in libsignal hinzugefügt, jedoch ist die Schwachstelle in pqcrypto-kyber noch nicht behoben).
Quelle: opennet.ru
