Recentemente divulgou a notícia sobre a identificação de várias vulnerabilidades críticas nas pilhas TCP do Linux e FreeBSD que permite que um invasor inicie remotamente uma falha de kernel ou causar consumo excessivo de recursos processando pacotes TCP especialmente criados (pacote da morte).
Os problemas são causados por erros nas alças do tamanho máximo do bloco de dados no pacote TCP (MSS, tamanho máximo do segmento) e no mecanismo de reconhecimento seletivo de conexão (SACK, reconhecimento seletivo de TCP).
O que é um reconhecimento seletivo?
Reconhecimento seletivo de TCP (SACK) é um mecanismo onde o receptor de dados pode informar o remetente sobre todos os segmentos que foram aceitos com sucesso.
Este Permite ao remetente retransmitir os segmentos de fluxo ausentes de seu conjunto 'bem conhecido'. Quando o TCP SACK é desabilitado, um conjunto muito maior de retransmissões é necessário para retransmitir uma sequência inteira.
No kernel Linux, os problemas são corrigidos nas versões 4.4.182, 4.9.182, 4.14.127, 4.19.52 e 5.1.11. A solução para FreeBSD está disponível como patch.
As atualizações do pacote do kernel são lançadas para Debian, RHEL, SUSE / openSUSE, ALT, Ubuntu, Fedora e Arch Linux.
CVE-2019-11477 (SACK Pânico)
O problema se manifesta nos kernels do Linux a partir de 2.6.29 e permite que você bloqueie o kernel (pânico) ao enviar uma série de pacotes SACK devido a um estouro de inteiro no controlador.
Para um ataque, é suficiente definir o valor MSS para 48 bytes para uma conexão TCP e enviar uma seqüência de pacotes SACK organizados de uma determinada maneira.
A essência do problema é que a estrutura tcp_skb_cb (buffer de soquete) é projetado para armazenar 17 fragmentos ("Definir MAX_SKB_FRAGS (65536 / PAGE_SIZE + 1) => 17").
No processo de envio de um pacote, ele é colocado na fila de envio e tcp_skb_cb armazena detalhes sobre o pacote, como o número de sequência, os sinalizadores, bem como os campos "tcp_gso_segs" e "tcp_gso_size", que são usados para enviar Informações de segmentação para o controlador (TSO, Segment Segment Download) para processar segmentos no lado da placa de rede.
Os fragmentos são salvos quando ocorre a perda de pacotes ou a necessidade de retransmissão seletiva de pacotes, se o SACK estiver habilitado e o TSO for suportado pelo driver.
Como uma solução alternativa para a proteção, você pode desabilitar o processamento SACK ou bloquear conexões com um MSS pequeno (só funciona quando você define sysctl net.ipv4.tcp_mtu_probing como 0 e pode quebrar algum normal) com MSS baixo).
CVE-2019-11478 (SACK Lentidão)
Esta falha causa uma interrupção do mecanismo SACK (ao usar o kernel Linux em 4.15) ou consumo excessivo de recursos.
O problema ocorre ao processar pacotes SACK especialmente criados que podem ser usados para fragmentar a fila de retransmissão (retransmissão TCP). As soluções de proteção são semelhantes às vulnerabilidades anteriores
CVE-2019-5599 (SACK Lentidão)
Permite a fragmentação do mapa de pacotes enviado ao processar uma sequência SACK em uma única conexão TCP e faz com que uma operação de pesquisa de lista com uso intensivo de recursos seja executada.
O problema se manifesta no FreeBSD 12 com o mecanismo de detecção de perda de pacotes RACK. Como alternativa, você pode desativar o módulo RACK (não carregado por padrão, desativado especificando sysctl net.inet.tcp.functions_default = freebsd)
CVE-2019-11479
A falha permite que um invasor faça o kernel do Linux dividir as respostas em vários segmentos TCP, cada um deles inclui apenas 8 bytes de dados, o que pode levar a um aumento significativo no tráfego, aumento da carga da CPU e um canal de comunicação obstruído.
Além disso, consome recursos adicionais (potência do processador e placa de rede).
Esse ataque requer esforços contínuos por parte do invasor e os ataques terminarão logo após o invasor parar de enviar tráfego.
Enquanto este ataque estiver em andamento, o sistema será executado com capacidade reduzida, causando uma negação de serviço para alguns usuários.
Um usuário remoto pode acionar este problema, definindo o tamanho máximo do segmento (MSS) de uma conexão TCP em seu limite inferior (48 bytes) e enviando uma sequência de pacotes SACK especialmente criados.
Como solução alternativa, é recomendável bloquear conexões com baixo MSS.