0Pricing
Cryptology Academy · Aula

Ataques de Temporização em Código no Nível da Aplicação

Aprenda como a temporização da comparação de strings pode vazar segredos e como a comparação em tempo constante os impede.

Ataques de Temporização em Código no Nível da Aplicação é uma aula grátis de Cryptology Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Cryptology Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Cryptology Academy inclui 4 aulas no total.

Comparação de cadeias de caracteres em tempo não constante

O operador padrão de igualdade de cadeias de caracteres na maioria das linguagens de programação termina assim que encontra uma diferença. O == do Python aplicado a objetos bytes, o strcmp do C e o String.equals do Java retornam imediatamente quando encontram o primeiro byte diferente. Em comparações comuns de cadeias de caracteres, isso é uma otimização; porém, ao comparar valores secretos, como marcas de MAC ou senhas, cria um canal lateral temporal mensurável que vaza informações.

Medição do tempo de comparação do HMAC

Um atacante mede o tempo necessário para comparar uma etiqueta HMAC enviada com o valor correto. Enviar uma etiqueta HMAC cuja primeira unidade de dados esteja correta leva um pouco mais de tempo do que enviar uma em que o primeiro byte esteja errado (uma comparação adicional de byte). Ao enviar muitos valores com cada possível primeiro byte e medir os tempos de resposta, o atacante identifica o primeiro byte correto. Esse processo se repete byte a byte até que a etiqueta completa seja recuperada.

Precisão prática de ataques de temporização

Os ataques modernos de temporização pela rede conseguem detectar diferenças de dezenas a centenas de nanossegundos pela internet. Uma comparação de HMAC de 32 bytes, na qual cada byte correto acrescenta cerca de 10 a 100 ns ao tempo de processamento, fornece um sinal mensurável quando se fazem medições repetidas suficientes para calcular a média da variação da rede. Em uma rede local, até diferenças de um único nanossegundo podem ser exploradas com uma amostragem estatística suficiente.

Vulnerabilidade do operador == do Python

No Python, comparar etiquetas MAC com == não é seguro: if mac == submitted_mac retorna True ou False com base na posição da primeira divergência. Um atacante que envia milhares de etiquetas especialmente criadas e mede os tempos de resposta pode recuperar a etiqueta esperada byte a byte. Essa vulnerabilidade já apareceu em aplicações web de produção que implementaram incorretamente a comparação de tokens de sessão ou chaves de API sem funções de tempo constante.

hmac.compare_digest no Python

hmac.compare_digest(a, b) do Python compara dois valores de bytes ou de cadeias de caracteres em tempo constante, levando o mesmo tempo independentemente do local em que ocorre a primeira divergência. A função é implementada em C para garantir um comportamento de tempo constante mesmo com a sobrecarga da interpretação do código de bytes do Python. Use sempre hmac.compare_digest para comparar etiquetas MAC, tokens de sessão, chaves de API ou qualquer valor cuja informação de temporização possa ser perigosa.

CRYPTO_memcmp no OpenSSL

O OpenSSL fornece CRYPTO_memcmp(a, b, length) para comparação de memória em tempo constante. Diferentemente de memcmp, a função sempre processa todos os bytes indicados por length, independentemente de divergências antecipadas. O valor de retorno é zero quando os valores são iguais e diferente de zero quando são diferentes. É importante sempre comparar o comprimento esperado completo: comparar valores de comprimentos diferentes usando o menor comprimento ainda pode vazar informações sobre o comprimento. Use CRYPTO_memcmp em qualquer comparação crítica para a segurança no código C/C++ que utiliza OpenSSL.

Ataques de temporização contra RSA: Bleichenbacher

Os ataques de temporização vão além da comparação de cadeias de caracteres. O ataque de Bleichenbacher de 2006 contra a descriptografia RSA PKCS#1 v1.5 demonstrou um oráculo prático de temporização contra implementações de SSL/TLS. O tempo da operação com a chave privada RSA variava conforme o valor descriptografado tivesse um preenchimento PKCS#1 válido. Ao enviar milhares de textos cifrados especialmente criados, os atacantes poderiam recuperar chaves privadas RSA. Isso motivou o uso de RSA-OAEP e de implementações RSA em tempo constante.

