В ядре Linux обнаружена опасная уязвимость локального повышения привилегий CVE-2026-31431, получившая название Copy Fail. Она затрагивает подсистему шифрования AF_ALG, а точнее - механизм обработки scatterlist при передаче данных через системный вызов splice. Ошибка позволяет атакующему, уже имеющему локальный доступ к системе, перехватить страницы кэша любого читаемого файла и подменить их кодом, который затем будет выполнен с максимальными привилегиями.
Описание
Проблема проявляется в ядрах Linux начиная с версии 4.9 до 6.8 включительно. Уязвимость была внесена в код в 2017 году, когда инженеры оптимизировали слияние scatterlist для сокращения накладных расходов. Исправление уже доступно в версии 6.9-rc1 и выше. Под ударом оказались многие популярные дистрибутивы - как международные, так и российские: в зону риска попали системы на базе Kylin V10/V11 (ARM64), UOS 20 (x86_64), openEuler 22.03 SP2 (ARM64) и другие. Согласно оценке по шкале CVSS 3.1, уязвимости присвоено 7,8 балла - это высокий уровень опасности, хотя для эксплуатации и не требуется взаимодействия с пользователем.
Суть атаки заключается в том, что злоумышленник может использовать связку AF_ALG и splice для записи четырёх байт в любую страницу кэша произвольного читаемого файла. Пока это лишь четыре байта, но, повторяя операцию множество раз, атакующий пошагово заменяет содержимое исполняемого файла с битом setuid, например /usr/bin/su. После этого обычный вызов execve("/usr/bin/su") приводит к загрузке подменённого кода, который немедленно запускает оболочку с правами root. Парольная аутентификация, PAM, чтение /etc/shadow - вся цепочка проверок просто не выполняется, так как загрузчик берёт уже испорченный кэш.
Специалисты компании-разработчика средств защиты опубликовали детальный анализ механизма эксплуатации. Они поясняют, что ключевую роль играет структура scatterlist - список разбросанных физически блоков памяти, с которыми работают драйверы криптографических алгоритмов. Оптимизация 2017 года сделала так, что исходный буфер и буфер вывода стали одним и тем же списком. Когда пользователь через splice подаёт на вход сокета AF_ALG страницы кэша утилиты su, эти страницы попадают в scatterlist, а алгоритм authencesn (проверка целостности с последовательными номерами) при обработке выходит за границы выделенного буфера и записывает управляющие данные прямо в страницы su. Каждая операция смещает указатель записи, и постепенно весь файл su заменяется кодом-вставкой, который, по сути, вызывает setuid(0), setgid(0) и execve("/bin/sh").
Парадокс ситуации в том, что на диске файл /usr/bin/su остаётся нетронутым. У него сохраняется бит setuid, и ядро честно проверяет права доступа при вызове execve. Однако оно не сверяет, что загруженный из кэша код соответствует тому, что лежит на диске. Этот разрыв между авторизацией и фактическим исполнением и составляет суть уязвимости.
Для защиты разработчики рекомендуют немедленно обновить ядро до версии 6.9 или установить патч, предоставленный вендором. Пользователям дистрибутивов с длительным сроком поддержки следует дождаться бэкпорта исправления. Кроме того, существуют средства мониторинга, способные выявить аномальную цепочку вызовов - открытие AF_ALG-сокета, использование splice с последующим execve на программу с setuid. Такая последовательность в обычной практике практически не встречается, поэтому её обнаружение служит верным признаком атаки. Песочницы, построенные на анализе поведения процессов, уже получили правила для блокировки подобных действий.
Уязвимость Copy Fail - ещё одно напоминание о том, как оптимизация производительности на уровне ядра может открыть неожиданные векторы атак. Хотя для эксплуатации требуется локальный доступ, в средах с мультиарендностью или на серверах, где работают сторонние приложения, риск остаётся высоким. Своевременное обновление и многоуровневая защита - единственный способ не допустить компрометации системы.
Индикаторы компрометации
MD5
- 7d5f66c7332a4f929e99380f3f496b5d
- cde0721a815d8d2a8e37e291a972e538
- de1d2a9e44ba05f083a40a3fa9530411