DirtyFrag: la amenaza del zero-copy en la seguridad de Linux
Publicado el
Introducción al problema de DirtyFrag
En el sistema operativo Linux, la page cache actúa como un intermediario esencial entre el disco y la memoria RAM. Este mecanismo permite que las páginas de archivos leídas se almacenen en RAM, facilitando múltiples referencias a la misma página física sin necesidad de realizar copias constantes. Entre las funciones que aprovechan este sistema se encuentra splice(), que mejora el rendimiento al evitar copias intermedias al transferir datos desde el disco hasta un socket.
Funcionamiento de splice()
El proceso tradicional de lectura de archivos en Linux implica varios pasos:
1. File: El archivo se encuentra en el disco. 2. Kernel buffer: El kernel lee el bloque del disco y lo carga en un búfer del kernel. 3. Userspace: Los datos se copian desde el búfer del kernel a la memoria de usuario del proceso. 4. Socket: Al escribir a un socket, se vuelven a copiar los datos desde la memoria de usuario a los búferes del kernel del socket antes de salir a la red.
Este enfoque resulta ineficiente, ya que se generan múltiples copias y un elevado consumo de CPU. En cambio, splice() utiliza la page cache para almacenar los datos en RAM compartida, permitiendo que varios subsistemas accedan a la misma página física sin duplicar los datos.
Riesgos asociados al zero-copy
Aunque el uso de splice() mejora el rendimiento, también introduce un riesgo significativo. Cuando varios subsistemas comparten referencias a la misma memoria, cualquier modificación en una de las referencias puede afectar a los demás. Este escenario deriva en la vulnerabilidad conocida como DirtyFrag, donde se producen modificaciones destructivas en la memoria compartida.
Vulnerabilidades CVE destacadas
Actualmente, se han identificado dos CVEs importantes relacionadas con DirtyFrag:
- CVE‑2026‑43284: Afecta a la ruta ESP/XFRM, donde se reutilizan fragmentos compartidos dentro de los SKBs (Socket Kernel Buffers) y se ejecutan operaciones de desencriptado sobre memoria que puede seguir siendo referenciada. - CVE‑2026‑43500: Relacionada con RxRPC, un subsistema de red que presenta complejidades y semánticas delicadas sobre la propiedad de fragmentos y su procesamiento asíncrono.
Análisis de la variante ESP
En la variante ESP, el problema se limita más fácilmente. El networking stack reutiliza fragmentos compartidos y, tras identificar el riesgo, se implementó un parche que evita operaciones destructivas en fragmentos compartidos. Este parche transforma la operación de desencriptado en una secuencia más segura de copy-on-write, lo que permite una corrección rápida del problema.
Desafíos en la variante RxRPC
Por otro lado, CVE‑2026‑43500 presenta un desafío mayor. El subsistema RxRPC ha sido históricamente poco auditado y complejo. Un análisis reciente ha mostrado que las operaciones de desencriptado en este contexto no solo afectan a un búfer de red, sino que pueden alterar regiones de memoria respaldadas por la page cache. Esto crea un escenario donde la misma página puede ser interpretada de manera diferente por distintos subsistemas, generando una divergencia en la mutabilidad que puede resultar en situaciones de seguridad críticas.
Conclusiones
La vulnerabilidad DirtyFrag representa un riesgo importante en el ecosistema de Linux, especialmente en entornos que utilizan zero-copy. A medida que se implementan parches y se realizan auditorías, es crucial seguir monitoreando e investigando estas vulnerabilidades para asegurar la integridad y la seguridad del sistema.