
kpatch livepatch para CVE-2026-98432 (e CVE-2026-99999) no AlmaLinux e Rocky Linux 8, 9 e 10
Módulos livepatch que corrigem a CVE-2026-98432 em um host AlmaLinux ou Rocky Linux 8, 9 ou 10 (x86_64) em execução, sem reinicialização. Em kernels que também não possuem a correção para a CVE-2026-99999, o mesmo módulo corrige essa também, de modo que um host precisa de um único módulo, seja qual for das duas que seu kernel não tenha.
Status (2026-11-02): todos os módulos estão compilados e testados quanto ao carregamento; nenhum foi
lançado ainda, portanto não há nada a aplicar. O lançamento, e um teste
do comando de uma linha em cada módulo lançado, vêm a seguir; até lá
scripts/livepatch.sh não tem módulos em sua tabela e recusa todos os
kernels.
684 kernels: 380 do AlmaLinux e 304 do Rocky Linux, de 8.3 a 10.2,
listados em tools/kernels.tsv. Trata-se de todos os kernels cujos SRPM e
debuginfo estão nos espelhos da distribuição (incluindo o vault), somente x86_64,
exceto o 5.14.0-611.41.1.el9_7 do Rocky, cujo debuginfo não está em nenhum
espelho. Inclui o único kernel 8.3 do Rocky, 4.18.0-240.22.1.el8, que
o repositório anterior do Rocky não cobria, e os kernels que ambas as
distribuições lançaram após os repositórios anteriores, até
4.18.0-553.180.1.el8_10 (AlmaLinux), 5.14.0-687.61.1.el9_8 e
6.12.0-211.69.1.el10_2. A variante x86_64_v2 do AlmaLinux 10 não é coberta.
666 dos 684 também não possuem a correção para a CVE-2026-99999, e seu módulo carrega ambas. Os outros 18 já a possuem (a partir do AlmaLinux 4.18.0-553.177.1.el8_10 e do Rocky 553.178.1.el8_10, e a partir de 5.14.0-687.59.1.el9_8 e 6.12.0-211.67.1.el10_2 em ambos), e seu módulo carrega apenas a alteração da CVE-2026-98432.
Cada módulo foi compilado em CI e aplicado com scripts/livepatch.sh ao
seu kernel de distribuição em uma VM (tools/loadtest.sh), em 2026-10-31, uma execução
por distribuição e versão menor, 40 execuções; todos os 684 imprimiram RESULT: PASS.
Em cada um:
inet_sock_destruct e tcp_v4_reqsk_destructor estão listadas como
funções corrigidas do vmlinux.tools/tcpopt.py). Isso aciona ambas as liberações
que a correção altera com as opções presentes; sem opções IP elas liberam
apenas NULL.nfnetlink_queue e xt_CHECKSUM (e no 9 e 10
nf_conntrack_bridge). No 8 e 9 (511 kernels, e o 8.3 do Rocky) um
frame forjado foi fragmentado pelo kernel de distribuição e descartado com o
módulo aplicado. No 10 (154 kernels) o frame é recusado antes de
atingir a falha, então essa sonda não diz nada em nenhum dos sentidos ali.Não testado: a própria condição de corrida. Demonstrar a CVE-2026-98432 no kernel
de distribuição e sua ausência com o módulo exige KASAN e um entrelaçamento
artificial de um SYN retransmitido com a liberação do filho; isso
não acontece sob demanda nessas VMs. Nem qualquer módulo foi testado com Secure
Boot ativado (ele não é assinado e seria recusado), ou carregado no boot pelo
kpatch.service.
tools/mkdiffs.sh faz o port de cada SRPM de kernel de uma versão menor. Ele primeiro aplica
os próprios patches do SRPM ao seu tarball, como %prep faz
(tools/prep.py): o AlmaLinux carrega suas próprias correções dessa forma, entre elas
a da CVE-2026-99999 em 4.18.0-553.177.1.el8_10, e o 6.12.0-211.69.1 do 10.2
é o tarball 211.56.1 da Red Hat mais 466 patches, então um port feito
contra o tarball puro perderia o que o kernel tem. As linhas alteradas
são então verificadas contra tools/ref/: as da CVE-2026-98432 devem ser iguais
às do upstream, as da CVE-2026-99999 ao patch do AlmaLinux para 8 ou 9 ou ao do upstream
para 10, ou estar ausentes onde o kernel tem essa correção. Todos os 684
corresponderam. tools/port.py também para se o kfree_rcu() da árvore não
pular um ponteiro NULL, como ambos os ponteiros geralmente são.
8 e 9 são construídos com kpatch-build, 10 com o próprio klp-build do kernel; ambos constroem patches de substituição, que é como um módulo assume o lugar de um anterior.
A correção upstream é torvalds/linux e3f33b0a1d89, "ipv4: free inet_opt and
ireq_opt after an RCU grace period". Quando um SYN carrega opções IP, o
listener as mantém no socket de requisição (ireq_opt) e as repassa ao
socket filho (inet_opt) sem copiar. Um SYN retransmitido para a
mesma requisição pode ser respondido com um SYN-ACK em outra CPU, lendo essas
opções sob RCU, enquanto o filho é fechado e inet_sock_destruct()
as libera com um kfree() simples: um use after free. A migração do
socket de requisição tem o mesmo problema em tcp_v4_reqsk_destructor(). A correção
libera ambos com kfree_rcu().
Nenhuma das distribuições lançou a correção: em 2026-10-27 os kernels
mais recentes do AlmaLinux e do Rocky Linux 8, 9 e 10 não mencionavam a CVE em
seus changelogs, e os códigos-fonte de 4.18.0-305.3.1.el8_4,
4.18.0-553.179.1.el8_10, 5.14.0-687.61.1.el9_8 e 6.12.0-211.68.1.el10_2
ainda liberam ambos os ponteiros com kfree().
Corrigida anteriormente, separadamente para cada distribuição, por nsrg-fmlorg/kpatch-alma-cve-2026-99999 e nsrg-fmlorg/kpatch-rocky-cve-2026-99999. Ambas as distribuições agora lançam kernels com essa correção, a partir de 4.18.0-553.177.1.el8_10 (AlmaLinux) ou 553.178.1.el8_10 (Rocky), 5.14.0-687.59.1.el9_8 e 6.12.0-211.67.1.el10_2 em diante. Onde um kernel não a possui, o módulo deste repositório carrega a mesma alteração que os anteriores, e substitui um módulo anterior já carregado (testado em cada um dos 665 kernels que tinham um, acima).