Уязвимость присутствует в реализации сетевого протокола 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
