Recentemente, a notícia de que um pesquisador de segurança identificou uma vulnerabilidade crítica (já listado em CVE-2021-43267) na implementação do protocolo de rede TIPC fornecido no kernel Linux, que permite a execução remota de código com privilégios de kernel, enviando um pacote de rede especialmente criado.
O perigo do problema é atenuado pelo fato de que o ataque requer a ativação explícita do suporte TIPC no sistema (carregando e configurando o módulo do kernel tipc.ko), o que não é feito por padrão em distribuições não Linux.
CodeQL é um mecanismo de análise que permite executar consultas em seu código. De uma perspectiva de segurança, isso pode permitir que você encontre vulnerabilidades simplesmente descrevendo sua aparência. O CodeQL entrará em operação e encontrará todas as instâncias dessa vulnerabilidade.
O TIPC tem suporte desde o kernel Linux 3.19, mas o código que leva à vulnerabilidade foi incluído no kernel 5.10.. O protocolo TIPC foi originalmente desenvolvido pela Ericsson, destina-se a organizar a comunicação entre processos em um cluster e é ativado principalmente nos nós do cluster.
TIPC pode funcionar tanto em Ethernet quanto em UDP (porta de rede 6118). No caso de trabalhar através de Ethernet, o ataque pode ser realizado desde a rede local, e no caso de UDP, desde a rede global, se a porta não estiver coberta por firewall. O ataque também pode ser executado por um usuário local sem privilégios no host. Para habilitar o TIPC, você deve carregar o módulo do kernel tipc.ko e configurar o link para a interface de rede usando o netlink ou o utilitário tipc.
O protocolo é implementado em um módulo de kernel empacotado com todas as principais distribuições do Linux. Quando carregado por um usuário, ele pode ser usado como um conector e pode ser configurado em uma interface usando netlink (ou usando a ferramenta de espaço do usuário tipc, que fará essas chamadas de netlink) como um usuário não privilegiado.
O TIPC pode ser configurado para operar sobre um protocolo de suporte, como Ethernet ou UDP (no último caso, o kernel escuta na porta 6118 as mensagens de entrada de qualquer máquina). Uma vez que um usuário com poucos privilégios não pode criar quadros Ethernet brutos, definir o portador como UDP torna mais fácil escrever um exploit local.
A vulnerabilidade se manifesta na função tipc_crypto_key_rc e é causada pela falta de verificação adequada da correspondência entre o que está especificado no cabeçalho e o tamanho real dos dados ao analisar pacotes com o tipo MSG_CRYPTO usado para obter chaves de criptografia de outros nós do cluster para posteriormente descriptografar as mensagens enviadas desses nós.
O tamanho dos dados copiados para a memória é calculado como a diferença entre os valores dos campos com o tamanho da mensagem e o tamanho do cabeçalho, mas sem levar em conta o tamanho real do nome do algoritmo de criptografia transmitido na mensagem e no conteúdo da chave.
O tamanho do nome do algoritmo é considerado fixo e, além disso, um atributo separado com o tamanho é passado para a chave, e o invasor pode especificar um valor neste atributo que difere do valor real, o que levará à gravação em a fila da mensagem fora do buffer alocado.
A vulnerabilidade foi corrigida nos kernels 5.15.0, 5.10.77 e 5.14.16, embora o problema apareça e ainda não tenha sido corrigido no Debian 11, Ubuntu 21.04 / 21.10, SUSE (no ramo SLE15-SP4 ainda não lançado), RHEL (ainda não detalhado se a solução vulnerável foi atualizada) e Fedora.
Embora uma atualização de kernel já foi lançada para Arch Linux e distribuições com kernels anteriores a 5.10, como Debian 10 e Ubuntu 20.04, não são afetadas.
Finalmente se você estiver interessado em saber mais sobre isso, você pode verificar os detalhes no link a seguir.