Vulnerabilidade no subsistema eBPF que permite execução de código no nível do kernel Linux

Uma vulnerabilidade (CVE-2021-4204) foi identificada no subsistema eBPF, que permite executar manipuladores dentro do kernel Linux em uma máquina virtual especial com JIT, permitindo que um usuário local sem privilégios obtenha escalonamento de privilégios e execute seu código no Nível do kernel Linux. O problema tem aparecido desde o kernel Linux 5.8 e permanece sem solução (incluindo a versão 5.16). O status das atualizações sendo geradas para corrigir o problema nas distribuições pode ser acompanhado nestas páginas: Debian, RHEL, SUSE, Fedora, Ubuntu, Arch. Foi anunciado que foi criada uma exploração funcional, que está planejada para ser publicada em 18 de janeiro (usuários e desenvolvedores tiveram uma semana para corrigir a vulnerabilidade).

A vulnerabilidade é causada pela verificação incorreta de programas eBPF transmitidos para execução. O subsistema eBPF disponibiliza funções auxiliares, cujo correto uso é verificado por um verificador especial. Algumas funções requerem a passagem de um valor PTR_TO_MEM como argumento e, para evitar possíveis buffer overflows, o verificador deve saber o tamanho da memória associada ao argumento. Para as funções bpf_ringbuf_submit e bpf_ringbuf_discard, os dados sobre o tamanho da memória transferida não foram relatados ao verificador, o que poderia ser usado para sobrescrever áreas de memória além do limite do buffer ao executar código eBPF especialmente projetado.

Para realizar um ataque, o usuário deve ser capaz de carregar seu próprio programa BPF, e muitas distribuições recentes do Linux bloqueiam essa capacidade por padrão (inclusive o acesso sem privilégios ao eBPF agora é proibido por padrão no próprio kernel, a partir da versão 5.16). Por exemplo, a vulnerabilidade pode ser explorada na configuração padrão do Ubuntu 20.04 LTS, mas nos ambientes Ubuntu 22.04-dev, Debian 11, openSUSE 15.3, RHEL 8.5, SUSE 15-SP4 e Fedora 33 ela aparece apenas se o administrador tiver definido o parâmetro kernel.unprivileged_bpf_disabled para 0. Como solução alternativa para bloquear a vulnerabilidade, você pode impedir a execução de programas BPF por usuários sem privilégios com o comando “sysctl -w kernel.unprivileged_bpf_disabled=1”.

Fonte: opennet.ru

Adicionar um comentário