Ataques de temporização de cache contra AES

Implementações de AES que usam tabelas de consulta (uma prática comum para obter desempenho) acessam entradas diferentes com base na chave e no texto simples. Acertos e falhas de cache criam diferenças de temporização mensuráveis que revelam informações sobre quais entradas da tabela foram acessadas. Esse canal lateral pode revelar chaves AES. A defesa consiste em usar implementações de AES que não dependam de consultas a tabelas, como instruções de hardware AES-NI ou implementações de software baseadas em bits.

Princípios de implementação em tempo constante

Escrever código em tempo constante exige evitar: desvios condicionais baseados em dados secretos (utilize seleção sem desvios com mascaramento), padrões de acesso à memória que dependam de dados secretos (evite tabelas de consulta indexadas por segredos) e quaisquer operações cuja latência dependa de valores secretos (por exemplo, divisão em alguns processadores). Os compiladores podem eliminar construções de tempo constante durante a otimização, portanto, talvez sejam necessários código em linguagem assembly ou acessos voláteis à memória em seções críticas.

AEAD elimina a comparação de MAC no nível da aplicação

A melhor defesa contra ataques de temporização na comparação de MAC é usar modos AEAD (GCM, ChaCha20-Poly1305) e delegar a verificação do MAC à biblioteca criptográfica. As implementações da biblioteca realizam a verificação internamente em tempo constante. Se você usa AEAD corretamente (a descriptografia falha diante de qualquer adulteração; nunca descriptografe antes de verificar a etiqueta), não precisa comparar etiquetas MAC no código da aplicação, eliminando completamente a vulnerabilidade de temporização.

Testes em busca de vulnerabilidades de temporização

Testar vulnerabilidades de temporização exige uma análise estatística das distribuições dos tempos de resposta. Ferramentas como tlsfuzzer, scripts de teste de ataques de temporização e a estrutura dudect ajudam a detectar diferenças de temporização em implementações criptográficas. Um teste t aplicado a amostras de tempos de resposta para entradas que deveriam produzir o mesmo tempo pode revelar diferenças estatisticamente significativas. Falsos negativos são possíveis; a revisão do código em busca de comportamento de tempo constante também é essencial, além dos testes.

Comparação em tempo constante

Qual função do Python deve ser usada para comparar com segurança uma etiqueta HMAC e evitar ataques de temporização?

Recapitulação dos ataques de temporização

Recapitulação dos ataques de temporização: a comparação de cadeias de caracteres com saída antecipada vaza valores secretos byte a byte por meio de diferenças nos tempos de resposta; isso pode ser medido pela rede com amostras suficientes; use hmac.compare_digest no Python e CRYPTO_memcmp no OpenSSL para comparações em tempo constante; ataques de temporização contra o preenchimento RSA comprometem chaves privadas (use RSA em tempo constante e OAEP); ataques de temporização contra consultas a tabelas de AES vazam bits da chave (use AES-NI ou implementações baseadas em bits); e a verificação pela biblioteca AEAD elimina a necessidade de comparar MAC no nível da aplicação.

Perguntas Frequentes

A aula “Ataques de Temporização em Código no Nível da Aplicação” é grátis?

Sim — o texto completo de “Ataques de Temporização em Código no Nível da Aplicação” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Cryptology Academy, atualize para CoddyKit PRO. O curso de Cryptology Academy inclui 4 aulas no total.

O que vou aprender em “Ataques de Temporização em Código no Nível da Aplicação”?

Aprenda como a temporização da comparação de strings pode vazar segredos e como a comparação em tempo constante os impede. Você pratica Cryptology Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Cryptology Academy?

Nenhuma experiência prévia é necessária. Cryptology Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.

Quanto tempo leva a aula “Ataques de Temporização em Código no Nível da Aplicação”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Cryptology Academy?

Sim. Cada aula de Cryptology Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Ataques de Oráculo de Preenchimento em Detalhes
  2. Ataques de Repetição e Vulnerabilidades de Reutilização de Nonce
  3. Ataques de Temporização em Código no Nível da Aplicação
  4. Principais Padrões de Uso Indevido da Criptografia
← Voltar para Cryptology Academy