Sårbarhet i Linux-kärnan som gör att skrivskyddade filer kan skadas

En sårbarhet har identifierats i Linux-kärnan (CVE-2022-0847) som gör att innehållet i sidcachen kan skrivas över för alla filer, inklusive de som är i skrivskyddat läge, öppnas med flaggan O_RDONLY eller finns i filsystem monterad i skrivskyddat läge. I praktiska termer kan sårbarheten användas för att injicera kod i godtyckliga processer eller korrupta data i öppnade filer. Till exempel kan du ändra innehållet i filen authorized_keys för sshd-processen. En exploateringsprototyp är tillgänglig för testning.

Problemet har fått kodnamnet Dirty Pipe, liknande den kritiska sårbarheten Dirty COW som identifierades 2016. Det noteras att när det gäller risknivå ligger Dirty Pipe på samma nivå som Dirty COW, men är mycket lättare att använda. Sårbarheten identifierades under analysen av klagomål om periodisk korruption av filer som laddats ner över nätverket i ett system som laddar ner komprimerade arkiv från en loggserver (37 korruptioner på 3 månader på ett laddat system), vars förberedelse använde operationen splice() och namnlösa rör.

Sårbarheten uppträder från och med Linux-kärnan 5.8, släppt i augusti 2020, dvs. finns i Debian 11, men påverkar inte baskärnan i Ubuntu 20.04 LTS. RHEL 8.x- och openSUSE/SUSE 15-kärnorna är initialt baserade på gamla grenar, men det är möjligt att ändringen som orsakade problemet backporterades till dem (det finns inga exakta data ännu). Du kan följa publiceringen av paketuppdateringar i distributioner på dessa sidor: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux. En korrigering för sårbarheten tillhandahölls i versionerna 5.16.11, 5.15.25 och 5.10.102. Fixeringen ingår också i kärnan som används i Android-plattformen.

Sårbarheten orsakas av bristen på initialisering av värdet “buf->flags” i koden för funktionerna copy_page_to_iter_pipe() och push_pipe(), trots att minnet inte rensas vid allokering av en struktur och vid vissa manipulationer med namnlösa rör, ett värde från en annan operation. Med den här funktionen kan en oprivilegierad lokal användare uppnå utseendet på värdet PIPE_BUF_FLAG_CAN_MERGE i flaggan, vilket gör att du kan organisera dataöverskrivning i sidcachen genom att helt enkelt skriva ny data till en speciellt förberedd namnlös pipe.

För en attack måste målfilen vara läsbar, och eftersom åtkomsträttigheter inte kontrolleras när man skriver till pipe, kan ersättning i sidcachen även göras för filer som finns i partitioner monterade skrivskyddat (till exempel för filer c CD- ROM). Efter att ha ersatt informationen i sidcachen, när du läser data från en fil, kommer processen inte att ta emot den faktiska datan, utan den ersatta datan.

Operation handlar om att skapa en namnlös kanal och fylla den med godtyckliga data för att säkerställa att flaggan PIPE_BUF_FLAG_CAN_MERGE är inställd i alla ringstrukturer som är associerade med den. Därefter läses data från kanalen, men flaggan förblir inställd i alla instanser av pipe_buffer-strukturen i pipe_inode_info-ringstrukturerna. Ett anrop till splice() görs sedan för att läsa data från målfilen till ett namnlöst rör, med start vid önskad offset. När du skriver data till denna namnlösa pipe, på grund av att flaggan PIPE_BUF_FLAG_CAN_MERGE sätts, kommer data i sidcachen att skrivas över istället för att skapa en ny instans av pipe_buffer-strukturen.

Källa: opennet.ru

Lägg en kommentar