Pesquisadores do Instituto Politécnico de Worcester (EUA) apresentaram um novo tipo de ataque, chamado Mayhem, que utiliza um método de distorção de bits na memória volátil dinâmica Rowhammer para alterar os valores das variáveis na pilha, que são usadas no programa como flags para decidir sobre o sucesso da autenticação e a passagem das verificações de segurança. Exemplos práticos de aplicação do ataque foram demonstrados para contornar a autenticação em SUDO, OpenSSH e MySQL, além de modificar os resultados das verificações de segurança na biblioteca OpenSSL.
O ataque pode ser aplicado a aplicativos que utilizam comparações de diferenças de valores a partir de zero em suas verificações. Exemplo de código vulnerável: int auth = 0; … // código de verificação que altera o valor de auth em caso de autenticação bem-sucedida if(auth != 0) return AUTH_SUCCESS; else return AUTH_FAILURE;
No contexto deste exemplo, para um ataque bem-sucedido, é suficiente distorcer qualquer bit na memória que corresponde à variável de 32 bits auth na pilha. Ao distorcer qualquer bit na variável, o valor não será mais igual a zero e o operador condicional determinará o sucesso da autenticação. Padrões de verificação semelhantes são bastante comuns em aplicativos e podem ser encontrados, por exemplo, em SUDO, OpenSSH, MySQL e OpenSSL.

O ataque também pode ser aplicado em comparações do tipo "if(auth == 1)", mas neste caso sua execução se complica, já que é necessário distorcer não qualquer bit dos 32, mas o último bit. O método também pode ser utilizado para influenciar os valores das variáveis nos registradores do processador, já que o conteúdo dos registradores pode ser temporariamente despejado na pilha ao ocorrer uma mudança de contexto, chamada de funções ou ao ativar um manipulador de sinais. Durante o tempo em que os valores dos registradores estão na memória, é possível fazer distorções nesta memória e um valor alterado poderá ser restaurado no registrador.

Para a corrupção de bits, é utilizado uma das modificações do ataque da classe RowHammer. Como a memória DRAM consiste em um array bidimensional de células, cada uma delas composta por um capacitor e um transistor, a leitura contínua de uma mesma área de memória leva a flutuações de tensão e anomalias, causando uma pequena perda de carga nas células vizinhas. Se a intensidade da leitura for alta, a célula vizinha pode perder uma quantidade significativa de carga e o próximo ciclo de regeneração pode não conseguir restaurar seu estado original, resultando na alteração do valor dos dados armazenados nessa célula. Para proteger contra RowHammer, os fabricantes de chips implementaram o mecanismo TRR (Target Row Refresh), que bloqueia a corrupção de células em casos específicos, mas não protege contra todas as variantes possíveis do ataque.
Para proteção contra o ataque Mayhem, recomenda-se usar, nas comparações, não a avaliação de diferenças em relação a zero ou correspondências com um, mas a verificação de correspondências utilizando um valor aleatório de inicialização com octetos não nulos. Nesse caso, para atribuir o valor correto à variável, é necessário distorcer exatamente um número significativo de bits, o que não é realista, ao contrário da distorção de um único bit. Exemplo de código imune ao ataque: int auth = 0xbe406d1a; … // código de verificação que atribui o valor auth a 0x23ab8701 em caso de autenticação bem-sucedida if(auth == 0x23ab8701) return AUTH_SUCCESS; else return AUTH_FAILURE;
O método de proteção mencionado já foi implementado pelos desenvolvedores do sudo e incorporado na versão 1.9.15 como uma correção para a vulnerabilidade CVE-2023-42465. O protótipo do código para realizar o ataque está planejado para ser publicado após a correção dos projetos vulneráveis principais.
Fonte: opennet.ru
