Instituto Nacional de ciberseguridad. Sección Incibe
Instituto Nacional de Ciberseguridad. Sección INCIBE-CERT

Vulnerabilidad en kernel de Linux (CVE-2025-21984)

Gravedad CVSS v3.1:
MEDIA
Tipo:
CWE-362 Ejecución concurrente utilizando recursos compartidos con una incorrecta sincronización (Condición de carrera)
Fecha de publicación:
01/04/2025
Última modificación:
10/04/2025

Descripción

En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: mm: se corrige el ERROR del kernel cuando userfaultfd_move encuentra swapcache userfaultfd_move() comprueba si la entrada PTE está presente o es una entrada de intercambio. - Si la entrada PTE está presente, move_present_pte() maneja la migración de folio mediante la configuración: src_folio->index = linear_page_index(dst_vma, dst_addr); - Si la entrada PTE es una entrada de intercambio, move_swap_pte() simplemente copia el PTE al nuevo dst_addr. Este enfoque es incorrecto porque, incluso si el PTE es una entrada de intercambio, aún puede hacer referencia a un folio que permanece en el caché de intercambio. Esto crea una ventana de ejecución entre los pasos 2 y 4. 1. add_to_swap: el folio se agrega al caché de intercambio. 2. try_to_unmap: los PTE se convierten en entradas de intercambio. 3. pageout: el folio se vuelve a escribir. 4. Se borra la caché de intercambio. Si se produce userfaultfd_move() en la ventana entre los pasos 2 y 4, después de mover el PTE de intercambio a su destino, al acceder a este se activa do_swap_page(), que puede localizar el folio en la caché de intercambio. Sin embargo, dado que el índice del folio no se ha actualizado para que coincida con el VMA de destino, do_swap_page() detectará una discrepancia. Esto puede provocar dos problemas críticos según la configuración del sistema. Si KSM está deshabilitado, tanto los folios pequeños como los grandes pueden generar un ERROR durante la operación add_rmap debido a: page_pgoff(folio, page) != linear_page_index(vma, address) [ 13.336953] page: refcount:6 mapcount:1 mapping:00000000f43db19c index:0xffffaf150 pfn:0x4667c [ 13.337520] head: order:2 mapcount:1 entire_mapcount:0 nr_pages_mapped:1 pincount:0 [ 13.337716] memcg:ffff00000405f000 [ 13.337849] anon flags: 0x3fffc0000020459(bloqueado|actualizado|sucio|propietario_priv_1|cabezal|swapbacked|nodo=0|zona=0|lastcpupid=0xffff) [13.338630] sin procesar: 03fffc0000020459 ffff80008507b538 ffff80008507b538 ffff000006260361 [13.338831] sin procesar: 0000000ffffaf150 0000000000004000 0000000600000000 ffff00000405f000 [13.339031] cabezal: 03fffc0000020459 ffff80008507b538 ffff80008507b538 ffff000006260361 [ 13.339204] cabeza: 0000000ffffaf150 0000000000004000 0000000600000000 ffff00000405f000 [ 13.339375] cabeza: 03fffc0000000202 fffffdffc0199f01 ffffffff00000000 0000000000000001 [ 13.339546] cabeza: 000000000000004 0000000000000000 00000000ffffffff 0000000000000000 [ 13.339736] página volcada porque: VM_BUG_ON_PAGE(page_pgoff(folio, page) != linear_page_index(vma, address)) [ 13.340190] ------------[ cortar aquí ]------------ [ 13.340316] ¡ERROR del kernel en mm/rmap.c:1380! [ 13.340683] Error interno: Oops - BUG: 00000000f2000800 [#1] PREEMPT SMP [ 13.340969] Módulos vinculados: [ 13.341257] CPU: 1 UID: 0 PID: 107 Comm: a.out No contaminado 6.14.0-rc3-gcf42737e247a-dirty #299 [ 13.341470] Nombre del hardware: linux,dummy-virt (DT) [ 13.341671] pstate: 60000005 (nZCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--) [ 13.341815] pc : __page_check_anon_rmap+0xa0/0xb0 [ 13.341920] lr : __page_check_anon_rmap+0xa0/0xb0 [ 13.342018] sp : ffff80008752bb20 [ 13.342093] x29: ffff80008752bb20 x28: fffffdffc0199f00 x27: 0000000000000001 [ 13.342404] x26: 0000000000000000 x25: 0000000000000001 x24: 0000000000000001 [ 13.342575] x23: 0000ffffaf0d0000 x22: 0000ffffaf0d0000 x21: fffffdffc0199f00 [ 13.342731] x20: fffffdffc0199f00 x19: ffff000006210700 x18: 00000000ffffffff [ 13.342881] x17: 6c203d2120296567 x16: 6170202c6f696c6f x15: 662866666f67705f [ 13.343033] x14: 6567617028454741 x13: 2929737365726464 x12: ffff800083728ab0 [ 13.343183] x11: ffff800082996bf8 x10: 0000000000000fd7 x9: ffff80008011bc40 [ 13.343351] x8: 0000000000017fe8 x7: 00000000fffff000 x6: ffff8000829eebf8 [ 13.343498] x5: c0000000fffff000 x4: 0000000000000000 x3: 0000000000000000 [ 13.343645] x2: 0000000000000000 x1 : ffff0000062db980 x0 : 000000000000005f [ 13.343876] Rastreo de llamadas: [ 13.344045] __page_check_anon_rmap+0xa0/0xb0 ---truncado---

Productos y versiones vulnerables

CPE Desde Hasta
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 6.8 (incluyendo) 6.12.20 (excluyendo)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 6.13 (incluyendo) 6.13.8 (excluyendo)
cpe:2.3:o:linux:linux_kernel:6.14:rc1:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.14:rc2:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.14:rc3:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.14:rc4:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.14:rc5:*:*:*:*:*:*