Уязвимост в ядрото на Linux, която може да подправя файлове само за четене

Беше идентифицирана уязвимост в ядрото на Linux (CVE-2022-0847), която позволява съдържанието на кеша на страницата да бъде презаписано за всякакви файлове, включително тези в режим само за четене, отворени с флага O_RDONLY или разположени на файлови системи монтиран в режим само за четене. На практика уязвимостта може да се използва за инжектиране на код в произволни процеси или за повреждане на данни в отворени файлове. Например, можете да промените съдържанието на файла authorized_keys за sshd процеса. Наличен е прототип на експлойт за тестване.

Проблемът е с кодово име Dirty Pipe, подобно на критичната уязвимост Dirty COW, идентифицирана през 2016 г. Отбелязва се, че по отношение на нивото на опасност Dirty Pipe е на същото ниво като Dirty COW, но е много по-лесен за работа. Уязвимостта беше идентифицирана по време на анализа на оплаквания за периодично повреждане на файлове, изтеглени по мрежата в система, изтегляща компресирани архиви от лог сървър (37 повреди за 3 месеца на заредена система), подготовката на която използва операцията splice(). и безименни тръби.

Уязвимостта се появява, започвайки с Linux ядрото 5.8, пуснато през август 2020 г., т.е. присъства в Debian 11, но не засяга основното ядро ​​в Ubuntu 20.04 LTS. Ядрата RHEL 8.x и openSUSE/SUSE 15 първоначално са базирани на стари клонове, но е възможно промяната, причиняваща проблема, да е била обратно портирана в тях (все още няма точни данни). Можете да проследите публикуването на актуализации на пакети в дистрибуции на тези страници: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux. Поправка за уязвимостта беше предоставена във версии 5.16.11, 5.15.25 и 5.10.102. Корекцията е включена и в ядрото, използвано в платформата Android.

Уязвимостта е причинена от липсата на инициализация на стойността „buf->flags“ в кода на функциите copy_page_to_iter_pipe() и push_pipe(), въпреки факта, че паметта не се изчиства при разпределяне на структура и при определени манипулации с безименни тръби, стойност от друга операция. Използвайки тази функция, непривилегирован локален потребител може да постигне появата на стойността PIPE_BUF_FLAG_CAN_MERGE във флага, което ви позволява да организирате презаписване на данни в кеша на страницата, като просто запишете нови данни в специално подготвен канал без име.

За атака целевият файл трябва да може да се чете и тъй като правата за достъп не се проверяват при запис в тръба, замяната в кеша на страницата може да се направи и за файлове, разположени в дялове, монтирани само за четене (например за файлове c CD- ROM). След подмяна на информацията в кеша на страницата, при четене на данни от файл, процесът ще получи не действителните данни, а заменените данни.

Операцията се свежда до създаване на канал без име и запълването му с произволни данни, за да се гарантира, че флагът PIPE_BUF_FLAG_CAN_MERGE е зададен във всички пръстеновидни структури, свързани с него. След това данните се четат от канала, но флагът остава зададен във всички екземпляри на структурата pipe_buffer в пръстеновидните структури pipe_inode_info. След това се прави извикване на splice() за четене на данни от целевия файл в неименуван канал, започвайки от желаното отместване. Когато записвате данни в този неименуван канал, поради зададения флаг PIPE_BUF_FLAG_CAN_MERGE, данните в кеша на страницата ще бъдат презаписани, вместо да се създаде нов екземпляр на структурата pipe_buffer.

Източник: opennet.ru

Добавяне на нов коментар