Linux kernel «Copy Fail»: уязвимость CVE-2026-31431 даёт root через AF_ALG, патчей пока нет

Локальный privilege escalation в модуле algif_aead — наследие оптимизации 2017 года. Эксплойт уже опубликован, патчей пока нет. Что отключать на нодах прямо сейчас.

Обложка: Linux kernel «Copy Fail»: уязвимость CVE-2026-31431 даёт root через AF_ALG, патчей пока нет

На Ubuntu 24.04, RHEL 10.1, SUSE 16 и Amazon Linux 2023 любой пользователь без прав root может стать root за несколько секунд — патча для уязвимости пока нет ни в одном дистрибутиве. CERT-EU выпустил advisory 2026-005 29 апреля и настоятельно рекомендует временные меры для Kubernetes-нод и CI/CD-раннеров с непроверенными нагрузками.

Уязвимость CVE-2026-31431 по прозвищу Copy Fail — это локальный privilege escalation в ядре Linux с CVSS 7.8. Исследователи опубликовали подробное описание и рабочий PoC; mainline-фикс влит 1 апреля 2026 года, но ни Ubuntu, ни Amazon, ни SUSE до сих пор не выпустили обновлённый пакет ядра.

Под ударом — все основные дистрибутивы с ядром, собранным с 2017 года. Эксплойт цепляет AF_ALG-сокет с системным вызовом splice(), выполняет произвольную 4-байтовую запись в страницу page-cache, затем подменяет байты в /usr/bin/su — и запускает root-шелл.

Ключевые выводы

CVE-2026-31431 (Copy Fail) — локальный privesc в ядре Linux, CVSS 7.8. Опубликован 29 апреля 2026 года, есть рабочий PoC.

Дыра в модуле algif_aead — часть userspace crypto API ядра. Появилась в 2017 году с коммитом 72548b093ee3.

Затронуты ядра 2017–2026. Подтверждено: Ubuntu 24.04 (6.17), Amazon Linux 2023 (6.18), RHEL 10.1 (6.12), SUSE 16 (6.12). Ubuntu 26.04 «Resolute» и новее — нет.

Патчей нет ни у кого. Mainline-фикс — коммит a664bf3d603d от 1 апреля, но Ubuntu, Amazon, SUSE на 30 апреля статус — «No fix available».

Что делать сейчас: отключить модуль algif_aead через modprobe.d, в контейнерах — блокировать AF_ALG-сокеты через seccomp-профиль.

Что такое AF_ALG и где это в системе

AF_ALG — это семейство сокетов в ядре Linux, через которое userspace-программы получают доступ к криптографическому API ядра без libcrypto. Открываете сокет с типом AF_ALG, говорите ядру «дай мне AES-GCM», передаёте данные через обычный read/write — и получаете шифрованные обратно. Никаких прав и привилегий не требуется: интерфейс задумывался для удобства, чтобы криптографию можно было дёргать из любой программы.

Уязвимый компонент — модуль algif_aead, обработчик AEAD-операций (Authenticated Encryption with Associated Data — это AES-GCM, ChaCha20-Poly1305 и подобные алгоритмы). В нём в 2017 году появилась оптимизация: вместо того чтобы копировать данные пользователя в служебный буфер, ядро стало работать прямо со страницами page-cache — кэшем файловой системы. Идея была разумной: убрать лишнюю копию, ускорить шифрование больших файлов. Через девять лет выяснилось, чем это обернулось.

Технический разбор: четыре байта в чужой странице

Атака собирается из двух примитивов. Первый — AF_ALG-сокет, который из-за оптимизации 2017 года готов писать результат шифрования в любую page-cache-страницу, переданную в scatterlist назначения. Второй — системный вызов splice(), через который непривилегированный процесс может протолкнуть в этот scatterlist страницу из произвольного файла, который разрешено читать.

Контролировать запись на байт получается так: исследователи подбирают входные данные для AEAD-операции так, чтобы первые четыре байта зашифрованного результата совпали с нужным значением. Эти четыре байта ядро без проверок пишет в указанную страницу — а страница, благодаря splice(), оказывается куском исполняемого файла. Цель — /usr/bin/su: в нужное место кода вставляется четыре байта, которые превращают проверку пароля в return 0. После этого su root пускает любого пользователя без пароля.

Mainline-фикс — коммит a664bf3d603d, влитый 1 апреля 2026 года, — отменяет ту самую оптимизацию 2017 года: модуль снова работает через служебный буфер, и страницы page-cache в scatterlist назначения больше не попадают.

На дистрибутивах с включённым AF_ALG это даже не эксплойт в классическом смысле. Это корректное использование документированного интерфейса ядра — просто результат корректного использования оказывается «root».
Авторы advisory copy.failисследователи безопасности

Кого это касается

Подтверждённые исследователями системы (с конкретной версией ядра, на которой воспроизвели PoC):

  • Ubuntu 24.04 LTS — ядро 6.17.0-1007-aws
  • Amazon Linux 2023 — ядро 6.18.8-9.213.amzn2023
  • RHEL 10.1 — ядро 6.12.0-124.45.1.el10_1
  • SUSE Linux Enterprise 16 — ядро 6.12.0-160000.9-default

Все остальные дистрибутивы с ядром, собранным между 2017 и текущим релизом, скорее всего, тоже уязвимы: Debian, Arch Linux, Fedora, Rocky Linux, AlmaLinux, Oracle Linux, плюс embedded-сборки. Не затронуто только ядро Ubuntu 26.04 «Resolute» и новее.

