Sårbarhet i Linux-kjernen som gjør at skrivebeskyttede filer kan bli ødelagt

En sårbarhet er identifisert i Linux-kjernen (CVE-2022-0847) som gjør at innholdet i sidebufferen kan overskrives for alle filer, inkludert de i skrivebeskyttet modus, åpnet med O_RDONLY-flagget eller plassert på filsystemer montert i skrivebeskyttet modus. Rent praktisk kan sårbarheten brukes til å sette inn kode i vilkårlige prosesser eller korrupte data i åpne filer. Du kan for eksempel endre innholdet i filen authorized_keys for sshd-prosessen. En prototype av utnyttelsen er tilgjengelig for testing.

Problemet har fått kodenavnet Dirty Pipe, lik den kritiske sårbarheten Dirty COW identifisert i 2016. Det bemerkes at når det gjelder farenivå, er Dirty Pipe på samme nivå som Dirty COW, men er mye enklere å betjene. Sårbarheten ble identifisert under analysen av klager om periodisk korrupsjon av filer lastet ned over nettverket i et system som laster ned komprimerte arkiver fra en loggserver (37 korrupsjoner i løpet av 3 måneder på et lastet system), hvor forberedelsen brukte splice()-operasjonen og ikke navngitte rør.

Sårbarheten vises fra og med Linux-kjernen 5.8, utgitt i august 2020, dvs. finnes i Debian 11, men påvirker ikke basiskjernen i Ubuntu 20.04 LTS. RHEL 8.x- og openSUSE/SUSE 15-kjernene er i utgangspunktet basert på gamle grener, men det er mulig at endringen som forårsaket problemet ble tilbakeført til dem (det er ingen eksakte data ennå). Du kan følge publiseringen av pakkeoppdateringer i distribusjoner på disse sidene: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux. En løsning for sårbarheten ble foreslått i utgivelsene 5.16.11, 5.15.25 og 5.10.102. Reparasjonen er også inkludert i kjernen som brukes i Android-plattformen.

Sårbarheten er forårsaket av manglende initialisering av "buf->flags"-verdien i koden til funksjonene copy_page_to_iter_pipe() og push_pipe(), til tross for at minnet ikke tømmes ved allokering av en struktur og under visse manipulasjoner med ikke navngitte rør, en verdi fra en annen operasjon. Ved å bruke denne funksjonen kan en uprivilegert lokal bruker oppnå utseendet til PIPE_BUF_FLAG_CAN_MERGE-verdien i flagget, som lar deg organisere dataoverskriving i sidebufferen ved ganske enkelt å skrive nye data til et spesielt forberedt navngitt rør.

For et angrep må målfilen være lesbar, og siden tilgangsrettigheter ikke kontrolleres ved skriving til pipe, kan erstatning i sidebufferen også gjøres for filer som ligger i partisjoner montert skrivebeskyttet (for eksempel for filer c CD- ROM). Etter å ha erstattet informasjonen i sidebufferen, når du leser data fra en fil, vil prosessen ikke motta de faktiske dataene, men de erstattede dataene.

Operasjon kommer ned til å lage en navngitt kanal og fylle den med vilkårlige data for å sikre at PIPE_BUF_FLAG_CAN_MERGE-flagget er satt i alle ringstrukturer knyttet til den. Deretter leses dataene fra kanalen, men flagget forblir satt i alle tilfeller av pipe_buffer-strukturen i pipe_inode_info-ringstrukturene. Et kall til splice() blir deretter foretatt for å lese data fra målfilen til et ikke navngitt rør, med start på ønsket offset. Når du skriver data til denne ikke navngitte pipen, på grunn av at PIPE_BUF_FLAG_CAN_MERGE-flagget settes, vil dataene i sidebufferen bli overskrevet i stedet for å opprette en ny forekomst av pipe_buffer-strukturen.

Kilde: opennet.ru

Legg til en kommentar