Vulnerabilidad en Linux (CVE-2026-23233)
Fecha de publicación:
04/03/2026
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 (&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 &#39;cd /data/stressng; ./stress-ng-64 --metrics-brief --timeout 60 --swap 0&#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)-&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 &gt; sis-&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-&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.
Gravedad: Pendiente de análisis
Última modificación:
04/03/2026