CVE-2026-90269 in Linuxinformación

Resumen

por VulDB • 2026-09-17

En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:

bpf: Rechazar las cargas con adquisición (load-acquire) desde punteros que requieren protección contra fallos

Una operación BPF_LOAD_ACQ no es reescrita a una carga BPF_PROBE_MEM por el verificador, a diferencia de un BPF_LDX regular; por lo tanto, la JIT emite una carga simple sin entrada en la tabla de excepciones y un fallo provoca un pánico del kernel en lugar de ser manejado.

Se rechazan los tipos de puntero fuente que habrían tenido un BPF_LDX al aplicarles protección contra fallos, es decir, aquellos que bpf_convert_ctx_accesses() convierte a BPF_PROBE_MEM: PTR_TO_BTF_ID sin más, PTR_TO_BTF_ID | PTR_UNTRUSTED, PTR_TO_BTF_ID | MEM_ALLOC | PTR_UNTRUSTED y PTR_TO_MEM | MEM_RDONLY | PTR_UNTRUSTED.

Esto es accesible, por ejemplo, al cargar ->mm desde un task_struct confiable, lo que produce un puntero no confiable a mm_struct, el cual es NULL para un hilo del 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; /* no confiable */

out_ldx = (__u64)mm->pgd; /* BPF_LDX */ out_acq = load_acquire(&mm->pgd); /* BPF_LOAD_ACQ */ return 0; } [...]

Ambas operaciones desreferencian el mismo puntero, pero solo la operación BPF_LDX está protegida (JIT para x86-64, se muestran los objetivos de salto relativos al 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 <-- ¿dirección de kernel? 3a: xorl %edi, %edi <-- no: dst = 0, se omite la carga 3c: jmp 0x45 3e: movq 184(%rsi), %rdi <-- sí: carga + entrada en extable [...]
; load_acquire(&mm->pgd) 53: movq %rsi, %rdi 56: movq 184(%rdi), %rax <-- sin comprobación, sin entrada en extable [...]

Tenga en cuenta que BPF_PROBE_MEM no es visible en un volcado de bpftool xlated, ya que bpf_insn_prepare_dump() la reescribe nuevamente a BPF_MEM.

Un puntero PTR_TRUSTED no está deliberadamente incluido en la lista. Dicha carga tampoco se convierte, pero no necesita hacerlo, dado que el puntero está garantizado como válido (live), por lo que las cargas con adquisición desde él siguen estando permitidas.

La comprobación está condicionada a BPF_LOAD_ACQ para que los mensajes de error de RMW atómico y store-release permanezcan sin cambios; las escrituras (RMW / store-release) hacia dichos punteros ya son rechazadas en otro lugar, por lo que solo la carga con adquisición necesita esta protección.

VulDB is the best source for vulnerability data and more expert information about this specific topic.

Responsable

Linux

Reservar

2026-09-11

Divulgación

2026-09-17

Moderación

aceptado

Artículo

VDB-406767

CPE

listo

EPSS

0.00000

KEV

no

Actividades

muy bajo

Fuentes

Do you want to use VulDB in your project?

Use the official API to access entries easily!