Calif revela exploração de escalada local de privilégios no OpenBSD 7.9

A Calif, empresa de segurança, divulgou hoje uma exploração de escalada local de privilégios que obtém acesso root no OpenBSD 7.9. O ataque combina um erro de estouro de inteiro com aproximadamente 37 anos de idade na função shmat(4) attach com um bug de uso após libertação separado na contagem de referências, contornando a randomização de endereços do kernel KARL e as proteções de hardware SMAP e SMEP.

O estouro de inteiro foi corrigido no errata 018, lançado em 14 de setembro como um reparo de confiabilidade. O bug de uso após libertação da contagem de referências foi corrigido separadamente no errata 026, lançado em 30 de setembro como um reparo de segurança. Ambos os reparos são disponibilizados via syspatch para todas as arquiteturas, e o OpenBSD 7.8 também recebeu a correção do estouro de inteiro.

O bug se origina do contador de anexação de memória compartilhada shm_nattch, definido como um short assinado de 16 bits com um valor máximo de 32767, um tipo herdado de fontes originais do BSD que datam de 1988. O exploit mapeia 127 segmentos de memória compartilhada e cria 259 processos, empurrando o contador além de seu limite e fazendo com que ele se torne -32643. Este estouro aciona uma condição de corrida que leva a um uso após libertação, porque o contador de referência corrompido faz com que o kernel libere memória ainda usada por outros processos.

Uma segunda vulnerabilidade é um erro de escrita fora de limites que sobrescreve contadores de pertencimento a multicast no kernel. Quando o socket afetado é fechado, as decrementações modificam entradas de tabela de páginas, transformando um mapeamento de memória de usuário em acessível por supervisor e contornando SMAP e SMEP. O invasor então sobrescreve um ponteiro de função em um endereço previsível do kernel para executar seu próprio código.

O pesquisador Andrew Griffiths apontou que o KARL do OpenBSD relocaliza o binário do kernel para randomizar endereços de funções e dados, mas os alocadores de memória do kernel permanecem determinísticos. Tanto o alocador de boot time quanto o alocador best‑fit não possuem randomização de endereço base, então estruturas iniciais como ponteiros de função em manipuladores de interface de rede lo0 e enc0 se posicionam nos mesmos endereços em reinicializações no mesmo hardware. A cadeia de exploração não requer nenhuma vulnerabilidade de divulgação de informação.

Além dos dois errata, a Calif sugere quatro categorias de endurecimento: safe unlinking para listas vinculadas do kernel (já utilizado pelo FreeBSD e NetBSD), randomização do mapeamento autoreferencial da tabela de páginas, randomização do alocador de kernel e verificação de limites baseada em compilador. A empresa relatou os bugs ao OpenBSD no início deste ano, e um código proof‑of‑concept está disponível no GitHub. Nenhum CVE foi atribuído, e não há evidências de que as vulnerabilidades tenham sido exploradas.

Ambos os reparos estão disponíveis via syspatch para todas as arquiteturas suportadas, e o OpenBSD 7.8 também recebeu a correção do estouro de inteiro. Usuários devem atualizar prontamente para mitigar o risco de escalada local de privilégios.

  • Safe unlinking para listas vinculadas do kernel
  • Randomização do mapeamento autoreferencial da tabela de páginas
  • Randomização do alocador de kernel
  • Verificação de limites baseada em compilador

Com informações de: The Hacker News