Vulnerabilidade no subsistema de kernel Linux Netfilter

Uma vulnerabilidade (CVE-2021-22555) foi identificada no Netfilter, um subsistema do kernel Linux usado para filtrar e modificar pacotes de rede, que permite que um usuário local obtenha privilégios de root no sistema, inclusive enquanto estiver em um contêiner isolado. Um protótipo funcional de uma exploração que contorna os mecanismos de proteção KASLR, SMAP e SMEP foi preparado para teste. O pesquisador que descobriu a vulnerabilidade recebeu uma recompensa de US$ 20 do Google por identificar um método para contornar o isolamento de contêineres Kubernetes em um cluster kCTF.

O problema existe desde o kernel 2.6.19, lançado há 15 anos, e é causado por um bug nos manipuladores IPT_SO_SET_REPLACE e IP6T_SO_SET_REPLACE que causa um estouro de buffer ao enviar parâmetros especialmente formatados por meio de uma chamada setsockopt no modo de compatibilidade. Em circunstâncias normais, a chamada para compat_setsockopt() só pode ser feita pelo usuário root, mas os privilégios necessários para realizar o ataque também podem ser obtidos por um usuário sem privilégios em sistemas com suporte para namespaces de usuário habilitados.

Um usuário pode criar um contêiner com um usuário root separado e explorar a vulnerabilidade a partir daí. Por exemplo, "namespaces de usuário" está habilitado por padrão no Ubuntu e Fedora, mas não habilitado no Debian e RHEL. O patch que corrige a vulnerabilidade foi adotado no kernel do Linux em 13 de abril. As atualizações de pacotes já foram geradas pelos projetos Debian, Arch Linux e Fedora. No Ubuntu, RHEL e SUSE, as atualizações estão em preparação.

O problema ocorre na função xt_compat_target_from_user() devido ao cálculo incorreto do tamanho da memória ao salvar estruturas do kernel após a conversão da representação de 32 bits para 64 bits. O bug permite que quatro bytes nulos sejam gravados em qualquer posição além do buffer alocado limitado pelo deslocamento 0x4C. Esse recurso acabou sendo suficiente para criar um exploit que permitiu obter direitos de root - ao limpar o ponteiro m_list->next na estrutura msg_msg, foram criadas condições para acessar os dados após liberar memória (use-after-free), que foi então usado para obter informações sobre endereços e alterações em outras estruturas através da manipulação da chamada de sistema msgsnd().

Fonte: opennet.ru

Adicionar um comentário