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

Vulnerabilidad en Linux (CVE-2026-23233)

Gravedad CVSS v3.1:
ALTA
Tipo:
CWE-787 Escritura fuera de límites
Fecha de publicación:
04/03/2026
Última modificación:
17/03/2026

Descripción

En el kernel de Linux, la siguiente vulnerabilidad ha sido resuelta:<br /> <br /> f2fs: corrección para evitar mapear un bloque físico incorrecto para el archivo de intercambio<br /> <br /> Xiaolong Guo informó de un error de f2fs en bugzilla [1]<br /> <br /> [1] HTTPS://bugzilla.kernel.org/show_bug.cgi?id=220951<br /> <br /> Citado:<br /> <br /> Cuando se utiliza la prueba de estrés de intercambio de stress-ng en el sistema de archivos F2FS con kernel 6.6+, el sistema experimenta corrupción de datos que lleva a una de las siguientes situaciones:<br /> 1 errores de corrupción de dm-verity y reinicio del dispositivo<br /> 2 errores de corrupción de nodo F2FS y cuelgues de arranque<br /> <br /> El problema ocurre específicamente cuando:<br /> 1 Se utiliza el sistema de archivos F2FS (ext4 no se ve afectado)<br /> 2 El tamaño del archivo de intercambio es menor que el tamaño de sección de F2FS (2MB)<br /> 3 El archivo de intercambio tiene un diseño físico fragmentado (múltiples extensiones no contiguas)<br /> 4 La versión del kernel es 6.6+ (6.1 no se ve afectada)<br /> <br /> La causa raíz está en la función check_swap_activate() en fs/f2fs/data.c. Cuando la primera extensión de un archivo de intercambio pequeño (&amp;lt; 2MB) no está alineada con los límites de sección, la función lo trata incorrectamente como la última extensión, fallando en mapear extensiones subsiguientes. Esto resulta en una creación incorrecta de swap_extent donde solo la primera extensión es mapeada, causando que las escrituras de intercambio subsiguientes sobrescriban ubicaciones físicas incorrectas (datos de otros archivos).<br /> <br /> Pasos para Reproducir<br /> 1 Configurar un dispositivo con una partición de datos de usuario formateada en F2FS<br /> 2 Compilar stress-ng desde HTTPS://github.com/ColinIanKing/stress-ng<br /> 3 Ejecutar la prueba de estrés de intercambio: (dispositivos Android)<br /> adb shell &amp;#39;cd /data/stressng; ./stress-ng-64 --metrics-brief --timeout 60 --swap 0&amp;#39;<br /> <br /> Registro:<br /> 1 Ftrace muestra que en el kernel 6.6, solo la primera extensión se mapea durante la segunda llamada a f2fs_map_blocks en check_swap_activate():<br /> stress-ng-swap-8990: f2fs_map_blocks: ino=11002, file offset=0, start blkaddr=0x43143, len=0x1<br /> (Solo 4KB mapeados, no el archivo de intercambio completo)<br /> 2 en el kernel 6.1, ambas extensiones se mapean correctamente:<br /> stress-ng-swap-5966: f2fs_map_blocks: ino=28011, file offset=0, start blkaddr=0x13cd4, len=0x1<br /> stress-ng-swap-5966: f2fs_map_blocks: ino=28011, file offset=1, start blkaddr=0x60c84b, len=0xff<br /> <br /> El código problemático está en check_swap_activate():<br /> if ((pblock - SM_I(sbi)-&amp;gt;main_blkaddr) % blks_per_sec ||<br /> nr_pblocks % blks_per_sec ||<br /> !f2fs_valid_pinned_area(sbi, pblock)) {<br /> bool last_extent = false;<br /> <br /> not_aligned++;<br /> <br /> nr_pblocks = roundup(nr_pblocks, blks_per_sec);<br /> if (cur_lblock + nr_pblocks &amp;gt; sis-&amp;gt;max)<br /> nr_pblocks -= blks_per_sec;<br /> <br /> /* esta extensión es la última */<br /> if (!nr_pblocks) {<br /> nr_pblocks = last_lblock - cur_lblock;<br /> last_extent = true;<br /> }<br /> <br /> ret = f2fs_migrate_blocks(inode, cur_lblock, nr_pblocks);<br /> if (ret) {<br /> if (ret == -ENOENT)<br /> ret = -EINVAL;<br /> goto out;<br /> }<br /> <br /> if (!last_extent)<br /> goto retry;<br /> }<br /> <br /> Cuando la primera extensión no está alineada y roundup(nr_pblocks, blks_per_sec) excede sis-&amp;gt;max, restamos blks_per_sec resultando en nr_pblocks = 0. El código asume incorrectamente que esta es la última extensión, establece nr_pblocks = last_lblock - cur_lblock (archivo de intercambio completo), y realiza la migración. Después de la migración, no reintenta el mapeo, por lo que las extensiones subsiguientes nunca se procesan.<br /> <br /> Para solucionar este problema, necesitamos buscar la información de mapeo de bloques después de migrar todos los bloques en la cola del archivo de intercambio.

Productos y versiones vulnerables

CPE Desde Hasta
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 6.6.33 (incluyendo) 6.6.127 (excluyendo)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 6.9 (incluyendo) 6.12.74 (excluyendo)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 6.13 (incluyendo) 6.18.13 (excluyendo)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 6.19 (incluyendo) 6.19.3 (excluyendo)