NetCatTest

Zero-Day & Exploits

CVE-2024-38063: IPv6, driver TCP/IP e risco de RCE no Windows

Como pacotes IPv6 alcançam a pilha TCP/IP: underflow, limites de parsing, inventário de builds e correções revisadas para auditar CVE-2024-38063.

Por Daniel Felipe 10 min leitura

Uma vulnerabilidade de rede pode alcançar código do sistema antes de existir uma sessão de aplicação. A CVE-2024-38063 é um caso útil para entender essa fronteira: a entrada é um pacote IPv6, e o componente afetado faz parte da pilha TCP/IP do Windows. O problema não depende de uma página web vulnerável nem de o usuário abrir um arquivo.

O aviso da Microsoft para CVE-2024-38063, publicado em 13 de agosto de 2024, descreve risco de execução remota de código por pacotes IPv6 especialmente preparados, sem autenticação, com CVSS 9,8 e classificação CWE-191. Trata-se de um estudo técnico de uma falha histórica, publicado em 2026 para apoiar inventário e auditoria. A presença de IPv6, isoladamente, não comprova exploração.

Um parser correto mantém limites entre cada camada

O código completo do driver TCP/IP afetado não foi publicado pela Microsoft como uma reprodução oficial desta falha. Por isso, o exemplo abaixo é um parser didático de cabeçalhos de extensão comuns e não o algoritmo vulnerável da CVE-2024-38063. Ele ajuda a analisar invariantes sem alegar uma cadeia de RCE não demonstrada.

Em cabeçalhos como Hop-by-Hop, Routing e Destination Options, o campo de comprimento representa unidades de oito octetos além da unidade inicial. A interpretação não é universal: Fragment tem tamanho fixo, AH usa outra fórmula e ESP requer tratamento próprio. O algoritmo deve despachar pelo tipo antes de calcular o tamanho.

def avancar_extensao_comum(pacote, cursor, fim):
    if cursor < 0 or fim > len(pacote) or cursor + 2 > fim:
        raise ValueError('cabecalho indisponivel')
    tamanho = (pacote[cursor + 1] + 1) * 8
    if tamanho > fim - cursor:
        raise ValueError('extensao ultrapassa o payload')
    return pacote[cursor], cursor + tamanho

tipo, cursor = avancar_extensao_comum(bytes([59, 0]) + bytes(6), 0, 8)
assert tipo == 59 and cursor == 8
try:
    avancar_extensao_comum(bytes([59, 1]) + bytes(6), 0, 8)
except ValueError:
    print('comprimento recusado')

A comparação usa fim - cursor após validar a ordem dos limites. Em linguagens de largura fixa, somar primeiro e comparar depois pode permitir overflow; o comprimento precisa ser validado antes de qualquer alocação ou cópia. Um parser também deve limitar o número de extensões para evitar trabalho desproporcional.

Esse exemplo cobre um invariante de formato, não fragmentação, reassembly, jumbograms ou todas as regras de IPv6. O parser completo precisa manter separadas a quantidade capturada, a declarada no cabeçalho IPv6 e a disponível no buffer após cada etapa. Uma captura truncada não deve ser interpretada como pacote completo.

Em uma análise de driver fechado, evidência forte combina versão do binário, atualização aplicável, comportamento controlado e, quando disponível, análise diferencial da função. A descrição pública do CVE não autoriza inventar offsets, layout de heap ou uma condição específica de exploração. A disciplina é explicar o que o formato exige e registrar o que ainda depende de engenharia reversa ou teste.

Ilustração de adaptador de rede genérico e camadas de processamento de protocolos

Ilustração conceitual gerada de adaptador e camadas de processamento. A placa não representa um modelo afetado; o caso analisado envolve a pilha TCP/IP do Windows, não uma identificação visual de defeito no hardware.

Driver de placa, pilha TCP/IP e aplicação são superfícies diferentes

