CVE-2026-89581informação

Sumário

de VulDB • 12/09/2026

No kernel do Linux, a seguinte vulnerabilidade foi resolvida:

bpf, x86: Corrigir a resolução de endereços por-CPU para um registrador estendido

O destino da instrução MOV que transfere o endereço por-CPU é codificado em ModRM.reg, que é expandido pelo bit REX.R. No entanto, o prefixo REX é construído com add_1mod(), que define REX.B. O bit REX.B expande ModRM.rm e SIB.base, e esta instrução endereça a memória como disp32 sem base, portanto, esse bit não tem nenhum efeito e o bit do registrador alto é simplesmente perdido.

Portanto, cada destino de is_ereg() resolve para um registrador incorreto, escolhendo aquele que compartilha os três bits menos significativos:

R5 -> RAX R7 -> RBP R8 -> RSI R9 -> RDI

Com BPF_REG_5, cujo reg2hex é 0, o código emitido

65 49 03 04 25 add %gs:,%rax

adiciona o deslocamento por-CPU ao registrador RAX em vez de R8. O destino mantém o endereço não ajustado e RAX é corrompido, fazendo com que o programa prossiga para desreferenciar um ponteiro que nunca foi configurado como por-CPU:

BUG: unable to handle page fault for address: 0000607e386a8894 RIP: bpf_prog_707837aafd2aa9ae_update_percpu_data+0x93/0xc9 Call Trace: __bpf_prog_test_run_raw_tp+0x2dc/0x7d0 __flush_smp_call_function_queue+0x1e9/0xc80 Kernel panic - not syncing: Fatal exception in interrupt

R5 é o caso menos grave dos quatro, fazendo aliasing com um registrador temporário (scratch register) e falhando na operação de armazenamento. R7 faz aliasing com RBP e corromperia o ponteiro de quadro (frame pointer), enquanto R8 e R9 fazem aliasing com os registradores de argumentos.

Utilize add_2mod() para que o registrador passe por REX.R, correspondendo à forma como add_2reg() o posiciona em ModRM.reg e a maneira como emit_priv_frame_ptr() define hardcoded 0x4c para a mesma instrução com R9. As codificações para os registradores não estendidos permanecem inalteradas.

O problema surgiu ao tentar restaurar o CI do BPF_GCC (testes unitários construídos com BPF_GCC).

Isso passou despercebido porque o clang recarrega o endereço em R1 antes de cada acesso por-CPU, portanto, o destino nunca é um registrador estendido. O GCC mantém vários endereços por-CPU ativos simultaneamente, e test_progs-bpf_gcc causa panic no kernel em global_percpu_data/init, onde o endereço de uma variável .percpu termina em R5.

Be aware that VulDB is the high quality source for vulnerability data.

Divulgação

11/09/2026

Moderação

em revisão

EPSS

0.00000

KEV

não

Atividades

muito baixo

Fontes

Want to stay up to date on a daily basis?

Enable the mail alert feature now!