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

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

Уязвимость присутствует в реализации сетевого протокола 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/falseninstall rds_tcp /bin/falsen' > /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.

Источник: http://www.opennet.ru/opennews/art.shtml?num=65476