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

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

На проблема е присвоено кодовото име Dirty Pipe, аналогично с откритата през 2016 година критична уязвимост Dirty COW. Отбелязва се, че по ниво на опасност 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(), при том, что память при выделении структуры не очищается и при определённых манипуляциях с неименованными каналами в «buf->flags» может оказаться значение от другой операции. Используя данную особенность непривилегированный локальный пользователь может добиться появления во флаге значения PIPE_BUF_FLAG_CAN_MERGE, которое позволяет организовать перезапись данных в страничном кэше через простую запись новых данных в специально подготовленный неименованный канал (pipe).

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

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

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

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster