A vulnerability in the Linux kernel allows the distortion of read-only files.

O kernel Linux a identificat o vulnerabilitate (CVE-2022-0847) care permite suprascrierea conținutului cache-ului de pagină pentru orice fișiere, inclusiv pentru cele aflate în modul numai pentru citire, deschise cu flag-ul O_RDONLY sau plasate în sisteme de fișiere montate în modul numai pentru citire. Din punct de vedere practic, vulnerabilitatea poate fi utilizată pentru a injecta cod în procese arbitrare sau pentru a distorsiona datele din fișierele deschise. De exemplu, este posibil să se schimbe conținutul fișierului authorized_keys pentru procesul sshd. Un prototip de exploit este disponibil pentru testare.

Problemei i s-a atribuit numele de cod Dirty Pipe, în analogie cu vulnerabilitatea critică Dirty COW identificată în 2016. Se observă că, din punct de vedere al pericolului, Dirty Pipe se situează la același nivel ca Dirty COW, dar este semnificativ mai ușor de exploatat. Vulnerabilitatea a fost descoperită în urma analizei plângerilor legate de deteriorarea periodică a fișierelor descărcate prin rețea pe un sistem care încarcă arhive comprimate de pe un server de logare (37 de daune în 3 luni pe un sistem supus la o încărcare mare), în care a fost utilizată operațiunea splice() și canale fără nume.

Vulnerabilitatea apare începând cu kernel-ul Linux 5.8, lansat în august 2020, adică este prezent în Debian 11, dar nu afectează kernel-ul de bază în Ubuntu 20.04 LTS. Kernel-urile RHEL 8.x și openSUSE/SUSE 15 sunt în principiu bazate pe ramuri mai vechi, dar nu este exclus ca modificarea care a provocat problema să fi fost backportată în ele (informații precise nu sunt disponibile deocamdată). Se poate urmări publicarea actualizărilor pachetelor în distribuții la următoarele pagini: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux. Corectarea vulnerabilității a fost oferită în versiunile 5.16.11, 5.15.25 și 5.10.102. Corectarea a fost, de asemenea, inclusă în kernel-ul utilizat în platforma Android.

Vulnerabilitatea este cauzată de lipsa inițializării valorii „buf->flags” în codul funcțiilor copy_page_to_iter_pipe() și push_pipe(), având în vedere că memoria nu este curățată atunci când structura este alocată și, în urma anumitor manipulări cu canale fără nume, în „buf->flags” poate apărea o valoare dintr-o altă operație. Folosind această caracteristică, un utilizator local fără privilegii poate obține apariția în flag a valorii PIPE_BUF_FLAG_CAN_MERGE, care permite organizarea suprascrierii datelor în cache-ul de pagină printr-o simplă scriere de date noi într-un canal fără nume pregătit special.

Pentru a ataca, fișierul țintă trebuie să fie accesibil pentru citire, dat fiind că la scrierea în pipe nu se verifică drepturile de acces, substituirea în cache-ul paginilor poate fi efectuată inclusiv pentru fișiere aflate în secțiuni montate doar pentru citire (de exemplu, pentru fișierele de pe CD-ROM). După substituirea informațiilor în cache-ul paginilor, procesul la citirea datelor din fișier va obține datele nu cele reale, ci cele substituite.

Exploatarea constă în crearea unui canal fără nume și umplerea acestuia cu date aleatorii pentru a obține setarea flag-ului PIPE_BUF_FLAG_CAN_MERGE în toate structurile circulare asociate. Ulterior, datele sunt citite din canal, dar flag-ul rămâne setat în toate instanțele structurii pipe_buffer în structurile circulare pipe_inode_info. Apoi se execută apelul splice() pentru a citi datele din fișierul țintă în canalul fără nume, începând de la offset-ul corect. La scrierea datelor în acest canal fără nume, din cauza setării flag-ului PIPE_BUF_FLAG_CAN_MERGE, datele din cache-ul paginilor vor fi rescrise, în loc să se creeze o nouă instanță a structurii pipe_buffer.

Sursa: opennet.ro

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster