Linux

/
/
Уязвимость Copy Fail позволяет любому пользователю Linux получить root-доступ

Уязвимость Copy Fail позволяет любому пользователю Linux получить root-доступ

29.04.2026 была обнаружена уязвимость «Copy Fail», получившая номер CVE-2026-31431. Уязвимость затрагивает все дистрибутивы Linux, собранные с 2017 по апрель 2026 года.

Уязвимость позволяет получить любому пользователю в Linux доступ к правам суперпользователя.

Подробно об уязвимости

Проблема кроется в криптографической подсистеме ядра, а именно в шаблоне authencesn и модуле algif_aead, который обеспечивает доступ к AEAD-шифрованию через сокетный интерфейс AF_ALG.

Уязвимость позволяет обычному пользователю записать всего 4 байта в page cache(кэш оперативной памяти) любого читаемого файла, не трогая сам файл на диске. Для этого используется связка из AF_ALG и системного вызова splice()— штатных механизмов Linux, доступных всем пользователям без исключений. Ошибка возникает, когда authencesn в процессе дешифрования записывает данные за границы буфера, попадая в страницы кэша, переданные через splice().

Атакующий выбирает setuid-бинарник — программу, которая при запуске автоматически получает права администратора (например, /usr/bin/su), и подменяет 4 байта в её кэшированной копии. После этого программа вместо запроса пароля выдаёт root-доступ.

Файл на диске остаётся неизменным. Системы контроля целостности (AIDEsha256sum), сравнивающие файл с эталоном, ничего не замечают. Следов атаки практически нет: изменённая страница живёт только в оперативной памяти и исчезает после перезагрузки или очистки кэша.

Кто подвержен

Уязвимости подвержены все дистрибутивы Linux, собранные с 2017 по апрель 2026 года - согласно исследованию, один и тот же эксплойт работает на всех архитектурах без необходимости вносить специфические изменения.

Самому большому риску подвержены многопользовательские серверы, облачные сервисы, содержащие пользовательский код, контейнеры, Kubernetes и CI-раннеры - всё из-за возможности размещения пользователями собственного кода на сервере.

Определить наличие уязвимости можно с помощью python-скрипта:

python3 -c 'import socket;s=socket.socket(38,5,0);s.bind(("aead","authencesn(hmac(sha256),cbc(aes))"));print("vulnerable");s.close()' 2>/dev/null || echo "Not vulnerable / blocked"

Исправление

В операционной системе

Самое главное, что необходимо сделать - это обновить ядро с патчем из коммита a664bf3, поскольку данное исправление убирает in-place-оптимизацию в модуле algif_aead. Также крайне рекомендуется следить за обновлениями ядра на сайтах Red Hat и Ubuntu.

В качестве временного решения, до выпуска обновления ядра, модуль algif_aead можно отключить:

Выполните команды:

echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif-aead.conf
rmmod algif_aead 2>/dev/null

После выполнения команд рекомендуется перезагрузить сервер.

Внести изменения в /etc/default/grub, добавив значение initcall_blacklist=algif_aead_init в переменную GRUB_CMDLINE_LINUX.

После этого сделайте резервную копию конфигурации GRUB и сгенерируйте новую:

cp -a /boot/grub2/grub.cfg /boot/grub2/grub.cfg_BACK
grub2-mkconfig -o /boot/grub2/grub.cfg

Затем перезагрузите сервер и проверьте, установился ли флаг для модуля:

grep initcall_blacklist /proc/cmdline

В качестве альтернативного решения для AlmaLinux, воспользуйтесь утилитой grubby для отключения модуля, выполнив команду:

grubby --update-kernel=ALL --args="initcall_blacklist=algif_aead_init"

Затем перезагрузите сервер и проверьте, установился ли флаг для модуля:

grep initcall_blacklist /proc/cmdline

Если на сервере используются контейнеры, необходимо заблокировать возможность создавать AF_ALG-сокеты через seccomp. Отключения модуля не должно повлиять на частые задачи, в том числе на LUKS, IPsec и OpenSSL без afalg-движка.

Если вы пользуетесь WSL и/или WSL2, необходимо вручную установить патч и также вручную пересобрать ядро.

ispmanager 6

В ispmanager 6 в качестве временного решения можно отключить доступ к Shell всем пользователям со сбросом SSH-сессий (пользовательские сессии встроенного в панель Shell-клиента не будут сброшены!):

while IFS= read -r line; do /usr/local/mgr5/sbin/mgrctl -m ispmgr user.edit elid=$line limit_shell=off sok=ok; pkill -u $line sshd; done < <(/usr/local/mgr5/sbin/mgrctl -m ispmgr user | awk '{print $1}' | cut -c 6-)

Данный скрипт не предназначен для применения на высоконагруженных серверах и панелях с большим количеством пользователей - применяйте его с осторожностью!

В таких системах работа скрипта займет много времени, а также процесс может и вовсе зависнуть.