Vulnerabilidade no núcleo de Linux que permite corromper os ficheiros de só lectura

Identificouse unha vulnerabilidade no núcleo de Linux (CVE-2022-0847) que permite sobrescribir o contido da caché da páxina para calquera ficheiro, incluídos aqueles en modo de só lectura, abertos coa marca O_RDONLY ou localizados en sistemas de ficheiros. montado en modo de só lectura. En termos prácticos, a vulnerabilidade podería usarse para inxectar código en procesos arbitrarios ou corromper datos en ficheiros abertos. Por exemplo, pode cambiar o contido do ficheiro authorized_keys para o proceso sshd. Un prototipo do exploit está dispoñible para probalo.

O problema foi denominado Dirty Pipe, similar á vulnerabilidade crítica Dirty COW identificada en 2016. Nótase que en termos de nivel de perigo, Dirty Pipe está ao mesmo nivel que Dirty COW, pero é moito máis fácil de operar. A vulnerabilidade identificouse durante a análise de queixas sobre a corrupción periódica de ficheiros descargados pola rede nun sistema que descarga arquivos comprimidos dun servidor de rexistro (37 corruptos en 3 meses nun sistema cargado), cuxa preparación utilizou a operación splice() e tubos sen nome.

A vulnerabilidade aparece a partir do núcleo Linux 5.8, lanzado en agosto de 2020, é dicir. presente en Debian 11, pero non afecta ao núcleo base en Ubuntu 20.04 LTS. Os núcleos RHEL 8.x e openSUSE/SUSE 15 baséanse inicialmente en ramas antigas, pero é posible que o cambio que provocou o problema fose retroportado neles (aínda non hai datos exactos). Podes seguir a publicación de actualizacións de paquetes en distribucións nestas páxinas: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux. Propúxose unha corrección para a vulnerabilidade nas versións 5.16.11, 5.15.25 e 5.10.102. A corrección tamén se inclúe no núcleo usado na plataforma Android.

A vulnerabilidade prodúcese pola falta de inicialización do valor "buf->flags" no código das funcións copy_page_to_iter_pipe() e push_pipe(), a pesar de que a memoria non se borra ao asignar unha estrutura e durante certas manipulacións con tuberías sen nome, un valor doutra operación. Usando esta función, un usuario local sen privilexios pode conseguir a aparición do valor PIPE_BUF_FLAG_CAN_MERGE na marca, o que lle permite organizar a sobreescritura de datos na caché da páxina simplemente escribindo novos datos nunha canalización sen nome especialmente preparada.

Para un ataque, o ficheiro de destino debe ser lexible e, dado que os dereitos de acceso non se verifican cando se escribe en pipe, tamén se pode substituír na caché da páxina para ficheiros situados en particións montadas só de lectura (por exemplo, para ficheiros c CD- ROM). Despois de substituír a información na caché da páxina, ao ler os datos dun ficheiro, o proceso non recibirá os datos reais, senón os datos substituídos.

A operación consiste en crear unha canle sen nome e enchela con datos arbitrarios para garantir que a bandeira PIPE_BUF_FLAG_CAN_MERGE estea definida en todas as estruturas de anel asociadas a ela. A continuación, lense os datos da canle, pero a marca permanece establecida en todas as instancias da estrutura pipe_buffer nas estruturas de aneis pipe_inode_info. A continuación realízase unha chamada a splice() para ler os datos do ficheiro de destino nunha canalización sen nome, comezando polo desplazamento desexado. Ao escribir datos nesta canalización sen nome, debido a que se estableceu a marca PIPE_BUF_FLAG_CAN_MERGE, os datos da caché da páxina sobrescribiranse en lugar de crear unha nova instancia da estrutura pipe_buffer.

Fonte: opennet.ru

Engadir un comentario