Vulnerabilidad en el kernel de Linux que permite la corrupción de archivos de solo lectura

Se ha identificado una vulnerabilidad en el kernel de Linux (CVE-2022-0847) que permite sobrescribir el contenido de la caché de la página para cualquier archivo, incluidos aquellos en modo de solo lectura, abiertos con el indicador O_RDONLY o ubicados en sistemas de archivos. montado en modo de solo lectura. En términos prácticos, la vulnerabilidad podría usarse para inyectar código en procesos arbitrarios o corromper datos en archivos abiertos. Por ejemplo, puede cambiar el contenido del archivo autorizado_keys para el proceso sshd. Un prototipo del exploit está disponible para probar.

El problema recibió el nombre en código Dirty Pipe, similar a la vulnerabilidad crítica que Dirty COW identificó en 2016. Cabe señalar que en términos de nivel de peligro, Dirty Pipe está al mismo nivel que Dirty COW, pero es mucho más fácil de operar. La vulnerabilidad fue identificada durante el análisis de quejas sobre corrupción periódica de archivos descargados a través de la red en un sistema que descarga archivos comprimidos desde un servidor de registro (37 corrupciones en 3 meses en un sistema cargado), cuya preparación utilizó la operación splice() y tuberías sin nombre.

La vulnerabilidad aparece a partir del kernel de Linux 5.8, lanzado en agosto de 2020, es decir. presente en Debian 11, pero no afecta el kernel base en Ubuntu 20.04 LTS. Los kernels RHEL 8.x y openSUSE/SUSE 15 se basan inicialmente en ramas antiguas, pero es posible que el cambio que causa el problema se haya adaptado a ellos (aún no hay datos exactos). Puede realizar un seguimiento de la publicación de actualizaciones de paquetes en distribuciones en estas páginas: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux. Se propuso una solución para la vulnerabilidad en las versiones 5.16.11, 5.15.25 y 5.10.102. La solución también está incluida en el kernel utilizado en la plataforma Android.

La vulnerabilidad es causada por la falta de inicialización del valor “buf->flags” en el código de las funciones copy_page_to_iter_pipe() y push_pipe(), a pesar de que la memoria no se borra al asignar una estructura y durante ciertas manipulaciones con tuberías sin nombre, un valor de otra operación. Con esta función, un usuario local sin privilegios puede lograr la aparición del valor PIPE_BUF_FLAG_CAN_MERGE en la bandera, lo que le permite organizar la sobrescritura de datos en el caché de la página simplemente escribiendo nuevos datos en una tubería sin nombre especialmente preparada.

Para un ataque, el archivo de destino debe ser legible y, dado que los derechos de acceso no se verifican al escribir en la tubería, también se pueden reemplazar en el caché de la página los archivos ubicados en particiones montadas de solo lectura (por ejemplo, para archivos c CD- ROM). Después de reemplazar la información en el caché de la página, al leer datos de un archivo, el proceso no recibirá los datos reales, sino los datos reemplazados.

La operación se reduce a crear un canal sin nombre y llenarlo con datos arbitrarios para garantizar que el indicador PIPE_BUF_FLAG_CAN_MERGE esté configurado en todas las estructuras de anillo asociadas con él. A continuación, los datos se leen de la tubería, pero el indicador permanece establecido en todas las instancias de la estructura pipe_buffer en las estructuras de anillo pipe_inode_info. Luego se realiza una llamada a splice() para leer datos del archivo de destino en una tubería sin nombre, comenzando en el desplazamiento deseado. Al escribir datos en esta canalización sin nombre, debido a que se establece el indicador PIPE_BUF_FLAG_CAN_MERGE, los datos en el caché de la página se sobrescribirán en lugar de crear una nueva instancia de la estructura pipe_buffer.

Fuente: opennet.ru

Añadir un comentario