Quando alguém fala em “falha no driver de rede”, vale identificar qual componente está recebendo o dado. O driver do adaptador, os filtros de rede, a pilha de protocolos e o serviço que recebe uma conexão são peças diferentes. Uma atualização do fabricante da placa não substitui automaticamente uma correção da implementação TCP/IP do sistema.

Para organizar uma avaliação, desenhe o percurso real do pacote no ambiente. Inclua interface física ou virtual, filtros instalados, configuração IPv6 e aplicação de destino. Esse desenho é um instrumento de investigação; a ordem interna de cada filtro precisa ser verificada na implementação utilizada. Não suponha que uma regra de firewall de aplicação elimina todos os caminhos de processamento do kernel.

Pacote recebido pela interface
        ↓
Componentes de recepção e filtros
        ↓
Interpretação dos protocolos de rede
        ↓
Entrega ao transporte e à aplicação

Pergunta da auditoria:
qual componente interpreta cada campo e com qual versão?

O papel dos comprimentos e cabeçalhos de extensão no IPv6

O RFC 8200 define um cabeçalho básico IPv6 de 40 bytes, seguido pelo conteúdo indicado em Next Header. Cabeçalhos de extensão podem formar uma cadeia antes do transporte. O campo Payload Length contabiliza o conteúdo posterior ao cabeçalho básico, incluindo extensões quando presentes. Fragmentação tem um cabeçalho próprio; roteadores não fragmentam pacotes IPv6 durante o encaminhamento.

Para quem audita um parser, isso cria relações que devem permanecer coerentes: comprimento disponível, comprimento declarado, posição atual e quantidade consumida. A questão interessante é o que acontece quando um caminho de erro altera uma dessas relações, enquanto outra parte do processamento continua usando o valor anterior. Essa é uma hipótese de teste de implementação, não uma descrição de um gatilho confirmado para esta CVE.

Integer underflow: quando subtrair produz um número enorme

A CWE-191 descreve resultados de subtração que ficam abaixo da faixa representável. Em tipos inteiros sem sinal, a aritmética modular pode transformar um resultado negativo em um valor positivo muito grande. Se esse valor chegar a uma operação de memória sem validação adequada, a consequência pode ultrapassar um erro de protocolo.

O exemplo abaixo é uma demonstração matemática local. Não envia pacotes, não reproduz CVE-2024-38063 e usa 16 bits apenas para deixar o resultado legível. O objetivo é visualizar por que a validação precisa ocorrer antes da operação, com os mesmos limites utilizados por quem consumirá o resultado.

disponivel = 4
consumido = 8
resultado_matematico = disponivel - consumido
resultado_em_16_bits = resultado_matematico & 0xffff

print(resultado_matematico)
print(resultado_em_16_bits)

if consumido > disponivel:
    print("comprimento rejeitado antes da subtração")

Os resultados são -4, 65532 e uma rejeição explícita. Não existe, nesse exemplo, um buffer vulnerável. Em uma revisão de código, procure o fluxo completo: origem do comprimento, conversões de tipo, subtrações, caminhos de erro e operações posteriores. Encontrar uma subtração sem sinal, por si só, não demonstra que ela seja explorável.

A revisão de setembro muda o critério de correção

O histórico oficial do MSRC registra uma revisão em 10 de setembro de 2024. Para Windows 10 1809, Windows Server 2019, Windows Server 2022 e Windows 11 21H2, a Microsoft publicou atualizações adicionais para tratar a vulnerabilidade de forma abrangente. Essa informação aparece também na publicação estruturada do MSRC.

Por isso, uma auditoria não deve encerrar o caso apenas porque encontrou uma atualização de agosto. Relacione edição, arquitetura, build instalado e histórico revisado do fabricante. Use a atualização cumulativa atualmente aplicável àquela instalação, em um canal de suporte válido. Os números de correção de 2024 são referências históricas; não representam a atualização mais recente disponível em outubro de 2026.

Inventário local: o que conferir sem enviar um pacote malformado

Um levantamento inicial pode ser feito com consultas locais de leitura. Os comandos abaixo ajudam a reunir sistema, interfaces e versão do arquivo TCP/IP. Execute no host avaliado ou em uma sessão administrativa autorizada. A lista de hotfixes é um indício auxiliar: ela não cobre, sozinha, todas as formas de manutenção e composição de uma imagem Windows.

