Ataque de temporização

Origem: Wikipédia, a enciclopédia livre.

Em criptografia, um ataque de temporização é um side channel attack no qual um atacante tenta comprometer um sistema criptográfico analisando o tempo gasto para executar determinados algoritmos criptográficos. Toda operação lógica leva um tempo computacional para ser executada; e este tempo pode variar em relação a entrada fornecida; utilizando medições precisas do tempo gasto em cada operação, um atacante pode tirar vantagem deste comportamento inferindo determinadas informações.

Informações podem vazar através da medição o tempo gasto para responder a determinadas consultas. A quantidade de informações que pode ser exposta depende de diversas variáveis: o sistema criptográfico utilizado, o tempo de execução da CPU, os algoritmos utilizados, detalhes de implementação, medidas contra ataques de temporização, a exatidão da medida de tempo, entre outras.

Ataques de temporização são normalmente negligenciados na fase de implementação devido a sua forte dependência da implementação.

Ideia por trás do ataque[editar | editar código-fonte]

O ataque de temporização é um exemplo de ataque que explora características comportamentais dependente de dados da implementação de um algoritmo, ao invés das propriedades matemáticas destes.

Muitos algoritmos criptográficos podem ser implementados (ou mascarados por um proxy) de modo a dirimir ou mitigar o tempo informacional dependente de dados: considere uma implementação na qual toda chamada a uma subrotina sempre retorna em exatos x segundos, sendo x o tempo máximo para executar uma rotina, dada uma entrada autorizada. Em tal implementação, o tempo de execução do algoritmo não vaza nenhuma informação sobre o dado de entrada. A desvantagem desta abordagem é que o tempo gasto para executar muitas chamadas aumenta a média de desempenho para o pior caso de execução da função.

Ataques de temporização são exequíveis em muitos casos:

  • Ataques de temporização podem ser aplicados a qualquer algoritmo que tenha tempo variável em função da entrada. Softwares que rodam em uma CPU com cache de dados exibirão variações de tempo como resultado da busca de informações no cache. Algumas operações, como multiplicação, podem ter tempo de execução variável dependendo da entrada fornecida. Remover dependências de tempo é uma tarefa árdua, especialmente em algoritmos que realizam operações de baixo nível que frequentemente exibem tempo de execução variável.
  • Encontrar segredos através de ataques de temporização pode ser significantemente mais fácil que utilizar criptoanálise de texto plano conhecido. Em algumas situações, informações de tempo combinadas com criptoanálise aumentam o grau de informações expostas.

Exemplos[editar | editar código-fonte]

O tempo de execução para o algoritmo de exponenciação binária, utilizada na exponenciação modular, depende linearmente do número de bits '1' na chave. Embora o número de bits '1' na chave por si só não seja suficiente para obter de maneira trivial a chave, execuções repetidas com a mesma chave e entradas diversas podem ser utilizadas para realizar uma correlação estatística do tempo gasto a fim de obter a chave, até mesmo por usuários passivos.

Observar a medida de tempo inclui os ruídos externos (como latência de rede, diferenças de tempo no acesso a disco, etc.). Apesar disso, ataques de temporização são práticos contra diversos algoritmos, como: RSA, ElGamal e DSA (este último sendo de assinatura digital).

Em 2003, Boneh e Brumley realizaram um ataque de temporização factível baseado em rede em servidores web SSL, baseado em uma outra vulnerabilidade, onde se faz necessário utilizar o RSA com a otimização Chinese Remainder Theorem. O experimento atual utiliza uma curta distância de rede, porém, foi possível extrair a chave privada do servidor em questão de horas. Essa demonstração levou a disseminação e uso de técnicas de blinding cryptography nas implementações SLL. Neste contexto, o blinding cryptography visa remover correlações entre chave e tempo de cifragem.

Algumas versões do Unix utilizam uma implementação custosa da biblioteca crypt para gerar um hash a uma senha de oito caracteres em uma cadeia de 11 caracteres. Em hardwares antigos, essa computação leva um tempo deliberadamente longo e mensurável: dois ou três segundos a mais em alguns casos. O programa de autenticação do Unix utiliza o crypt apenas quando o login submetido é válido, permitindo a distinção (através do ataque de temporização) entre logins válidos e inválidos no sistema, mesmo com uma senha incorreta. Nas versões mais recentes do Unix, esse problema foi consertado, evitando a revelação do login.

Veja também[editar | editar código-fonte]

Notas[editar | editar código-fonte]

Ataques de temporização são mais fáceis de realizar caso o adversário conheça as entranhas da implementação de hardware e o sistema criptográfico em uso. Assim como, segundo o princípio de Kerckhoffs, o esquema de criptografia não deve depender da obscuridade, sob a ótica de ataques de temporização também não o devem, uma vez que estes, na pior das hipóteses, podem ser submetidos a um processo de engenharia reversa.

Referências