AI Hacking - Como os hackers utilizam a inteligência artificial nos ciberataques

Ler agora
Utilizamos inteligência artificial para as traduções dos sítios e, embora nos esforcemos por garantir a exatidão, estas podem nem sempre ser 100% precisas. Agradecemos a sua compreensão.

Análise abrangente do CVE-2024-38063: Uma ameaça crítica na pilha TCP/IP do Windows

por OPSWAT
Partilhar esta publicação
Fotografia do participante no programa de bolsas de estudo OPSWAT , Pham Ngoc Thien

Em 13 de agosto de 2024, o MSTC (Microsoft Security Response Center) divulgou o CVE-2024-38063, uma vulnerabilidade crítica na pilha TCP/IP do Windows que pode ser explorada para comprometer funções vitais de rede dentro do sistema operacional. Aqui, os participantes no OPSWAT Graduate Fellowship Program apresentam uma análise aprofundada dos pormenores técnicos e do potencial impacto desta falha, bem como as estratégias de atenuação recomendadas para esta vulnerabilidade.

Participantes do programa de bolsas de estudo OPSWAT : Pham Ngoc Thien - Universidade de Tecnologia da Informação de Ho Chi Minh 

Visão geral

A CVE-2024-38063 é uma vulnerabilidade crítica da pilha TCP/IP do Windows com uma pontuação CVSS de 9,8, que afecta o processamento de pacotes IPv6. Os atacantes remotos podem explorar esta vulnerabilidade utilizando um underflow de inteiro ao manipular cabeçalhos de extensão IPv6 para executar código malicioso ou causar um DoS (Negação de Serviço).

Uma vez que o IPv6 está ativado por defeito na maioria dos sistemas modernos, esta falha de clique zero representa um risco substancial. Como resultado, todas as versões não corrigidas do Windows 10, Windows 11 e Windows Server 2008, 2012, 2016, 2019 e 2022 com IPv6 ativado são vulneráveis a este CVE.

Diagrama que mostra o impacto do CVE-2024-38063 nas funções de rede do Windows

Conceitos-chave

Pilha TCP/IP do Windows

A pilha TCP/IP do Windows é um componente fundamental do sistema operativo responsável pela comunicação em rede através do conjunto de protocolos TCP/IP (Transmission Control Protocol/Internet Protocol). Ela lida com todas as interações de rede, facilitando a comunicação entre dispositivos em redes locais e globais.

Captura de ecrã da arquitetura da pilha TCP/IP do Windows

IPv6 e cabeçalhos de extensão

O IPv6 foi desenvolvido para resolver as limitações do IPv4. Introduziu várias melhorias, como a modularidade e a flexibilidade, através de cabeçalhos de extensão. Os cabeçalhos, posicionados entre o cabeçalho IPv6 e a carga útil, suportam dados opcionais e funcionalidades avançadas.

Os principais cabeçalhos de extensão IPv6 incluem:

  • Opções Hop-by-Hop (Cabeçalho seguinte = 0) 
  • Cabeçalho de encaminhamento (Cabeçalho seguinte = 43) 
  • Cabeçalho de fragmento (Cabeçalho seguinte = 44) 
  • Cabeçalho das opções de destino (Cabeçalho seguinte = 60) 
  • Cabeçalho de autenticação (AH) (Cabeçalho seguinte = 51) 
  • Encapsulamento de carga de segurança (ESP) (Cabeçalho seguinte = 50) 

Cada cabeçalho de extensão aponta para o seguinte através do campo Next Header, criando uma cadeia sequencial. Esta modularidade introduz complexidade no processo de tratamento dos pacotes e potenciais vectores de exploração.

Diagrama que descreve os cabeçalhos de extensão IPv6 e a estrutura dos pacotes
Formato de um datagrama IPv6

Subfluxo de número inteiro

Um subfluxo de um número inteiro ocorre quando um cálculo produz um valor mais pequeno do que o valor mínimo representável para um tipo de dados. Por exemplo, a subtração de um valor maior a um valor menor para um número inteiro sem sinal pode fazer com que o resultado se torne um valor positivo muito grande.

Um estouro de número inteiro ocorre quando o valor excede o limite máximo do tipo de dados e "transborda" de volta para o valor mínimo representável (por exemplo, 0 num intervalo de 0-10). Ambos os cenários ocorrem devido ao tratamento incorreto das condições de limite nas operações aritméticas, conduzindo a graves vulnerabilidades nos sistemas de software.

Diagrama que explica o underflow e overflow de números inteiros no processamento de dados

Análise de vulnerabilidade

O fluxo de trabalho do processamento do IPv6

Depois de receber um pacote IPv6, o Windows analisa primeiro o cabeçalho IPv6. Em seguida, a função IppReceiveHeaderBatch verifica o valor do campo Next Header para escolher o manipulador apropriado para os cabeçalhos subsequentes. Para cada cabeçalho de extensão na cadeia, IppReceiveHeaderBatch invoca a rotina correspondente para processar esse cabeçalho específico.

