Vulnerabilidade em implementações do algoritmo de criptografia pós-quântica Kyber

Na implementação do algoritmo de criptografia Kyber, que venceu a competição de algoritmos criptográficos resistentes à força bruta em um computador quântico, foi identificada uma vulnerabilidade que permite ataques de canal lateral para recriar chaves secretas com base na medição do tempo de operações durante a descriptografia do texto cifrado fornecido pelo invasor. O problema afeta tanto a implementação de referência do mecanismo de encapsulamento de chave CRYSTALS-Kyber KEM quanto muitas bibliotecas de criptografia de terceiros habilitadas para Kyber, incluindo a biblioteca pqcrypto usada no Signal messenger.

A essência da vulnerabilidade, que recebeu o codinome KyberSlash, está na utilização da operação de divisão “t = (((t < 1) + KYBER_Q/2)/KYBER_Q) & 1;” no processo de decodificação de uma mensagem , em que o dividendo contém o valor secreto “t” do tipo “duplo”, e o divisor é o conhecido valor público KYBER_Q. O problema é que o tempo de uma operação de divisão não é constante e em diferentes ambientes o número de ciclos de CPU realizados para divisão depende dos dados de entrada. Assim, com base nas alterações nos tempos de operação, pode-se ter uma ideia da natureza dos dados utilizados na divisão.

Daniel J. Bernstein, um conhecido especialista na área de criptografia, conseguiu preparar uma demonstração funcional de prova de que o ataque poderia ser realizado na prática. Em dois dos três experimentos realizados, ao executar o código na placa Raspberry Pi 2, foi possível recriar completamente a chave privada Kyber-512 com base na medição do tempo de decodificação dos dados. O método também pode ser adaptado para chaves Kyber-768 e Kyber-1024. Para realizar um ataque com sucesso, é necessário que o texto cifrado especificado pelo atacante seja processado usando o mesmo par de chaves e que o tempo de execução da operação possa ser medido com precisão.

Outro vazamento (KyberSlash2) foi identificado em algumas bibliotecas, o que também ocorre devido ao uso de um valor secreto na realização da divisão. As diferenças da primeira opção se resumem à chamada na fase de criptografia (nas funções poly_compress e polyvec_compress), e não durante a descriptografia. Entretanto, a segunda opção pode ser útil para um ataque apenas nos casos em que o procedimento é utilizado em operações de recriptografia nas quais a saída do texto cifrado é considerada confidencial.

A vulnerabilidade já foi corrigida nas bibliotecas:

  • zig/lib/std/crypto/kyber_d00.zig (22 de dezembro),
  • cristais pq/kyber/ref (30 de dezembro),
  • simbólicosoft/kyber-k2so (19 de dezembro),
  • cloudflare/círculo (8 de janeiro),
  • aws/aws-lc/crypto/kyber (4 de janeiro),
  • liboqs/src/kem/kyber (8 de janeiro).

Bibliotecas não afetadas inicialmente pela vulnerabilidade:

  • chatossl/cripto/kyber,
  • filippo.io/mlkem768,
  • formosa-crypto/libjade/tree/main/src/crypto_kem,
  • kyber/comum/amd64/avx2,
  • formosa-crypto/libjade/tree/main/src/crypto_kem/kyber/common/amd64/ref,
  • cristais pq/kyber/avx2,
  • pqclean/crypto_kem/kyber*/avx2.

A vulnerabilidade permanece sem correção nas bibliotecas:

  • antontutoveanu/cristais-kyber-javascript,
  • Argyle-Software/kyber,
  • debian/src/liboqs/instável/src/kem/kyber,
  • kudelskisecurity/cristais-go,
  • mupq/pqm4/crypto_kem/kyber* (Em 20 de dezembro, apenas 1 versão da vulnerabilidade foi corrigida),
  • PQClean/PQClean/crypto_kem/kyber*/aarch64,
  • PQClean/PQClean/crypto_kem/kyber*/limpo,
  • randombit/botan (em 20 de dezembro, apenas 1 vulnerabilidade foi corrigida),
  • Rustpq/pqcrypto/pqcrypto-kyber (uma correção foi adicionada ao libsignal em 5 de janeiro, mas a vulnerabilidade ainda não foi corrigida no próprio pqcrypto-kyber).

Fonte: opennet.ru

Adicionar um comentário