В интерфейса за асинхронен вход/изход io_uring, предоставен от ядрото на Linux, е открита уязвимост (CVE-2024-0582), която позволява на непривилегирован потребител да получи права root в системата. За да се експлоатира уязвимостта, е необходим само обикновен локален достъп до системата, без нужда от манипулации с пространствата на имената. В момента е публично достъпен работещ експлоит, както и подробно описана втора техника за експлоатация на уязвимостта.
Уязвимостта е причинена от достъп до вече освободен блок памет (use-after-free) в подсистемата io_uring, който възниква при регистрация и освобождаване на кръгов буфер, създаден с флага IORING_REGISTER_PBUF_RING. В ситуация при прилагане на операция mmap() към буфера, той остава отразен в пространството на потребителя след изпълнението на операцията му по освобождаване (IORING_UNREGISTER_PBUF_RING). Използвайки това особеност, атакуващият може да чете и записва данни в страниците на паметта, върнати на системата за разпределение на паметта на ядрото.
Проблемът се проявява от версия на ядрото Linux 6.4 и е отстранен в версиите 6.7 и 6.6.5, както и в пакета с ядро 6.5.0-21, подготвен за Ubuntu 22.04 и 23.10. Интересно е, че в основното ядро проблемът е бил поправен през декември 2023 година, проектът Google Zero е открил достъп до сигнализиращо наличие на уязвимост съобщение за грешка на 8 януари, а пакетът с поправеното ядро 6.5 за Ubuntu е бил създаден едва на 22 февруари 2024 година. В други дистрибуции може да се проследи поправката и подвержеността на уязвимостта на страниците: Debian, Gentoo, RHEL, SUSE, Fedora, Arch.
Първият експлоит манипулира създаването на голямо количество контролирани от атакуващия страници памет за определяне на разположението на паметта в ядрото и достъп до съседни физически страници памет, използвайки като маяци съдържанието на по определен начин запълнени структури на мрежови сокети. За изпълнение на код в експлоита се използва "гаджет" (последователност от съществуващи в ядрото инструкции), водещ до изпълнението на функцията call_usermodehelper_exec, предназначена за стартиране на процеси в пространството на потребителя от ядрото.
Вторият експлойт се основава на факта, че при изчерпване на всички slab-блокове в кеша (например, при многократно отваряне на файл), свободните страници памет, до които атакуващият има достъп, се използват от системата за разпределение на паметта за създаване на нов slab-блок и всички нови файлови структури започват да се разполагат в този блок. В резултат на това някои файлови структури попадат в страници памет, които атакуващият може да чете и записва. Експлоатацията се свежда до организационното попадане в файловия кеш на нужния файл и замяната в свързаните с него файлови структури на полето f_mode, определящо правата за достъп, което позволява да се направи достъпен за запис нужния системен файл, например, /etc/passwd.
Източник: opennet.ru