Get-CimInstance Win32_OperatingSystem |
    Select-Object Caption, Version, BuildNumber, OSArchitecture

Get-NetAdapterBinding -ComponentID ms_tcpip6 |
    Select-Object Name, Enabled

Get-NetIPInterface -AddressFamily IPv6 |
    Select-Object InterfaceAlias, ConnectionState, InterfaceMetric

(Get-Item "$env:windir\System32\drivers\tcpip.sys").VersionInfo |
    Select-Object FileVersion, ProductVersion

Get-HotFix | Sort-Object InstalledOn -Descending |
    Select-Object -First 10 HotFixID, InstalledOn

Guarde a coleta junto da identificação do ativo e do horário. Verifique interfaces virtuais, VPNs e caminhos de administração, além da placa principal. Uma interface habilitada não prova alcance a partir da Internet; uma interface sem endereço global também não elimina exposição em um segmento local.

Separe componente afetado, alcance e impacto

ObservaçãoConclusão sustentadaPróxima evidência
IPv6 habilitadoProtocolo disponível naquela interfaceBuild e caminho de entrada
Build incluído no aviso, sem correção comprovadaComponente potencialmente afetadoCorrespondência com atualizações revisadas
Tráfego legítimo chega ao host no segmento autorizadoAlcançabilidade daquele caminhoPolítica aplicada a outros formatos
Reinicialização após um testeFalha operacional correlacionadaCausa e rastros independentes
Build corrigido e regressão aprovadaCorreção documentada no ativoVerificação de imagens e hosts equivalentes

Esse encadeamento evita transformar um fingerprint em RCE confirmada. Também impede a conclusão inversa: um teste que não derrubou a máquina não prova que todos os caminhos vulneráveis desapareceram. Um reteste só cobre o caso, o ambiente e a observabilidade registrados.

Laboratório diferencial e coleta de evidências

Um desenho de laboratório útil compara duas máquinas descartáveis com a mesma edição, configuração e adaptadores virtuais, diferenciadas pela atualização do sistema. Identifique cada imagem e mantenha a rede isolada. Antes de qualquer teste de robustez, defina interrupção, restauração e captura, porque uma falha da pilha pode cortar a própria sessão de administração.

Compare comportamento legítimo antes e depois da atualização. Se um pacote for descartado, determine se a decisão ocorreu no gerador, na rede intermediária ou no destino. Offloads e agregação de recepção podem modificar o que a captura mostra; um arquivo coletado na origem não é prova suficiente do conteúdo entregue ao componente analisado. Registre o ponto de captura e a configuração que pode influenciá-lo.

Para estudar parsers novos, organize casos por propriedade: tamanhos nas fronteiras válidas, campos inconsistentes, cadeias de extensão e caminhos de erro. Mantenha cada variável separada e capture o resultado. Essa matriz é uma proposta de auditoria, sem alegação de reprodução de exploração nesta matéria.

Mitigação que mantém a rede funcional

A ação principal é corrigir o sistema e confirmar o artefato efetivamente instalado. A documentação de configuração IPv6 da Microsoft alerta contra desabilitar ou desvincular IPv6 indiscriminadamente, por possíveis efeitos em componentes do Windows. Uma contingência precisa considerar dependências e ter prazo para substituição pela atualização.

Revise a política dos dois protocolos, os segmentos de administração e as interfaces que realmente precisam receber tráfego. Ao fechar o achado, entregue build, atualização, data, caminho avaliado e limitações do reteste. A lição operacional desta CVE é verificar onde bytes da rede viram comprimentos e operações de memória, e provar a correção no componente que executa esse trabalho.

Escrito por

Daniel Felipe é criador do NetCatTest e produz conteúdos sobre cibersegurança, privacidade digital, OSINT, laboratórios autorizados e ferramentas para estudo técnico responsável.

Compartilhar

Enviar este artigo