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