
Bash-проверщик только для чтения для уязвимости Copy Fail в ядре Linux (CVE-2026-31431)
Небольшой Bash-скрипт с минимумом зависимостей, который сообщает, подвержена ли ваша система Linux уязвимости локального повышения привилегий Copy Fail (CVE-2026-31431).
Скрипт только читает систему: он никогда не эксплуатирует уязвимость, не загружает модули ядра и не изменяет систему.
Copy Fail — это логическая ошибка в криптографическом шаблоне AEAD authencesn ядра Linux, доступная из пользовательского пространства через сокетный интерфейс AF_ALG (algif_aead).
| Поле | Значение |
|---|---|
| CVE | CVE-2026-31431 |
| Раскрыта | 2026-04-29 |
| CVSS v3.1 | 7.8 (высокий) |
| Класс | Локальное повышение привилегий |
| Затронутый компонент | crypto/authencesn + crypto/algif_aead |
| Появилась в | 2017 (оптимизация AEAD in-place в algif_aead.c) |
| Исправление в mainline | коммит a664bf3d603d, внесён 2026-04-01 |
Непривилегированный локальный пользователь может вызвать детерминированную управляемую запись 4 байт в page cache любого файла, который он может читать. Публичный proof-of-concept (732 байта Python) использует этот примитив для перезаписи setuid-бинарника и получения root практически во всех массовых дистрибутивах, выпущенных с 2017 года.
Каждый дистрибутив Linux, который поставляет ядро, собранное с 2017 года с включённым algif_aead. Подтверждённо затронутые семейства включают:
# Download the script
curl -fsSLO https://raw.githubusercontent.com/samanzamani/copy-fail-checker/main/check-copy-fail.sh
# Make it executable
chmod +x check-copy-fail.sh
# Run it
./check-copy-fail.sh
Или клонируйте репозиторий:
git clone https://github.com/samanzamani/copy-fail-checker.git
cd copy-fail-checker
./check-copy-fail.sh
Скрипту не требуются права root. Запуск от имени вашего обычного пользователя даёт наиболее реалистичную картину поверхности атаки, поскольку именно в таком контексте действовал бы атакующий.
Скрипт выполняет три независимые проверки и объединяет их в единый вердикт.
Он читает /etc/os-release и uname -r, затем сравнивает ваше работающее ядро с официальной исправленной версией, опубликованной службой безопасности вашего дистрибутива. Таблица версий в настоящее время охватывает:
Если вашего дистрибутива нет в таблице, скрипт переключается на проверки времени выполнения, описанные ниже.
algif_aeadСкрипт проверяет четыре вещи, ничего при этом не изменяя:
lsmod)modinfo)/etc/modprobe.d, /usr/lib/modprobe.d или /run/modprobe.d/boot/config-<uname> или /proc/config.gzМодуль из чёрного списка, не загруженный и не встроенный в ядро, закрывает поверхность атаки даже на непропатченном ядре.
AF_ALGНаиболее надёжный сигнал — то, что реально увидел бы атакующий. Скрипт использует крошечный Python-зонд (socket.socket(AF_ALG, SOCK_SEQPACKET, 0) с последующим bind() к AEAD-шаблону authencesn(hmac(sha256),cbc(aes))), чтобы выяснить, можно ли создавать и привязывать сокеты AF_ALG из непривилегированного контекста. Зонд создаёт сокет, привязывает его и немедленно закрывает, не оставляя ничего эксплуатируемого.
Если python3 не установлен, зонд пропускается, и вердикт основывается на проверках 1 и 2.
Для CI/CD-конвейеров, управления конфигурацией или сканирования парка систем передайте --json:
./check-copy-fail.sh --json
Пример вывода:
{
"verdict": "vulnerable",
"distro_id": "ubuntu",
"distro_version_id": "24.04",
"kernel": "6.8.0-31-generic",
"patched_version": "",
"kernel_status": "unknown",
"module_loaded": 0,
"module_builtin": 0,
"module_available": 1,
"module_blacklisted": 0,
"af_alg_status": "reachable"
}
Это единственное полное исправление. После обновления перезагрузите систему, чтобы новое ядро действительно заработало.
# Debian / Ubuntu
sudo apt update && sudo apt full-upgrade && sudo reboot
# RHEL / AlmaLinux / Rocky / CentOS Stream
sudo dnf clean metadata && sudo dnf upgrade && sudo reboot
# openSUSE / SLES
sudo zypper refresh && sudo zypper update && sudo reboot
# Amazon Linux 2023
sudo dnf upgrade --releasever=latest && sudo reboot
algif_aeadЕсли сейчас вы не можете перезагрузиться с пропатченным ядром, добавьте уязвимый модуль в чёрный список. Это нарушит работу любых приложений, которые легитимно используют AEAD-шифры AF_ALG (редкость на большинстве серверов — сначала проверьте в промежуточной среде).
# Persist the blacklist across reboots
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif-aead.conf
# Unload it from the running kernel right now
sudo rmmod algif_aead 2>/dev/null || true
Если модуль встроен в ядро, чёрный список не сработает, но можно отключить initcall. Потребуется перезагрузка.
sudo grubby --update-kernel=ALL --args="initcall_blacklist=algif_aead_init"
sudo reboot
Для контейнерных нагрузок также заблокируйте сокетное семейство AF_ALG в вашем seccomp-профиле, чтобы скомпрометированный контейнер не мог получить доступ к поверхности ядра.
== System information ==
[INFO] Distribution : Ubuntu 24.04.2 LTS (ubuntu 24.04)
[INFO] Kernel : 6.8.0-31-generic
== Check 1 / 3 — Kernel version ==
[WARN] No vendor-fixed kernel version is recorded for ubuntu 24.04.
[WARN] Falling back to runtime mitigation checks below.
== Check 2 / 3 — algif_aead kernel module ==
[WARN] algif_aead is not loaded but can be autoloaded on demand (no blacklist found).
== Check 3 / 3 — AF_ALG socket reachability ==
[VULN] AF_ALG sockets are reachable from this unprivileged context.
== Verdict ==
[VULN] This system appears to be VULNERABLE to CVE-2026-31431.
[VULN] Apply the vendor kernel update or blacklist algif_aead as a temporary mitigation.
uname -r. Если вы используете out-of-tree или пересобранное ядро, сравнение версий может не отражать, было ли исправление действительно бэкпортировано.blocked_permission для AF_ALG просто потому, что активен seccomp — само ядро хоста при этом может оставаться уязвимым.MIT — используйте, изменяйте и распространяйте свободно. Без гарантий.
| Дистрибутив | Исправленное ядро (≥) |
|---|
| AlmaLinux / RHEL / Rocky / CentOS 8 | 4.18.0-553.121.1.el8_10 |
| AlmaLinux / RHEL / Rocky / CentOS 9 | 5.14.0-611.49.2.el9_7 |
| AlmaLinux / RHEL / Rocky / CentOS 10 | 6.12.0-124.52.2.el10_1 |
| Ubuntu 26.04+ («Resolute») | не затронут |
| Ubuntu 18.04 – 25.10 | rolling-обновления, см. apt |
| Debian (все выпуски) | rolling-обновления, см. DSA |
| Вердикт | Код выхода | Значение |
|---|
patched | 0 | Работающее ядро имеет версию не ниже исправленной производителем. |
mitigated | 0 | AF_ALG заблокирован, а модуль не загружен. |
likely_mitigated | 0 | Модуль в чёрном списке и не загружен; живой зонд невозможен. |
vulnerable | 1 | Ядро не пропатчено, а algif_aead / AF_ALG доступен. |
unknown | 2 | Недостаточно данных для решения. Считайте систему потенциально уязвимой. |
not_applicable | 3 | Система не работает под управлением Linux. |