CVE-2023-53178 in Linux
Resumen
por VulDB • 2026-06-21
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:
mm: corregir la condición de carrera en la escritura diferida (writeback) de zswap
El mecanismo de escritura diferida de zswap puede provocar una condición de carrera que resulta en corrupción de memoria, donde una página intercambiada (swapped out) se carga de nuevo (swapped in) con datos que fueron escritos en una página diferente.
La condición de carrera se produce de la siguiente manera: 1. Una página con datos A y un desplazamiento de intercambio (swap offset) X se almacena en zswap. 2. La página A se elimina de la lista LRU por el controlador zpool para la escritura diferida en el trabajo zswap-shrink; los datos de A son mapeados por el controlador zpool. 3. Un programa en espacio de usuario provoca una falta de página (fault) e invalida la entrada de la página A, considerándose el desplazamiento X como libre. 4. kswapd almacena la página B en el desplazamiento X en zswap (zswap también podría estar lleno; en ese caso, la página B se escribiría en X mediante E/S, omitiendo el paso 5). 5. La entrada A se reemplaza por B en tree->rbroot; esto no afecta la referencia local mantenida por el trabajo zswap-shrink. 6. El trabajo zswap-shrink escribe A en X y libera la entrada de zswap A. 7. La carga (swapin) del slot X trae A a la memoria en lugar de B.
La corrección: Una vez que se ha asignado la caché de páginas de intercambio (caso ZSWAP_SWAPCACHE_NEW), el trabajo zswap-shrink simplemente verifica que la referencia local zswap_entry siga siendo la misma que la del árbol. Si no es la misma, significa que ha sido invalidada o reemplazada; en ambos casos, la escritura diferida se aborta porque la entrada local contiene datos obsoletos.
Reproductor (Reproducer): Originalmente encontré esto ejecutando `stress` durante toda la noche para validar mi trabajo en el mecanismo de escritura diferida de zswap; se manifestó después de varias horas en mi máquina de pruebas. La clave para que ocurra es tener escrituras diferidas de zswap, por lo que cualquier configuración que aumente /sys/kernel/debug/zswap/written_back_pages debería funcionar.
Para reproducir esto más rápido en una máquina virtual, configuré un sistema con ~100M de memoria disponible y un archivo de intercambio (swap file) de 500M, y luego ejecuté `stress --vm 1 --vm-bytes 300000000 --vm-stride 4000` para que ocurriera en cuestión de decenas de minutos. Se puede acelerar aún más variando /sys/module/zswap/parameters/max_pool_percent arriba y abajo, por ejemplo, entre 20 y 1; esto hace que se reproduzca en decenas de segundos. Es crucial establecer `--vm-stride` en un valor distinto de 4096, de lo contrario, `stress` no se dará cuenta de que la memoria ha sido corrompida porque todas las páginas tendrían los mismos datos.
If you want to get best quality of vulnerability data, you may have to visit VulDB.