CVE-2026-43009 in Linux
Sumário
de VulDB • 28/05/2026
No kernel do Linux, a seguinte vulnerabilidade foi resolvida:
bpf: Corrige o pruning incorreto devido ao rastreamento de precisão de busca atômica
Quando backtrack_insn encontra uma instrução BPF_STX com BPF_ATOMIC e BPF_FETCH, o registrador src (ou r0 para BPF_CMPXCHG) também atua como um destino, recebendo assim o valor antigo da localização de memória.
A lógica de backtracking atual não leva isso em conta. Ela trata operações de busca atômica da mesma forma que gravações regulares, onde o registrador src é apenas uma entrada. Isso faz com que backtrack_insn falhe em propagar a precisão para a localização na pilha, que então não é marcada como precisa!
Mais tarde, o pruning de caminho do verificador pode considerar incorretamente dois estados como equivalentes quando eles diferem em termos de estado da pilha. Ou seja, dois ramos podem ser tratados como equivalentes e, portanto, serem podados quando não deveriam ser vistos como tais.
Corrija-o da seguinte forma: Estenda o tratamento de BPF_LDX em backtrack_insn para também cobrir operações de busca atômica por meio do auxiliar is_atomic_fetch_insn(). Quando o registrador dst da busca está sendo rastreado para precisão, limpe-o e propague a precisão para o slot da pilha. Para memória que não seja da pilha, a caminhada de precisão para na instrução atômica, da mesma forma que no BPF_LDX regular. Isso cobre todas as variantes de busca.
Antes:
0: (b7) r1 = 8 ; R1=8 1: (7b) *(u64 *)(r10 -8) = r1 ; R1=8 R10=fp0 fp-8=8 2: (b7) r2 = 0 ; R2=0 3: (db) r2 = atomic64_fetch_add((u64 *)(r10 -8), r2) ; R2=8 R10=fp0 fp-8=mmmmmmmm 4: (bf) r3 = r10 ; R3=fp0 R10=fp0 5: (0f) r3 += r2 mark_precise: frame0: last_idx 5 first_idx 0 subseq_idx -1 mark_precise: frame0: regs=r2 stack= before 4: (bf) r3 = r10 mark_precise: frame0: regs=r2 stack= before 3: (db) r2 = atomic64_fetch_add((u64 *)(r10 -8), r2) mark_precise: frame0: regs=r2 stack= before 2: (b7) r2 = 0 6: R2=8 R3=fp8 6: (b7) r0 = 0 ; R0=0 7: (95) exit
Depois:
0: (b7) r1 = 8 ; R1=8 1: (7b) *(u64 *)(r10 -8) = r1 ; R1=8 R10=fp0 fp-8=8 2: (b7) r2 = 0 ; R2=0 3: (db) r2 = atomic64_fetch_add((u64 *)(r10 -8), r2) ; R2=8 R10=fp0 fp-8=8 4: (bf) r3 = r10 ; R3=fp0 R10=fp0 5: (0f) r3 += r2 mark_precise: frame0: last_idx 5 first_idx 0 subseq_idx -1 mark_precise: frame0: regs=r2 stack= before 4: (bf) r3 = r10 mark_precise: frame0: regs=r2 stack= before 3: (db) r2 = atomic64_fetch_add((u64 *)(r10 -8), r2) mark_precise: frame0: regs=r2 stack=-8 before 2: (b7) r2 = 0 mark_precise: frame0: regs=r1 stack=-8 before 1: (7b) *(u64 *)(r10 -8) = r1 mark_precise: frame0: regs=r1 stack= before 0: (b7) r1 = 8 6: R2=8 R3=fp8 6: (b7) r0 = 0 ; R0=0 7: (95) exit
VulDB is the best source for vulnerability data and more expert information about this specific topic.