Diagrama que descreve o fluxo de trabalho de processamento de pacotes IPv6 no Windows

Apesar da conceção flexível e modular deste mecanismo, ele introduz um potencial vetor de ataque. No IPv6, os pacotes fragmentados são normalmente remontados no seu destino, onde existe uma vulnerabilidade no processo de remontagem de fragmentos e no tratamento do cabeçalho.

Um atacante pode induzir a má gestão da memória e despoletar um buffer overflow enviando inúmeros pacotes malformados com cabeçalhos de extensão manipulados. Isto permite que o excesso de dados substitua regiões de memória não pretendidas, o que potencialmente permite a execução de código arbitrário. Esta vulnerabilidade é identificada como CVE-2024-38063.

Diagrama ilustrando o risco de estouro de buffer de pacotes IPv6 malformados

Falha crítica na pilha TCP/IP do Windows

A correção da Microsoft para resolver a vulnerabilidade CVE-2024-38063 foi cuidadosamente examinada pelo investigador de segurança Marcus Hutchins. O seu blogue técnico oferece informações detalhadas sobre a causa principal desta vulnerabilidade. Com base nas suas descobertas, o nosso colega explorou ainda mais o problema para obter uma compreensão completa da exploração.

Análise de patches

O patch incluía uma atualização do ficheiro tcpip.sys, incluindo uma modificação na função Ipv6pProcessOptions. Uma alteração de uma única linha substituiu uma chamada de IppSendErrorList() por uma chamada para IppSendError(), indicando que IppSendErrorList() pode ter contribuído para o CVE.

Captura de ecrã do código que mostra o tcpip.sys antes do patch para o CVE-2024-38063
Figura 1. Antes do remendo
Captura de ecrã do código que mostra o tcpip.sys após a correção do CVE-2024-38063
Figura 2. Após o remendo

Tamanho zero do pacote

Um exame mais detalhado da função IppSendErrorList() revelou que ela processa uma lista ligada de pacotes invocando a função IppSendError() para cada um. A função IppSendError() atribui aos pacotes defeituosos o status STATUS_DATA_NOT_ACCEPTED. Então, ela cria uma mensagem de erro ICMP contendo informações sobre o pacote problemático e a envia de volta. No entanto, quando IppSendErrorList() é invocada com always_send_icmp = true em vários pacotes, ela define o campo packet_size como zero para cada pacote.

Captura de ecrã do código que mostra a função IppSendErrorList a definir o tamanho do pacote para zero

A função Ipv6pProcessOptions foi concebida para processar cabeçalhos de extensão que contêm campos de valor de opção, incluindo os cabeçalhos Hop-by-Hop Options e Destination Options. Ao definir o Tipo de Opção para qualquer valor superior a 0x80, um atacante pode desencadear um erro específico no processamento do cabeçalho de opções, forçando o always_send_icmp a ser definido como verdadeiro e, consequentemente, resultando na definição do tamanho do pacote como zero.

Captura de ecrã do código que ilustra a manipulação do campo IPv6 Next Header para exploração

Embora um pacote de tamanho zero seja normalmente descartado, um atacante pode manipular o campo Next Header no pacote IPv6 original. Esta manipulação permite aos atacantes obter controlo sobre a interpretação do pacote nas fases de processamento subsequentes, evitando a rejeição imediata e criando uma oportunidade de exploração. 

Diagrama que descreve o controlo do atacante sobre o processamento de pacotes IPv6

Subfluxo de números inteiros no processamento de fragmentos

Ao definir o campo Next Header como 44, indicando um Fragment Header, um pacote é tratado pelas rotinas de fragmentação ou remontagem do IPv6. Quando o pacote chega ao analisador de fragmentos, Ipv6pReceiveFragment(), ele especifica que: 

  • O tamanho do pacote é zero. 
  • O cabeçalho do fragmento indica que ainda há dados adicionais a serem processados. 

Na função Ipv6pReceiveFragment(), o tamanho da atribuição para fragment_size é calculado subtraindo 0x30 (comprimento do cabeçalho do pacote) ao tamanho do pacote sem qualquer validação. Se o tamanho do pacote for zero, esta subtração não é suficiente, resultando num valor grande de 16 bits (cerca de 0xFFD0 ou 65488), o que faz com que o analisador processe uma memória excessiva fora dos limites válidos do pacote e leva à corrupção da memória. 

Captura de ecrã do código que mostra um underflow de inteiro no processamento de fragmentos IPv6
Figura 3 Subfluxo de números inteiros no processamento de fragmentos

Do underflow ao overflow e ao desajuste na afetação

A função Ipv6pReassemblyTimeout() é responsável pela limpeza de fragmentos IPv6 incompletos após um tempo especificado, usando aritmética de 16 bits para determinar tamanhos de buffer e operações de cópia. Devido ao underflow no passo anterior, em que o packet_length ou o fragment_size se torna 0xFFD0, ocorre um overflow durante a atribuição.  

