E uma falha no CAN BCM permite o escalonamento de privilégios no kernel. Confira os detalhes dessa recente e perigosa vulnerabilidade.
Recentemente, foram lançadas informações sobre uma vulnerabilidade no kernel do Linux, que já está catalogada como CVE-2021-3609.
Esta vulnerabilidade permite que um usuário local eleve seus privilégios no sistema devido a uma condição de corrida na implementação do protocolo CAN BCM e se manifesta nas versões 2.6.25 a 5.13-rc6 do kernel Linux.
Falha no CAN BCM permite o escalonamento de privilégios no kernel
Essa falha é explorada porque o protocolo CAN BCM permite que você registre seu próprio gerenciador de mensagens da rede de área do controlador (CAN) e conecte-o a um soquete de rede específico. Quando uma mensagem chega, a função bcm_rx_handler() é chamada de um atacante pode tirar vantagem de uma condição de corrida (race condition) e forçar o fechamento do soquete da rede enquanto executa bcm_rx_handler().
O problema surge quando o soquete é fechado e a função bcm_release() é chamada, na qual a memória alocada para as estruturas bcm_op e bcm_sock é liberada, que continua a ser usada no manipulador bcm_rx_handler() que ainda está em execução, desta forma surge uma situação que leva ao acesso a um bloco de memória já liberado (use-after-free).
“Este é um anúncio do bug relatado recentemente (CVE-2021-3609) no protocolo de rede CAN BCM no kernel do Linux variando da versão 2.6.25 até a linha principal 5.13-rc6.
A vulnerabilidade é uma condição de corrida em net /can/bcm.c que permite o escalonamento de privilégios para root. O problema foi inicialmente relatado por syzbot e Norbert Slusarek provou ser explorável.”
O ataque se resume a abrir dois soquetes CAN BCM e vinculá-los à interface do vcan. No primeiro socket, sendmsg() é chamado com o flag RX_SETUP para configurar o controlador para mensagens CAN de entrada, e no segundo socket, sendmsg() é chamado para enviar uma mensagem para o primeiro socket.
Depois que a mensagem chega, a chamada bcm_rx_handler() é acionada e o invasor toma o momento apropriado e fecha o primeiro soquete, levando ao lançamento de bcm_release() e ao lançamento das estruturas bcm_op e bcm_sock, embora o trabalho de bcm_rx_handler() tenha Ainda não foi completo.
“Ao manipular o conteúdo de bcm_sock, um invasor pode substituir um ponteiro para a função sk-> sk_data_ready(sk), redirecionar a execução e, usando técnicas de programação orientada a retorno (ROP), substituir o parâmetro modprobe_path e fazer seu código rodar como root.”
Ao usar a técnica ROP, o invasor não tenta colocar seu código na memória, mas em vez disso opera nas partes das instruções da máquina que já estão disponíveis nas bibliotecas carregadas, terminando com uma instrução de retorno de controle (como regra, estas são fim da biblioteca de funções).
As permissões necessárias para realizar um ataque podem ser adquiridas por um usuário sem privilégios em contêineres criados em sistemas com namespaces de usuário habilitados. Por exemplo, namespaces de usuário são incluídos por padrão no Ubuntu e Fedora, mas não habilitados no Debian e RHEL.
“Minha tentativa de exploração concentra-se nos kernels com versão>= 5.4-rc1 do commit bf74aa86e111. Não investiguei a exploração de kernels anteriores a 5.4-rc1 usando tasklets, no entanto, explorar kernels mais antigos também parece viável.”
Foi mencionado que o pesquisador que identificou a vulnerabilidade foi capaz de preparar um exploit para obter direitos de root em sistemas com kernels da versão 5.4 e posterior, incluindo a possibilidade de um ataque bem-sucedido ao Ubuntu 20.04.02 LTS.
O trabalho do exploit é reduzido à construção de uma cadeia de chamadas para blocos semelhantes (“gadgets”) para obter a funcionalidade necessária. O ataque requer acesso para criar soquetes CAN e uma interface de rede vcan configurada.
Finalmente, é mencionado que o problema ainda persiste na maioria das distribuições, mas é uma questão de dias antes que os patches correspondentes sejam lançados.
Se você tem interesse em saber mais sobre o assunto, pode consultar o seguinte endereço.