Hace pocos días se dio a conocer la noticia de que fueron detectadas dos vulnerabilidades en los subsistemas del kernel de Linux, Netfilter e io_uring, las cuales permiten a un usuario local elevar sus privilegios en el sistema.
La primera de ellas es la vulnerabilidad (CVE-2023-32233) que fue detectada en el subsistema Netfilter y provocada por acceso a memoria use-after-free en el módulo nf_tables, que asegura el funcionamiento del filtro de paquetes nftables.
Este fallo se debe a que netfilter nf_tables permite actualizar su configuración por solicitudes lotes que agrupan múltiples operaciones básicas en transacciones atómicas.
El problema se ha reproducido en varias versiones del kernel de Linux, incluyendo Linux 6.3.1 (estable actual) y la vulnerabilidad se puede aprovechar enviando solicitudes especialmente diseñadas para actualizar la configuración de nftables. Se menciona que el ataque requiere acceso a nftables, que se pueden obtener en un espacio de nombres de red separado si tiene los derechos CLONE_NEWUSER, CLONE_NEWNS o CLONE_NEWNET (por ejemplo, si puede ejecutar un contenedor aislado).
Sobre este fallo, el investigador que identificó el problema prometió posponer por una semana la publicación de información detallada y un ejemplo de un exploit funcional que proporciona un shell root.
En un escenario específico, una solicitud de lote no válida puede contener una operación que elimina implícitamente un conjunto anónimo nft existente seguido de otra operación que intenta actuar sobre el mismo conjunto nft anónimo después de que se elimine. En el escenario anterior, un ejemplo de la operación anterior es eliminar una regla nft existente que utiliza un conjunto anónimo nft. Y un ejemplo de esta última operación es un intento para eliminar un elemento de ese conjunto anónimo de nft después de que el conjunto sea eliminado alternativamente, la última operación podría incluso intentar eliminar explícitamente ese conjunto anónimo de nft nuevamente.
Como ya se mencionó al inicio, esto fue hace ya varios días y el exploit y la información ya fue divulgada. El exploit asi como los detalles de este lo pueden consultar en el siguiente enlace.
El segundo fallo detectado, fue la vulnerabilidad (CVE-2023-2598) en la implementación de la interfaz de E/S asíncrona io_uring incluida en el kernel de Linux desde la versión 5.1.
El problema se debe a un error en la función io_sqe_buffer_register, que permite el acceso a la memoria física fuera de los límites de un búfer asignado estáticamente. El problema aparece solo en la rama 6.3 y se solucionará en la próxima actualización 6.3.2.
Se menciona que la idea detrás de la confirmación original es que, en lugar de dividir grandes páginas que están registradas como un búfer en entradas bvec individuales, se puede tener una sola entrada bvec para todas las partes de la página que están en el búfer. En concreto, si todas páginas en el mapa de búfer utilizan la primera estructura de página y la longitud del búfer en una sola entrada bvec en lugar de mapeando cada página individualmente.
Entonces, bvec se extenderá mucho más allá de la página única que en realidad es permitido tocar. Más tarde, IORING_OP_READ_FIXED y IORING_OP_WRITE_FIXED nos permite leer y escribir en el búfer (es decir, la memoria apuntada a por el bvec) a voluntad. Esto permite el acceso de lectura/escritura a la física memoria detrás de la única página que realmente tenemos.
En la publicación de la vulnerabilidad se menciona los pasos de reproducción de error:
1. Crear un memfd
2. Colocar en error una sola página en ese descriptor de archivo
3. Usar MAP_FIXED para mapear esta página repetidamente, en ubicaciones consecutivas
4. Registrar toda la región que acaba de llenar con esa página como un búfer fijo con IORING_REGISTER_BUFFERS
5. Usar IORING_OP_WRITE_FIXED para escribir el búfer en algún otro archivo (lectura OOB) o IORING_OP_READ_FIXED para leer datos en el búfer (escritura OOB).
Finalmente cabe mencionar que ya se encuentra disponible un prototipo de exploit funcional (CVE-2023-2598) para realizar pruebas, lo que le permite ejecutar código con privilegios de kernel.
La vulnerabilidad (CVE-2023-32233) se solucionó en la actualización 6.4-rc y se puede seguir la corrección de la vulnerabilidad en las distribuciones en las páginas: Debian, Ubuntu, Gentoo, RHEL, Fedora, SUSE/openSUSE y Arch.