En la implementación del algoritmo de cifrado Kyber, ganador del concurso de criptografía resistente a ataques en computadoras cuánticas, se ha identificado una vulnerabilidad que permite realizar ataques a través de canales laterales para recrear claves secretas basándose en la medición del tiempo de las operaciones durante la descifrado del texto cifrado proporcionado por el atacante. Este problema afecta tanto a la implementación de referencia del mecanismo de encapsulación de claves CRYSTALS-Kyber KEM como a muchas bibliotecas de cifrado de terceros que soportan Kyber, incluida la biblioteca pqcrypto utilizada en el mensajero Signal.
La esencia de la vulnerabilidad, que ha recibido el nombre en código KyberSlash, radica en el uso durante el proceso de decodificación del mensaje de la operación de división «t = (((t < 1) + KYBER_Q/2)/KYBER_Q) & 1;», donde el dividendo contiene el valor secreto «t» de tipo «double», y el divisor es el conocido valor público KYBER_Q. El problema es que el tiempo de la operación de división no es constante y, en diferentes entornos, el número de ciclos de CPU requeridos para realizar la división depende de los datos de entrada. Así, basándose en la variación del tiempo de las operaciones, se puede obtener información sobre la naturaleza de los datos utilizados en la división.
Daniel Bernstein, un reconocido experto en criptografía, logró preparar una demostración funcional que prueba la posibilidad de llevar a cabo un ataque en la práctica. En dos de los tres experimentos realizados al ejecutar el código en una placa Raspberry Pi 2, se logró recrear completamente la clave privada Kyber-512 basándose en la medición del tiempo de descifrado de los datos. El método también puede adaptarse para las claves Kyber-768 y Kyber-1024. Para llevar a cabo con éxito un ataque, es necesario que el texto cifrado proporcionado por el atacante se procese utilizando el mismo par de claves y que se pueda medir con precisión el tiempo de ejecución de la operación.
En algunas bibliotecas se ha encontrado otra fuga (KyberSlash2), que también surge del uso de un valor secreto durante la división. Las diferencias con la primera variante se reducen a la llamada en la etapa de cifrado (en las funciones poly_compress y polyvec_compress), y no durante la descifrado. Sin embargo, la segunda variante puede ser útil para un ataque solo en casos donde se utiliza el procedimiento en operaciones de re-cifrado, en las que la salida de texto cifrado se considera confidencial.
La vulnerabilidad ya ha sido corregida en las bibliotecas:
- zig/lib/std/crypto/kyber_d00.zig (22 de diciembre),
- pq-crystals/kyber/ref (30 de diciembre),
- symbolicsoft/kyber-k2so (19 de diciembre),
- cloudflare/circl (8 de enero),
- aws/aws-lc/crypto/kyber (4 de enero),
- liboqs/src/kem/kyber (8 de enero).
Bibliotecas que no estaban originalmente expuestas a la vulnerabilidad:
- 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.
La vulnerabilidad aún no se ha solucionado en las bibliotecas:
- antontutoveanu/crystals-kyber-javascript,
- Argyle-Software/kyber,
- debian/src/liboqs/unstable/src/kem/kyber,
- kudelskisecurity/crystals-go,
- mupq/pqm4/crypto_kem/kyber* (el 20 de diciembre se corrigió solo 1 variante de la vulnerabilidad),
- PQClean/PQClean/crypto_kem/kyber*/aarch64,
- PQClean/PQClean/crypto_kem/kyber*/clean,
- randombit/botan (el 20 de diciembre se corrigió solo 1 variante de la vulnerabilidad),
- rustpq/pqcrypto/pqcrypto-kyber (el 5 de enero se añadió una corrección a libsignal, pero la vulnerabilidad en pqcrypto-kyber aún no se ha solucionado).
Fuente: opennet.ru
