CVE-2026-52924: Use-After-Free no SCTP no Tratamento de Cookies Obsoletos
Resumo da Vulnerabilidade
ID CVE: CVE-2026-52924
Gravidade: CRÍTICA (CVSS 9.8)
Componente: Kernel Linux - SCTP (Stream Control Transmission Protocol)
Tipo: Use-After-Free (CWE-416, CWE-825)
Publicado: 2026-06-24
Status: Corrigido
Versões Afetadas
- Kernel Linux < 5.10.259
- Kernel Linux < 5.15.210
- Kernel Linux < 6.1.176
- Kernel Linux < 6.6.143
- Kernel Linux < 6.12.94
- Kernel Linux < 6.18.36
- Kernel Linux < 7.0.13
- Kernel Linux < 7.1
Detalhes Técnicos
Causa Raiz
A vulnerabilidade ocorre no tratamento de pacotes COOKIE-ECHO obsoletos pela máquina de estados do SCTP. O problema envolve a limpeza inadequada da fila de transmissão de saída quando uma associação é revertida.
Fluxo do Ataque
- Operação Normal: A associação passa para o estado COOKIE_ECHOED
- Dados do Usuário Enfileirados: A aplicação envia dados, que são enfileirados para transmissão
- Erro de Cookie Obsoleto: O peer remoto envia um erro de Stale Cookie
- Reversão Acionada: A associação reverte de COOKIE_ECHOED → COOKIE_WAIT
- Estado do Stream Atualizado:
sctp_stream_update() libera a tabela de streams antiga e instala uma nova
- Ponteiro Inválido:
stream->out_curr ainda aponta para a entrada sctp_stream_out liberada
- Acesso na Desenfileiração: Quando o escalonador tenta desenfileirar (FCFS, RR, PRIO), ele acessa
out_curr->ext
- Use-After-Free: O acesso à memória liberada → falha do kernel via detecção KASAN
Fluxo de Código Problemático
sctp_sf_do_5_2_6_stale():
├─ Recebe erro de Stale Cookie
├─ Reverte o estado da associação
└─ Chama sctp_stream_update()
├─ Libera a tabela de streams antiga
├─ Instala a nova tabela de streams
└─ BUG: stream->out_curr NÃO é invalidado ❌
Posteriormente, ao desenfileirar:
sctp_sched_fcfs_dequeue():
└─ Acessa stream->out_curr->ext (MEMÓRIA LIBERADA) 💥
Exemplo de Falha
BUG: KASAN: slab-use-after-free in sctp_sched_fcfs_dequeue+0x13a/0x140
Read of size 8 at addr ff1100004d4d3208 by task mini_poc/9312
CPU: 1 UID: 1001 PID: 9312 Comm: mini_poc Not tainted 7.1.0-rc1-00305-gbd3a4795d574 #5 PREEMPT(full)
Call trace:
sctp_sched_fcfs_dequeue+0x13a/0x140
sctp_outq_flush+0x1603/0x33e0
sctp_do_sm+0x31c9/0x5d30
sctp_assoc_bh_rcv+0x392/0x6f0
sctp_inq_push+0x1db/0x270
sctp_rcv+0x138d/0x3c10
Por Que Simplesmente Atualizar out_curr É Insuficiente
Uma correção ingênua poderia ser apenas limpar stream->out_curr:
// CORREÇÃO INSUFICIENTE ❌
stream->out_curr = NULL;
Problema: A fila de saída ainda contém:
- Chunks de dados enfileirados referenciando o estado antigo do stream
- Entradas da fila de retransmissão apontando para streams antigos
- Chunks de controle agrupados com metadados de streams antigos
Essas referências obsoletas ainda causarão use-after-free quando acessadas.
A Correção Correta
Solução: Purgar completamente a fila de saída da associação durante o tratamento de cookies obsoletos.
// CORREÇÃO CORRETA ✓
sctp_outq_free(&asoc->outqueue);
Isso garante:
- Todos os dados de transmissão pendentes são descartados
- Todas as entradas da fila de retransmissão são liberadas
- Ponteiros em cache do escalonador (out_curr, etc.) são invalidados
- O estado do stream pode ser reconstruído com segurança durante o reinício em COOKIE_WAIT
- Nenhuma referência pendente a entradas de stream liberadas
Local da Implementação
Arquivo: net/sctp/sm_statefuns.c
Função: sctp_sf_do_5_2_6_stale()
Adição: Chamar sctp_outq_free(&asoc->outqueue) antes de sctp_stream_update()
enum sctp_disposition sctp_sf_do_5_2_6_stale(...)
{
// ... código existente ...
// Purgar a fila de saída antes de reconstruir o estado do stream
sctp_outq_free(&asoc->outqueue);
// Agora é seguro atualizar o stream
sctp_stream_update(&asoc->stream, &asoc->c.h_init_tag);
// ... restante da função ...
}
Análise de Impacto
Fatores de Gravidade (CVSS 9.8)
- Vetor de Ataque: Rede (CVSS:3.1/AV:N)
- Complexidade do Ataque: Baixa (CVSS:3.1/AC:L)
- Privilégios Necessários: Nenhum (CVSS:3.1/PR:N)
- Interação do Usuário: Nenhuma (CVSS:3.1/UI:N)
- Escopo: Inalterado (CVSS:3.1/S:U)
- Impacto na Confidencialidade: Alto (CVSS:3.1/C:H)
- Impacto na Integridade: Alto (CVSS:3.1/I:H)
- Impacto na Disponibilidade: Alto (CVSS:3.1/A:H)
Requisitos de Exploração
- Acesso de rede ao sistema alvo (porta SCTP aberta)
- Capacidade de enviar pacotes SCTP para estabelecer conexão
- Enviar erro de Stale Cookie em um momento específico (estado COOKIE_ECHOED)
- Acionar a operação de desenfileiramento do escalonador
Cenários de Ataque
- Negação de Serviço: Derrubar o kernel repetidamente → DoS
- Divulgação de Informações: Ler memória do kernel via UAF
- Escalação de Privilégios: Potencial por meio de manipulação de memória
- Execução Remota de Código: Possível com exploração de corrupção de memória
Métodos de Detecção
Detecção KASAN (Tempo de Execução)
# Habilitar KASAN na configuração do kernel
CONFIG_KASAN=y
CONFIG_KASAN_GENERIC=y
# A saída em tempo de execução mostra:
BUG: KASAN: slab-use-after-free
Análise Estática
# Procurar acesso inseguro a stream->out_curr sem validação
grep -r "out_curr->ext" net/sctp/
grep -r "out_curr->" net/sctp/sched*.c
Detecção de Rede
- Monitorar pacotes de erro SCTP Stale Cookie (Tipo 3, Código 1)
- Rastrear padrões de reversão de conexão
- Alertar sobre transições rápidas COOKIE_ECHOED → COOKIE_WAIT
Estratégias de Mitigação
Mitigações Temporárias (Até a Correção)
-
Desabilitar SCTP: Remover o módulo SCTP ou bloquear as portas SCTP (132, 132 UDP)
echo "install sctp /bin/true" >> /etc/modprobe.d/sctp-disable.conf
-
Regras de Firewall: Bloquear tráfego SCTP no limite da rede
iptables -A INPUT -p sctp -j DROP
-
Versão do Kernel: Atualizar para versões corrigidas
- 5.10.259+
- 5.15.210+
- 6.1.176+
- 6.6.143+
- 6.12.94+
- 6.18.36+
- 7.0.13+
- 7.1+ (mais recente)
Correção Permanente
Aplicar o patch do kernel que chama sctp_outq_free() em sctp_sf_do_5_2_6_stale().
Referências
Recomendações de Teste
Testes Unitários
- Verificar se
sctp_outq_free() invalida corretamente out_curr
- Verificar se todos os dados enfileirados são liberados durante outq_free
- Verificar se a fila de retransmissão é limpa
- Testar o comportamento do escalonador após a purga da outq
Testes de Integração
- Fluxo normal de recuperação de cookie obsoleto
- Dados em trânsito quando o cookie obsoleto é recebido
- Múltiplos cookies obsoletos rápidos
- Diferentes escalonadores SCTP (FCFS, RR, PRIO)
Testes de Fuzzing
- Enviar pacotes SCTP com erros de cookie obsoleto
- Variar o momento da injeção do erro
- Variar a quantidade de dados em trânsito
- Testar sob condições de alta carga
Linha do Tempo
- 2026-06-24: Vulnerabilidade divulgada publicamente
- Status: Correção disponível
- Pontuação EPSS: 0,3% (percentil 27)
- Baixa probabilidade de exploração
- Requer condições de rede específicas
- Poucos exploits do mundo real indexados
Autor: Elliot
Versão do Documento: 1.0
Última Atualização: 2026-09-07
Classificação: Informação Pública