Vulnerabilitat al nucli de Linux que pot alterar fitxers de només lectura

S'ha identificat una vulnerabilitat al nucli de Linux (CVE-2022-0847) que permet sobreescriure el contingut de la memòria cau de la pàgina per a qualsevol fitxer, inclosos els que estan en mode de només lectura, oberts amb la marca O_RDONLY o situats en sistemes de fitxers. muntat en mode de només lectura. En termes pràctics, la vulnerabilitat es pot utilitzar per inserir codi en processos arbitraris o corrompre dades en fitxers oberts. Per exemple, podeu canviar el contingut del fitxer authorized_keys per al procés sshd. Un prototip de l'explotació està disponible per a la prova.

El problema s'ha anomenat Dirty Pipe, semblant a la vulnerabilitat crítica que Dirty COW va identificar el 2016. Cal assenyalar que pel que fa al nivell de perill, Dirty Pipe està al mateix nivell que Dirty COW, però és molt més fàcil d'operar. La vulnerabilitat es va identificar durant l'anàlisi de les queixes sobre la corrupció periòdica dels fitxers descarregats a la xarxa en un sistema que descarrega arxius comprimits des d'un servidor de registre (37 corrupcions en 3 mesos en un sistema carregat), la preparació dels quals va utilitzar l'operació splice() i canonades sense nom.

La vulnerabilitat apareix a partir del nucli Linux 5.8, llançat l'agost de 2020, és a dir. present a Debian 11, però no afecta el nucli base a Ubuntu 20.04 LTS. Els nuclis RHEL 8.x i openSUSE/SUSE 15 es basen inicialment en branques antigues, però és possible que el canvi que causa el problema s'hagi retroportat (encara no hi ha dades exactes). Podeu fer un seguiment de la publicació d'actualitzacions de paquets a les distribucions en aquestes pàgines: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux. Es va proposar una solució per a la vulnerabilitat a les versions 5.16.11, 5.15.25 i 5.10.102. La correcció també s'inclou al nucli utilitzat a la plataforma Android.

La vulnerabilitat és causada per la manca d'inicialització del valor "buf->flags" al codi de les funcions copy_page_to_iter_pipe() i push_pipe(), malgrat que la memòria no s'esborra en assignar una estructura i durant determinades manipulacions amb canonades sense nom, un valor d'una altra operació. Mitjançant aquesta funció, un usuari local sense privilegis pot aconseguir l'aparició del valor PIPE_BUF_FLAG_CAN_MERGE a la marca, que us permet organitzar la sobreescritura de dades a la memòria cau de la pàgina simplement escrivint dades noves en una canalització sense nom preparada especialment.

Per a un atac, el fitxer de destinació ha de ser llegible, i com que els drets d'accés no es comproven quan s'escriu a la canalització, també es pot substituir a la memòria cau de la pàgina per als fitxers situats en particions muntades només de lectura (per exemple, per a fitxers c CD- ROM). Després de substituir la informació de la memòria cau de la pàgina, en llegir dades d'un fitxer, el procés rebrà no les dades reals, sinó les dades substituïdes.

L'operació consisteix a crear un canal sense nom i omplir-lo amb dades arbitràries per tal d'assegurar-se que el senyalador PIPE_BUF_FLAG_CAN_MERGE s'estableix a totes les estructures d'anell associades. A continuació, es llegeixen les dades del canal, però el senyalador es manté establert en totes les instàncies de l'estructura pipe_buffer a les estructures d'anell pipe_inode_info. A continuació, es fa una crida a splice() per llegir les dades del fitxer de destinació a una canonada sense nom, començant pel desplaçament desitjat. Quan s'escriuen dades a aquesta canonada sense nom, a causa de la marca PIPE_BUF_FLAG_CAN_MERGE establerta, les dades de la memòria cau de la pàgina se sobreescriuran en lloc de crear una nova instància de l'estructura pipe_buffer.

Font: opennet.ru

Afegeix comentari