Na implementação do algoritmo de criptografia Kyber, vencedor do concurso de criptografia resistente a ataques de computadores quânticos, foi identificada uma vulnerabilidade que permite a realização de ataques por canais laterais para a reconstrução de chaves secretas com base na medição do tempo das operações durante a descriptografia do texto cifrado fornecido pelo atacante. O problema afeta tanto a implementação de referência do mecanismo de encapsulamento de chaves CRYSTALS-Kyber KEM quanto muitas bibliotecas de criptografia de terceiros que suportam Kyber, incluindo a biblioteca pqcrypto utilizada no mensageiro Signal.
A essência da vulnerabilidade, que recebeu o nome de código KyberSlash, está no uso, durante o processo de decodificação da mensagem, da operação de divisão «t = (((t < 1) + KYBER_Q/2)/KYBER_Q) & 1;», onde o dividendo contém o valor secreto «t» do tipo «double» e o divisor é o valor público conhecido KYBER_Q. O problema é que o tempo da operação de divisão não é constante e, em diferentes ambientes, o número de ciclos de CPU necessários para a divisão depende dos dados de entrada. Dessa forma, com base na variação do tempo das operações, é possível obter uma noção sobre a natureza dos dados utilizados na divisão.
Daniel Bernstein, conhecido especialista em criptografia, conseguiu preparar uma demonstração funcional que prova a possibilidade de realizar um ataque na prática. Em dois dos três experimentos realizados na placa Raspberry Pi 2, foi possível reconstruir 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 a realização bem-sucedida do ataque, é necessário que o texto cifrado fornecido 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.
Nas algumas bibliotecas, foi identificada mais uma vulnerabilidade (KyberSlash2), que também surge devido ao uso de um valor secreto durante a execução da divisão. As diferenças em relação à primeira versão se resumem à chamada na fase de criptografia (nas funções poly_compress e polyvec_compress), e não durante a descriptografia. No entanto, a segunda variante pode ser útil para um ataque apenas em casos onde o procedimento é utilizado em operações de recriptografia, nas quais a saída do texto criptografado é considerada confidencial.
A vulnerabilidade já foi corrigida nas bibliotecas:
- zig/lib/std/crypto/kyber_d00.zig (22 de dezembro),
- pq-crystals/kyber/ref (30 de dezembro),
- symbolicsoft/kyber-k2so (19 de dezembro),
- cloudflare/circl (8 de janeiro),
- aws/aws-lc/crypto/kyber (4 de janeiro),
- liboqs/src/kem/kyber (8 de janeiro).
Bibliotecas que originalmente não eram vulneráveis:
- 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 permanece não corrigida nas bibliotecas:
- antontutoveanu/crystals-kyber-javascript,
- Argyle-Software/kyber,
- debian/src/liboqs/unstable/src/kem/kyber,
- kudelskisecurity/crystals-go,
- mupq/pqm4/crypto_kem/kyber* (20 de dezembro, apenas 1 variante da vulnerabilidade foi corrigida),
- PQClean/PQClean/crypto_kem/kyber*/aarch64,
- PQClean/PQClean/crypto_kem/kyber*/clean,
- randombit/botan (20 de dezembro, apenas 1 variante da vulnerabilidade foi corrigida),
- rustpq/pqcrypto/pqcrypto-kyber (5 de janeiro, correção adicionada em libsignal, mas a vulnerabilidade em pqcrypto-kyber ainda não foi corrigida).
Fonte: opennet.ru
