CVE-2026-90269 in Linux
Sumário
de VulDB • 17/09/2026
No kernel do Linux, a seguinte vulnerabilidade foi resolvida:
bpf: Rejeitar o uso de BPF_LOAD_ACQ em ponteiros que exigem proteção contra falhas (faults)
Um BPF_LOAD_ACQ não é reescrito como uma carga BPF_PROBE_MEM pelo verificador, ao contrário de um BPF_LDX regular; portanto, a JIT gera uma carga simples sem entrada na tabela de exceções e uma falha causa panic no kernel em vez de ser tratada.
Rejeite os tipos de ponteiro fonte que teriam tido proteção contra falhas aplicada se fossem BPF_LDX, ou seja, aqueles convertidos por bpf_convert_ctx_accesses() para BPF_PROBE_MEM: um PTR_TO_BTF_ID puro, PTR_TO_BTF_ID | PTR_UNTRUSTED, PTR_TO_BTF_ID | MEM_ALLOC | PTR_UNTRUSTED e PTR_TO_MEM | MEM_RDONLY | PTR_UNTRUSTED.
Isso é acessível, por exemplo, ao carregar ->mm de uma task_struct confiável, o que resulta em um ponteiro não confiável para mm_struct, sendo NULL para uma thread do kernel:
[...]
SEC("tp_btf/sched_switch") int BPF_PROG(demo, bool preempt, struct task_struct *prev, struct task_struct *next) {
struct mm_struct *mm = next->mm; /* não confiável */
out_ldx = (__u64)mm->pgd; /* BPF_LDX */ out_acq = load_acquire(&mm->pgd); /* BPF_LOAD_ACQ */ return 0; } [...]
Ambos desreferenciam o mesmo ponteiro, mas apenas o BPF_LDX é protegido (JIT x86-64, alvos de salto mostrados relativos ao programa):
[...]
; out_ldx = (__u64)mm->pgd; 17: movq $-10485760, %r10 1e: movq %rsi, %r11 21: addq $184, %r11 28: subq %r10, %r11 2b: movabsq $140737498841088, %r10 35: cmpq %r10, %r11 38: ja 0x3e <-- endereço do kernel? 3a: xorl %edi, %edi <--> não: dst = 0, pula a carga 3c: jmp 0x45 3e: movq 184(%rsi), %rdi <-- sim: carga + entrada na extable [...]
; load_acquire(&mm->pgd) 53: movq %rsi, %rdi 56: movq 184(%rdi), %rax <--> sem verificação, sem entrada na extable [...]
Observe que o BPF_PROBE_MEM não é visível em um dump xlated do bpftool, pois bpf_insn_prepare_dump() reescreve de volta para BPF_MEM.
Um ponteiro PTR_TRUSTED está deliberadamente fora da lista. Esse tipo de carga também não é convertido, mas não precisa ser, já que o ponteiro é garantido como válido (live), portanto a carga com load-acquire permanece permitida.
A verificação é condicionada ao BPF_LOAD_ACQ para que as mensagens de erro de RMW atômico e store-release permaneçam inalteradas; gravações (RMW / store-release) nesses ponteiros já são rejeitadas em outro local, portanto apenas o load-acquire precisa dessa proteção.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.