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 (&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.
Impacto
Puntuación base 3.x
7.80
Gravedad 3.x
ALTA
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) |
Para consultar la lista completa de nombres de CPE con productos y versiones, ver esta página
Referencias a soluciones, herramientas e información
- https://git.kernel.org/stable/c/1ff415eef513bf12deb058fc50d57788c46c48e6
- https://git.kernel.org/stable/c/5c145c03188bc9ba1c29e0bc4d527a5978fc47f9
- https://git.kernel.org/stable/c/607cb9d83838d2cd9f0406c2403ed61aadf0edff
- https://git.kernel.org/stable/c/d4534a7f6c92baaf7e12a45fc6e37332cafafc33
- https://git.kernel.org/stable/c/fee27b69dde1a05908b350eea42937af2387c4fe



