Уязвимость вызвана логической ошибкой в crypto API (AF_ALG), допущенной при внесении в 2017 году оптимизации для исключений лишней буферизации через выполнения по месту (in-place) операций блочного шифрования AEAD (Authenticated Encryption with Associated Data). Проблема вызвана из-за некорректного использования функции splice(), передающей данные между файловыми дескрипторами и каналами (pipe) без копирования, путём передачи ссылок на элементы в страничном кэше. Таким образом, при передаче файла в сокет AF_ALG для расшифровки структура scatterlist содержала не ссылку на отдельный буфер, а прямую ссылку на элементы страничного кэша ядра c данными файла.
В дальнейшем в процессе расшифровки AEAD смешивались привязанные по ссылке страницы «auth tag» с копируемыми в RX-буфер дополнительными аутентифицируемыми данными (AAD, Associated Authenticated Data) и шифротекстом, а смещение для операции записи в «auth tag» рассчитывалось относительно скопированных данных без должных проверок, что позволяло перезаписать произвольные области в страничном кэше.
Уязвимость даёт возможность при каждом запросе перезаписать 4 байта в по выбранному смещению, что позволяет позволяет атакующему через отправку серии запросов изменить в страничном кэше содержимое любого файла в системе, доступного для чтения, предварительно добившись его помещения в кэш. Так как при любых операциях чтения из файлов, включая загрузку исполняемых файлов и разделяемых библиотек, содержимое отдаётся в первую очередь из страничного кэша, после замены информации в страничном кэше ядро или процесс при чтении данных из файла получит не фактические, а подменённые данные, что может применяться для подстановки кода в произвольные процессы или искажения данных в открываемых файлах.
В предложенном эксплоите выполняется чтение исполняемого файла /usr/bin/su и модификация загруженного в страничный кэш содержимого этого файла для отключения проверки пароля.
При последующем запуске утилиты «su», будет загружен не оригинальный исполняемый файл с накопителя, а изменённая копия из страничного кэша.
Эксплоит универсален, не требует адаптации к дистрибутивам или версиям ядра, и может использоваться с любыми дистрибутивами. Так как при использовании контейнерной изоляции для всех контейнеров используется общий страничный кэш, уязвимость можно использовать для получения доступа к хост-окружению из контейнера (позднее обещают опубликовать эксплоит для обхода изоляции в Kubernetes).
Уязвимость выявлена при помощи AI примерно после часа экспериментов с анализом кода криптоподсистемы ядра. Проблема проявляется начиная с ядра Linux 4.14, выпущенного в 2017 году, и устранена в ядрах 6.18.22, 6.19.12 и 7.0. Статус устранения уязвимостей в дистрибутивах можно оценить на данных страницах: Debian, Ubuntu, SUSE/openSUSE, RHEL, Gentoo, Arch,
Fedora.
В качестве обходного пути защиты можно отключить модуль ядра algif_aead, который может использоваться в OpenSSL при явном включении движка afalg и в некоторых отдельных приложениях (проверить наличие подобных запущенных приложений можно командой «lsof | grep AF_ALG»):
echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif.conf rmmod algif_aead
Источник: http://www.opennet.ru/opennews/art.shtml?num=65325
