Vulnerabilidad en Linux (CVE-2026-23025)
Gravedad:
Pendiente de análisis
Tipo:
No Disponible / Otro tipo
Fecha de publicación:
31/01/2026
Última modificación:
06/02/2026
Descripción
En el kernel de Linux, la siguiente vulnerabilidad ha sido resuelta:<br />
<br />
mm/page_alloc: evitar la corrupción de pcp con SMP=n<br />
<br />
El robot de pruebas del kernel ha informado:<br />
<br />
BUG: spinlock trylock failure on UP on CPU#0, kcompactd0/28<br />
lock: 0xffff888807e35ef0, .magic: dead4ead, .owner: kcompactd0/28, .owner_cpu: 0<br />
CPU: 0 UID: 0 PID: 28 Comm: kcompactd0 Not tainted 6.18.0-rc5-00127-ga06157804399 #1 PREEMPT 8cc09ef94dcec767faa911515ce9e609c45db470<br />
Call Trace:<br />
<br />
__dump_stack (lib/dump_stack.c:95)<br />
dump_stack_lvl (lib/dump_stack.c:123)<br />
dump_stack (lib/dump_stack.c:130)<br />
spin_dump (kernel/locking/spinlock_debug.c:71)<br />
do_raw_spin_trylock (kernel/locking/spinlock_debug.c:?)<br />
_raw_spin_trylock (include/linux/spinlock_api_smp.h:89 kernel/locking/spinlock.c:138)<br />
__free_frozen_pages (mm/page_alloc.c:2973)<br />
___free_pages (mm/page_alloc.c:5295)<br />
__free_pages (mm/page_alloc.c:5334)<br />
tlb_remove_table_rcu (include/linux/mm.h:? include/linux/mm.h:3122 include/asm-generic/tlb.h:220 mm/mmu_gather.c:227 mm/mmu_gather.c:290)<br />
? __cfi_tlb_remove_table_rcu (mm/mmu_gather.c:289)<br />
? rcu_core (kernel/rcu/tree.c:?)<br />
rcu_core (include/linux/rcupdate.h:341 kernel/rcu/tree.c:2607 kernel/rcu/tree.c:2861)<br />
rcu_core_si (kernel/rcu/tree.c:2879)<br />
handle_softirqs (arch/x86/include/asm/jump_label.h:36 include/trace/events/irq.h:142 kernel/softirq.c:623)<br />
__irq_exit_rcu (arch/x86/include/asm/jump_label.h:36 kernel/softirq.c:725)<br />
irq_exit_rcu (kernel/softirq.c:741)<br />
sysvec_apic_timer_interrupt (arch/x86/kernel/apic/apic.c:1052)<br />
<br />
<br />
RIP: 0010:_raw_spin_unlock_irqrestore (arch/x86/include/asm/preempt.h:95 include/linux/spinlock_api_smp.h:152 kernel/locking/spinlock.c:194)<br />
free_pcppages_bulk (mm/page_alloc.c:1494)<br />
drain_pages_zone (include/linux/spinlock.h:391 mm/page_alloc.c:2632)<br />
__drain_all_pages (mm/page_alloc.c:2731)<br />
drain_all_pages (mm/page_alloc.c:2747)<br />
kcompactd (mm/compaction.c:3115)<br />
kthread (kernel/kthread.c:465)<br />
? __cfi_kcompactd (mm/compaction.c:3166)<br />
? __cfi_kthread (kernel/kthread.c:412)<br />
ret_from_fork (arch/x86/kernel/process.c:164)<br />
? __cfi_kthread (kernel/kthread.c:412)<br />
ret_from_fork_asm (arch/x86/entry/entry_64.S:255)<br />
<br />
<br />
Matthew ha analizado el informe y ha identificado que en drain_page_zone() estamos en una sección protegida por spin_lock(&amp;pcp-&gt;lock) y luego recibimos una interrupción que intenta spin_trylock() en el mismo bloqueo. El código está diseñado para funcionar de esta manera sin deshabilitar las IRQ y ocasionalmente fallar el trylock con un mecanismo de respaldo. Sin embargo, la implementación de spinlock con SMP=n asume que spin_trylock() siempre tendrá éxito, y por lo tanto, normalmente es una operación nula. Aquí, la depuración de bloqueo habilitada detecta el problema, pero de lo contrario podría causar una corrupción de la estructura pcp.<br />
<br />
El problema ha sido introducido por el commit 574907741599 (&#39;mm/page_alloc: dejar las IRQ habilitadas para las asignaciones de páginas por CPU&#39;). El esquema de bloqueo de pcp reconoce la necesidad de deshabilitar las IRQ para evitar el anidamiento de secciones spin_trylock() en SMP=n, pero la necesidad de evitar el anidamiento en spin_lock() no ha sido reconocida. Solucionarlo introduciendo envoltorios locales que cambian el spin_lock() a spin_lock_iqsave() con SMP=n y usándolos en todos los lugares que realizan spin_lock(&amp;pcp-&gt;lock).<br />
<br />
[vbabka@suse.cz: añadir el prefijo pcp_ a los envoltorios spin_lock_irqsave, según Steven]
Impacto
Referencias a soluciones, herramientas e información
- https://git.kernel.org/stable/c/038a102535eb49e10e93eafac54352fcc5d78847
- https://git.kernel.org/stable/c/3098f8f7c7b0686c74827aec42a2c45e69801ff8
- https://git.kernel.org/stable/c/4a04ff9cd816e7346fcc8126f00ed80481f6569d
- https://git.kernel.org/stable/c/68688fc4eab007834b4c2d740214423ba2a335a8
- https://git.kernel.org/stable/c/df63d31e9ae02e2f6cd96147779e4ed7cd0e75f6