O cálculo resultante faz com que o registo seja reposto a zero, levando à atribuição de apenas 48 bytes de memória. No entanto, como a quantidade de dados copiados (65.488 bytes de reassembly->payload) não corresponde à memória alocada, ocorre um estouro de buffer controlável no pool do kernel. 

Captura de ecrã do código que ilustra o transbordamento da memória intermédia devido a uma incompatibilidade na atribuição de memória

Esta discrepância abre a porta a que os atacantes executem código malicioso através de um pacote especialmente criado que explora a vulnerabilidade no processamento do IPv6.

CVE-2024-38963 Prova de conceito 

Numa tentativa de reproduzir a vulnerabilidade CVE-2024-38963, os nossos colegas criaram uma série de pacotes malformados concebidos para explorar a falha. O processo que seguiram foi o seguinte:

1. Criação de pacotes IPv6 malformados

Inserir um cabeçalho de extensão IPv6 Destination Options (tipo 60) a seguir ao cabeçalho IPv6 de base e, em seguida, incorporar uma opção inválida (por exemplo, tipo de opção 0x81). 

Esta manipulação força o kernel do Windows (tcpip.sys) a definir always_send_icmp = true, accionando a geração de erros ICMPv6 através da rotina IppSendErrorList().

2. Forçar o processamento da lista de tampões líquidos (NBL)

Inundar o alvo com rajadas rápidas destes pacotes malformados aumentou as hipóteses de o kernel agrupar vários pacotes numa única Net-Buffer List (NBL). Quando dois ou mais pacotes são agrupados, o loop vulnerável IppSendErrorList() é ativado, redefinindo incorretamente os metadados DataLength e Offset nos fragmentos subsequentes (o tamanho do pacote é agora zero). 

3. Injectando Pacotes IPv6 Fragmentados

Após a transmissão de pacotes malformados, são enviados pacotes IPv6 fragmentados que incluem cabeçalhos de extensão Fragment. Estes fragmentos são processados utilizando os valores DataLength já corrompidos. 

4. Explorando o tempo limite de remontagem

O kernel retém os fragmentos durante 60 segundos (geridos pelo Ipv6pReassemblyTimeout) para permitir a remontagem dos pacotes. Durante este tempo limite, os valores DataLength corrompidos desencadeiam um underflow inteiro no Ipv6pReceiveFragment, resultando num tamanho de fragmento incorretamente calculado (excessivamente grande).

5. Desencadeando o estouro do buffer de heap

O kernel aloca um buffer heap baseado nos valores underflowed. Dois cálculos diferentes ocorrem durante o processo de remontagem: um determina o tamanho da alocação de memória (que, devido a um estouro de 16 bits, torna-se muito pequeno), e o outro calcula o comprimento da cópia usando o valor grande e estourado.

Essa incompatibilidade leva a uma gravação fora dos limites, causando um estouro de buffer baseado em heap que pode ser explorado para acionar uma negação de serviço (DoS) ou execução remota de código.

Diagrama que descreve a exploração de prova de conceito para o CVE-2024-38063

O código fonte utilizado para reproduzir este CVE para um ataque de negação de serviço:

Quando esta vulnerabilidade é explorada por um atacante, o sistema da vítima pode falhar imediatamente, resultando num ecrã azul da morte: 

Captura de ecrã da interface do utilizador que mostra o ecrã azul de morte do Windows após a exploração CVE-2024-38063

Remediação

Negligenciar a atualização regular do seu sistema operativo expõe o seu dispositivo a ameaças de segurança, incluindo as ligadas a CVEs (Vulnerabilidades e Exposições Comuns). Para mitigar esses riscos, MetaDefender Endpoint™ oferece proteção robusta ao detetar a versão do seu sistema operacional e verificar vulnerabilidades, incluindo CVEs conhecidos, como o CVE-2024-38063. 

MetaDefender Endpoint foi concebido para proteger os dispositivos dentro de redes críticas de TI/OT contra ameaças de periféricos e suportes amovíveis. Garante que o seu sistema operativo e as aplicações instaladas estão actualizados, assinala quaisquer versões desactualizadas ou vulneráveis e lista as aplicações com vulnerabilidades conhecidas e CVEs, juntamente com as correcções recomendadas. Também ajuda a proteger os dispositivos contra riscos de mídia removível, bloqueando o acesso a unidades USB até que sejam verificadas e consideradas limpas usando vários mecanismos antimalware, enquanto executa o Deep CDR™ em mais de 180 tipos de arquivos.  

Fale com um dos nossos especialistas hoje para ver como MetaDefender Endpoint pode transformar a sua postura de segurança com inteligência líder do sector. 

Mantenha-se atualizado com OPSWAT!

Inscreva-se hoje para receber as últimas actualizações da empresa, histórias, informações sobre eventos e muito mais.