Vulnerabilidad en implementaciones del algoritmo de cifrado poscuántico Kyber

En la implementación del algoritmo de cifrado Kyber, que ganó el concurso de algoritmos criptográficos resistentes a la fuerza bruta en una computadora cuántica, se identificó una vulnerabilidad que permite que ataques de canal lateral recreen claves secretas basadas en la medición del tiempo de las operaciones durante el descifrado del Texto cifrado proporcionado por el atacante. El 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 habilitadas para Kyber, incluida la biblioteca pqcrypto utilizada en Signal Messenger.

La esencia de la vulnerabilidad, que recibió el nombre clave KyberSlash, está en el uso de la operación de división “t = (((t < 1) + KYBER_Q/2)/KYBER_Q) & 1;” en el proceso de decodificación de un mensaje. , en el que el dividendo contiene el valor secreto “t” de tipo “doble”, y el divisor es el conocido valor público KYBER_Q. El problema es que el tiempo de una operación de división no es constante y, en diferentes entornos, el número de ciclos de CPU realizados para la división depende de los datos de entrada. Así, a partir de los cambios en los tiempos de operación, uno puede hacerse una idea de la naturaleza de los datos utilizados en la división.

Daniel J. Bernstein, un conocido experto en el campo de la criptografía, pudo preparar una demostración práctica de que el ataque podía llevarse a cabo en la práctica. En dos de los tres experimentos realizados, al ejecutar código en la placa Raspberry Pi 2, fue posible recrear completamente la clave privada Kyber-512 basándose en la medición del tiempo de decodificación de datos. El método también se puede adaptar para claves Kyber-768 y Kyber-1024. Para llevar a cabo un ataque con éxito, es necesario que el texto cifrado especificado por el atacante se procese utilizando el mismo par de claves y que el tiempo de ejecución de la operación pueda medirse con precisión.

Se ha identificado otra fuga (KyberSlash2) en algunas bibliotecas, que también ocurre por el uso de un valor secreto al realizar la división. Las diferencias con la primera opción se reducen a la llamada en la etapa de cifrado (en las funciones poly_compress y polyvec_compress), y no durante el descifrado. Sin embargo, la segunda opción puede ser útil para un ataque sólo en los casos en que el procedimiento se utiliza en operaciones de recifrado en las que la salida del texto cifrado se considera confidencial.

La vulnerabilidad ya ha sido solucionada en las bibliotecas:

  • zig/lib/std/crypto/kyber_d00.zig (22 de diciembre),
  • pq-crystals/kyber/ref (30 de diciembre),
  • simbólicosoft/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 inicialmente no se vieron afectadas por la vulnerabilidad:

  • aburridossl/crypto/kyber,
  • filippo.io/mlkem768,
  • formosa-crypto/libjade/tree/main/src/crypto_kem,
  • kyber/común/amd64/avx2,
  • formosa-crypto/libjade/tree/main/src/crypto_kem/kyber/common/amd64/ref,
  • pq-cristales/kyber/avx2,
  • pqclean/crypto_kem/kyber*/avx2.

La vulnerabilidad permanece sin parchear en las bibliotecas:

  • antontutoveanu/cristales-kyber-javascript,
  • Argyle-Software/kyber,
  • debian/src/liboqs/unstable/src/kem/kyber,
  • kudelskiseguridad/cristales-go,
  • mupq/pqm4/crypto_kem/kyber* (El 20 de diciembre, solo se solucionó 1 versión de la vulnerabilidad),
  • PQClean/PQClean/crypto_kem/kyber*/aarch64,
  • PQClean/PQClean/crypto_kem/kyber*/limpiar,
  • randombit/botan (El 20 de diciembre, solo se solucionó 1 vulnerabilidad),
  • Rustpq/pqcrypto/pqcrypto-kyber (se agregó una solución a libsignal el 5 de enero, pero la vulnerabilidad aún no se ha solucionado en pqcrypto-kyber).

Fuente: opennet.ru

Añadir un comentario