Vulnerabilidade nas implementacións do algoritmo de cifrado post-cuántico Kyber

Na implementación do algoritmo de cifrado Kyber, que gañou o concurso de algoritmos criptográficos resistentes á forza bruta nun ordenador cuántico, identificouse unha vulnerabilidade que permite aos ataques de canle lateral recrear claves secretas baseándose na medición do tempo de operacións durante o descifrado do texto cifrado proporcionado polo atacante. O problema afecta tanto á implementación de referencia do mecanismo de encapsulación de chaves CRYSTALS-Kyber KEM como a moitas bibliotecas de cifrado de terceiros habilitadas para Kyber, incluída a biblioteca pqcrypto utilizada no mensaxeiro Signal.

A esencia da vulnerabilidade, que recibiu o nome en clave KyberSlash, está no uso da operación de división "t = (((t < 1) + KYBER_Q/2)/KYBER_Q) & 1;" no proceso de decodificación dunha mensaxe , no que o dividendo contén o valor secreto “t” co tipo “double”, e o divisor é o coñecido valor público KYBER_Q. O problema é que o tempo dunha operación de división non é constante, e en diferentes ambientes o número de ciclos de CPU realizados para a división depende dos datos de entrada. Así, en función dos cambios nos tempos de operación, pódese facer unha idea da natureza dos datos utilizados na división.

Daniel J. Bernstein, un coñecido experto no campo da criptografía, puido preparar unha demostración de traballo que demostra que o ataque podería levarse a cabo na práctica. En dous dos tres experimentos realizados, ao executar código na placa Raspberry Pi 2, foi posible recrear completamente a clave privada Kyber-512 baseándose na medición do tempo de decodificación de datos. O método tamén se pode adaptar para as claves Kyber-768 e Kyber-1024. Para levar a cabo un ataque con éxito, é necesario que o texto cifrado especificado polo atacante se procese utilizando o mesmo par de claves e que se poida medir con precisión o tempo de execución da operación.

Nalgunhas bibliotecas identificouse outra fuga (KyberSlash2), que tamén se produce debido ao uso dun valor secreto ao realizar a división. As diferenzas coa primeira opción redúcense á chamada na fase de cifrado (nas funcións poly_compress e polyvec_compress), e non durante o descifrado. Non obstante, a segunda opción pode ser útil para un ataque só nos casos en que o procedemento se utilice en operacións de reencriptación nas que a saída do texto cifrado se considera confidencial.

A vulnerabilidade xa foi corrixida nas bibliotecas:

  • zig/lib/std/crypto/kyber_d00.zig (22 de decembro),
  • pq-crystals/kyber/ref (30 de decembro),
  • symbolicsoft/kyber-k2so (19 de decembro),
  • cloudflare/circl (8 de xaneiro),
  • aws/aws-lc/crypto/kyber (4 de xaneiro),
  • liboqs/src/kem/kyber (8 de xaneiro).

Bibliotecas non afectadas inicialmente pola vulnerabilidade:

  • 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.

A vulnerabilidade segue sen parchear nas bibliotecas:

  • antontutoveanu/crystals-kyber-javascript,
  • Argyle-Software/kyber,
  • debian/src/liboqs/unstable/src/kem/kyber,
  • kudelskisecurity/cristais-go,
  • mupq/pqm4/crypto_kem/kyber* (O 20 de decembro só se corrixiu 1 versión da vulnerabilidade),
  • PQClean/PQClean/crypto_kem/kyber*/aarch64,
  • PQClean/PQClean/crypto_kem/kyber*/clean,
  • randombit/botan (o 20 de decembro só se solucionou 1 vulnerabilidade),
  • rustpq/pqcrypto/pqcrypto-kyber (engadiuse unha corrección a libsignal o 5 de xaneiro, pero a vulnerabilidade aínda non foi corrixida no propio pqcrypto-kyber).

Fonte: opennet.ru

Engadir un comentario