Исследователи из компании Xint выявили в ядре Linux уязвимость (CVE-2026-31431), позволяющую непривилегированному пользователю получить root-доступ к системе. Проблеме присвоено кодовое имя Copy Fail. Доступен прототип эксплоита. Возможность эксплуатации уязвимости продемонстрирована в Ubuntu 24.04 LTS, Amazon Linux 2023, RHEL 10.1 и SUSE 16, но отмечается, что пакеты с ядром из других дистрибутивов, включая Debian, Arch, Fedora, Rocky и Alma, тоже подвержены проблеме, но их отдельно не тестировали. Теоретически уязвимость может быть эксплуатирована в любых дистрибутивах с ядрами Linux начиная с 4.14, в которых не отключена поддержка сокетов AF_ALG.
Уязвимость вызвана логической ошибкой в crypto API (AF_ALG) ядра Linux, допущенной в 2017 году при внесении оптимизации, убирающей лишнюю буферизацию через выполнение по месту (in-place) операций блочного шифрования AEAD (Authenticated Encryption with Associated Data). Проблема возникла из-за необдуманного использования функции splice(), передающей данные между файловыми дескрипторами и каналами (pipe) без копирования, путём передачи ссылок на элементы в страничном кэше. После внесения оптимизации при передаче файла в сокет AF_ALG для расшифровки в структуру scatterlist записывалась не ссылка на отдельный буфер, а прямая ссылка на элементы страничного кэша ядра c данными файла.
В дальнейшем в процессе расшифровки AEAD вместе использовались привязанные по ссылке данные тега аутентификации ("authentication tag") из страничного кэша и копируемые в RX-буфер дополнительные аутентифицируемые данные (AAD, Associated Authenticated Data) и шифротекст, а смещение для операции записи в тег аутентификации рассчитывалось с учётом скопированных данных без должных проверок, что позволяло перезаписать произвольные области в страничном кэше.
Уязвимость даёт возможность при каждом запросе перезаписать 4 байта по выбранному смещению, что позволяет атакующему через отправку серии запросов изменить в страничном кэше содержимое любого файла в системе, доступного для чтения, предварительно добившись его помещения в кэш. Так как при любых операциях чтения из файлов содержимое отдаётся в первую очередь из страничного кэша, после замены информации в страничном кэше ядро или процесс при чтении данных из файла получит не фактические, а подменённые данные, что может применяться для подстановки кода в запускаемые исполняемые файлы или загружаемые разделяемые библиотеки.
Для выполнения кода с правами root достаточно добиться изменения страничного кэша для любого исполняемого файла с флагом suid root. В предложенном эксплоите выполняется чтение исполняемого файла /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, ROSA. Актуальные версии Android не подвержены атаке из-за ограничения доступа к сокетам AF_ALG при помощи SELinux.
На системах, в которых поддержка AEAD собрана в форме модуля (в некоторых дистрибутивах ядра собраны с CONFIG_CRYPTO_USER_API_AEAD=y), в качестве обходного пути защиты можно отключить модуль ядра algif_aead. AF_ALG используется в OpenSSL при явном включении движка afalg и в отдельных приложениях (проверить наличие подобных запущенных приложений можно командой "lsof | grep AF_ALG").
echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif.conf
rmmod algif_aead
Дополнение 1: Опубликованы обновления ядра 5.10.254, 5.15.204, 6.1.170, 6.6.137, 6.12.85 с устранением уязвимости. Рассматривание возможность пометки функциональности AF_ALG устаревшей с последующим удалением из ядра в пользу использования криптобиблиотек в пространстве пользователя.
Дополнение 2: Доступны варианты эксплоитов на языках Си и Go.
Источник: https://www.opennet.ru/opennews/art.shtml?num=65325






