Um exploit local de elevação de privilégios, publicado hoje, obtém acesso de administrador no OpenBSD 7.9 ao combinar um estouro de inteiro com cerca de 37 anos com uma falha distinta no kernel. A técnica contorna a randomização de endereços do kernel do OpenBSD, conhecida como KARL, e as proteções de hardware SMAP e SMEP. A empresa de segurança Calif, que descobriu e reportou as falhas, publicou uma análise detalhada e o código completo de prova de conceito depois que o OpenBSD lançou correções para os dois problemas, em setembro.
O estouro de inteiro na função de associação shmat(4) foi corrigido na errata 018, lançada em 14 de setembro como uma correção de confiabilidade. A falha de uso após liberação, relacionada à contagem de referências e necessária para completar a cadeia, foi corrigida separadamente na errata 026, publicada em 30 de setembro como uma correção de segurança.
As duas correções estão disponíveis pelo syspatch e cobrem todas as arquiteturas. O OpenBSD 7.8 também recebeu a correção para o estouro de inteiro.
O estouro de inteiro, que dá início à cadeia completa, foi classificado como um problema de confiabilidade, e não como uma falha de segurança.
Até a publicação, nenhum CVE havia sido atribuído a qualquer uma das falhas. Também não há evidências de que as vulnerabilidades tenham sido usadas em ataques.
O contador de associações à memória compartilhada, shm_nattch, foi definido como um inteiro curto assinado de 16 bits, com valor máximo de 32.767, no código-fonte original do BSD, que data de 1988. O OpenBSD herdou esse tipo de dado e nunca ampliou sua capacidade.
O exploit mapeia 127 segmentos de memória compartilhada e cria 259 processos, fazendo o contador ultrapassar o limite e atingir −32.643. Em seguida, uma condição de corrida provoca uma falha de uso após liberação: a contagem de referências corrompida leva o kernel a liberar memória que ainda está sendo usada por outros processos.
Uma gravação distinta fora dos limites sobrescreve contadores de associação a grupos de multicast no kernel. Quando o soquete afetado é fechado, as reduções resultantes alteram entradas da tabela de páginas e tornam um mapeamento de memória do usuário acessível em modo supervisor, contornando SMAP e SMEP. Depois, o exploit sobrescreve um ponteiro de função em um endereço previsível do kernel para executar código próprio.
“Embora o KARL do OpenBSD reconstrua e vincule novamente o binário do kernel para randomizar os endereços de funções e dados, os alocadores de memória do kernel continuam determinísticos”, escreveu o pesquisador Andrew Griffiths. Tanto o alocador usado durante a inicialização quanto o alocador de melhor ajuste deixam de randomizar os endereços-base. Por isso, estruturas criadas no início da inicialização, incluindo ponteiros de função nos manipuladores das interfaces de rede lo0 e enc0, ficam nos mesmos endereços após reinicializações na mesma máquina. O exploit não precisa de uma vulnerabilidade de divulgação de informações.
Além das duas erratas, a Calif propõe quatro categorias de reforço de segurança: unlink seguro para listas encadeadas do kernel, recurso já usado pelo FreeBSD e pelo NetBSD; randomização do mapeamento autorreferencial da tabela de páginas; randomização do alocador do kernel; e verificação de limites baseada no compilador.
A Calif afirmou ter reportado as falhas ao OpenBSD “no início deste ano”. O código do exploit de prova de conceito está disponível no GitHub.
Publicidade
Nossa audiência é formada por analistas, pentesters, decisores e entusiastas que consomem nossas notícias todo dia pelo Site, Newsletter e Instagram. Fale com quem realmente importa para o seu negócio. Anuncie aqui. Saiba mais...