Статус патчей у вендоров на 30 апреля 2026 года:

  • Ubuntu 20.04–24.04 — патча нет
  • Amazon Linux 2023 — патча нет
  • SUSE Linux Enterprise — патча нет
  • Red Hat Enterprise Linux — статус неизвестен

В первую очередь под угрозой — Kubernetes-кластеры и CI/CD-раннеры, где запускаются чужие контейнеры или скрипты: им достаточно AF_ALG-сокета, доступного по умолчанию, чтобы получить root на ноде. Облачные ВМ, где соседствуют разные пользователи и где shared-tenancy не отключён, тоже в группе риска.

Что делать прямо сейчас

Отключить модуль algif_aead

CERT-EU рекомендует отключать модуль персистентно — через modprobe.d и сразу же выгрузить из памяти, если он уже загружен:

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

После этого попытка загрузить модуль вернётся ошибкой, и приложения не смогут открыть AF_ALG-сокет с типом aead. На dm-crypt/LUKS, kTLS, IPsec/XFRM, OpenSSL, GnuTLS, NSS и SSH это никак не повлияет — все они работают через другие интерфейсы. Под удар попадают только программы, которые явно настроены на afalg-движок или открывают сокеты aead/skcipher/hash напрямую. Проверить, кто использует, можно так:

			lsof | grep AF_ALG
		

Заблокировать AF_ALG в контейнерах через seccomp

Эксплойт начинается с открытия AF_ALG-сокета, поэтому в контейнерах достаточно запретить системный вызов socket() для этого семейства. CERT-EU рекомендует это делать на всех контейнеризованных нагрузках вне зависимости от того, пропатчено ядро или нет — это работает и как mitigation, и как defense-in-depth. Минимальный seccomp-профиль:

			{
  "defaultAction": "SCMP_ACT_ALLOW",
  "syscalls": [
    {
      "names": ["socket"],
      "action": "SCMP_ACT_ERRNO",
      "args": [{"index": 0, "value": 38, "op": "SCMP_CMP_EQ"}]
    }
  ]
}
		

Значение 38 — это константа AF_ALG в linux/socket.h. Профиль подключается через --security-opt seccomp=... в Docker и Podman, в Kubernetes — через securityContext.seccompProfile.

Часто задаваемые вопросы
1
Безопасны ли мои Kubernetes-ноды?

Если у вас Ubuntu, RHEL, SUSE или Amazon Linux с ядром версии 4.x–6.18 и на нодах могут запускаться чужие поды, ноды уязвимы. Проверьте версию ядра через uname -r, выполните mitigation из раздела «Что делать прямо сейчас» и подключите seccomp-профиль с блокировкой AF_ALG. Управляемые Kubernetes-сервисы (EKS, GKE, AKS) выкатят патч в течение нескольких дней — следите за бюллетенями вашего провайдера.

2
Можно ли просто отключить модуль и не возвращаться к этому?

В большинстве серверных и десктопных сценариев — да. Modprobe-блок останется после перезагрузки и не сломает ни disk encryption, ни TLS, ни SSH. Но это временная мера: лучше всё-таки накатить пропатченное ядро, когда вендор его выкатит. Без модуля перестанут работать приложения, которые специально завязаны на afalg-engine — это редкий случай, но проверить стоит.

3
Откуда взялась эта дыра — она новая или старая?

Старая. Уязвимость живёт с лета 2017 года — её ввёл коммит 72548b093ee3, оптимизировавший работу algif_aead со страницами page-cache. Восемь с половиной лет в любом серверном ядре Linux был спокойный путь к root для локального атакующего. Mainline-фикс (a664bf3d603d) — это просто revert той оптимизации.

4
PoC уже в интернете — насколько это плохо?

Уже плохо. Рабочий эксплойт лежит на copy.fail с 29 апреля, и для запуска не нужно ничего экзотического: достаточно Python 3.10+ из стандартной библиотеки и непривилегированного шелла. Если у вас на машине запускается что-то от пользователей или CI-задач, нужно действовать сегодня.

5
Можно ли эксплуатировать эту дыру удалённо?

Нет. Это локальная privilege escalation: атакующему нужен уже какой-то непривилегированный код на машине — пользовательский шелл, поды Kubernetes, контейнер CI-задачи, скрипт от незаслуживающего доверия пользователя. Без этого Copy Fail не сработает. Но в облачной инфраструктуре, где локальный непривилегированный доступ — норма, разница между «локально» и «удалённо» стирается.

Выводы

Copy Fail — типовая история про оптимизацию ради скорости, которая девять лет хранила в себе одну из самых удобных лазеек к root. Ничего сложного для атакующего, ничего сильно ломающегося при mitigation — а вендоры всё равно опаздывают с патчами. До тех пор, пока в apt update или dnf upgrade не появится новое ядро, защита лежит на админах: один modprobe-блок и один seccomp-профиль закрывают вектор полностью.

Источники: CERT-EU Security Advisory 2026-005, copy.fail — описание и PoC исследователей, трекеры вендоров: Ubuntu, SUSE, Red Hat.

Проверьте свои ноды и контейнеры прямо сейчас — пропатченных ядер для большинства дистрибутивов всё ещё нет, и ситуация не изменится в ближайшие сутки.