LurkHub Community

Fsociety
Fsociety

Опубликовано

PinTheft - шестая уязвимость класса Copy Fail, предоставляющая права root в Linux

Раскрыта информация о шестой уязвимости (1, 2-3, 4, 5), позволяющей непривилегированному локальному пользователю получить права root, перезаписав данные в страничном кэше. Уязвимость получила кодовое имя PinTheft. Доступен прототип эксплоита. CVE-идентификатор ещё не присвоен. Исправление пока доступно только в виде патча, который отправлен разработчикам ядра 5 мая, но пока не включён в корректирующие выпуски ядра.

Уязвимость присутствует в реализации сетевого протокола RDS (Reliable Datagram Sockets), предназначенного для высокоскоростного обмена сообщениями между узлами в кластере, с минимальной задержкой и гарантированной доставкой. Атака возможна на системы с включённой подсистемой io_uring (io_uring_disabled=0) и ядром, собранным с опциями CONFIG_RDS, CONFIG_RDS_TCP и CONFIG_IO_URING. Для работы эксплоита в системе должен быть доступный на чтение исполняемый файл с флагом SUID-root.

Для автоматической загрузки модуля ядра rds_tcp эксплоит запрашивает отправку данных через RDS с использованием транспорта SO_RDS_TRANSPORT=2. Отмечается, что среди протестированных дистрибутивов Linux в конфигурации по умолчанию модуль ядра rds предоставляется только в Arch Linux. Для блокирования уязвимости обходным путём можно заблокировать автозагрузку модулей ядра rds и rds_tcp:

rmmod rds_tcp rds
printf 'install rds /bin/false\ninstall rds_tcp /bin/false\n' > /etc/modprobe.d/pintheft.conf

Уязвимость вызвана ошибкой в реализации механизма zerocopy в функции rds_message_zcopy_from_user(), осуществляющего прямое изменение данных в страничном кэше для исключения лишней буферизации. Из-за отсутствия очистки поля rm->data.op_nents после сбоя выполнялось двойное освобождение буфера (double-free), которое удалось эксплуатировать для перезаписи данных в страничном кэше, благодаря манипуляции с указателем на фиксированный буфер io_uring.

В остальном механизм эксплуатации типичен для всех уязвимостей данного класса - атакующий добивается оседания файла программы с флагом suid root в страничном кэше через его чтение, после чего подставляет в ELF-заголовок код для запуска /usr/bin/sh. После данной манипуляции запуск программы приводит к загрузке в память не оригинального исполняемого файла с накопителя, а изменённой копии из страничного кэша. В отличие от прошлых эксплоитов, новый вариант адаптирован для только для атаки на утилиту "su", но и может применяться при наличии в системе таких suid-программ, как mount, passwd, chsh, newgrp, umount и pkexec.

Лучшие комментарии (0)