En sårbarhed er blevet identificeret i Linux-kernen (CVE-2022-0847), som gør det muligt at overskrive indholdet af sidecachen for alle filer, herunder dem der er åbnet med flaget O_RDONLY eller placeret i filsystemer, der er monteret i skrivebeskyttet tilstand. Praktisk set kan sårbarheden anvendes til at indsætte kode i vilkårlige processer eller forvrænge data i åbne filer. For eksempel kan indholdet af filen authorized_keys for processen sshd ændres. En prototype af exploit er tilgængelig til testning.
Problemet har fået kodenavn Dirty Pipe, ligesom den kritiske sårbarhed Dirty COW, der blev opdaget i 2016. Det bemærkes, at Dirty Pipe er lige så farlig som Dirty COW, men betydeligt nemmere at udnytte. Sårbarheden blev identificeret under behandlingen af klager om periodisk skade på netværksindlæsede filer i et system, der indlæser komprimerede arkiver fra logserveren (37 skader over 3 måneder på et overbelastet system), hvor operationen splice() og anonymiserede kanaler blev brugt.
Sårbarheden optræder fra Linux-kernens version 5.8, som blev udgivet i august 2020, dvs. den er til stede i Debian 11, men påvirker ikke basis-kernen i Ubuntu 20.04 LTS. Kernerne RHEL 8.x og openSUSE/SUSE 15 er oprindeligt baseret på gamle grene, men det er muligt, at den problematiske ændring er blevet backportet til dem (der foreligger endnu ikke præcise data). Opdateringer til pakker i distributionerne kan følges på disse sider: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux. Løsningen på sårbarheden er foreslået i versioner 5.16.11, 5.15.25 og 5.10.102. Løsningen er også inkluderet i kernen, der anvendes på Android-platformen.
Sårbarheden skyldes manglende initialisering af værdien «buf->flags» i koden for funktionerne copy_page_to_iter_pipe() og push_pipe(), da hukommelsen ikke bliver renset ved tildelingen af strukturen. Ved bestemte manipulationer med navnløse rør kan værdien fra en anden operation ende i «buf->flags». Ved at udnytte denne egenskab kan en ikke-privilegeret lokal bruger få værdien PIPE_BUF_FLAG_CAN_MERGE til at fremkomme i flaget, hvilket muliggør overskrivning af data i siden cache ved blot at skrive nye data til et særligt forberedt navnløst rør (pipe).
For at angreb kan finde sted, skal den målrettede fil være tilgængelig for læsning. Da der ikke kontrolleres adgangsrettigheder ved skrivning til røret, kan der også foretages erstatning i siden cache for filer, der er placeret i partitioner, der kun er monteret til læsning (for eksempel for filer på CD-ROM). Efter udskiftning af informationen i siden cache vil processen få ikke de faktiske, men de manipulerede data, når den læser data fra filen.
Udnyttelsen består i at skabe et navnløst rør og fylde det med vilkårlige data for at få flaget PIPE_BUF_FLAG_CAN_MERGE til at blive aktiveret i alle tilknyttede ringstrukturer. Herefter læses data fra røret, men flaget forbliver aktiveret i alle forekomster af strukturen pipe_buffer i ringstrukturerne pipe_inode_info. Derefter udføres et kald til splice() for at læse data fra den målrettede fil ind i det navnløse rør, startende fra det ønskede offset. Ved skrivning af data i dette navnløse rør vil dataene i siden cache blive overskrevet på grund af det aktiverede flag PIPE_BUF_FLAG_CAN_MERGE, i stedet for at oprette en ny forekomst af strukturen pipe_buffer.
Kilde: opennet.ru
