
Скрипт для обнаружения уязвимости CVE-2026-31431 (Copy Fail) и мер по её устранению в Linux-системах: проверка ядра, состояние модуля, параметры загрузки, доступность AF_ALG и статус исправлений в дистрибутиве.
Shell-скрипты для обнаружения уязвимостей ядра Linux, проверки статуса смягчающих мер и рекомендаций по устранению — предназначены для запуска локально или на множестве машин через SSH, Ansible или pssh.
Copy Fail — это уязвимость локального повышения привилегий (LPE) высокой степени серьёзности в криптографическом модуле algif_aead ядра Linux. Логическая ошибка, внесённая в 2017 году, позволяет любому непривилегированному локальному пользователю записать 4 контролируемых байта в page cache любого читаемого файла — этого достаточно, чтобы перезаписать setuid-бинарник и получить root. Рабочий proof-of-concept на Python размером 732 байта существует и находится в открытом доступе.
| CVE | CVE-2026-31431 |
| CVSS | 7.8 (High) |
| Раскрыта | 29 апреля 2026 |
| Затронуты | Ядра Linux 4.13 – 6.x (2017–2026) |
| Дистрибутивы | Ubuntu, RHEL, SUSE, Debian, Amazon Linux и большинство других |
| Удалённая эксплуатация | Нет — требуется локальный доступ |
| Патч доступен | Частично — проверьте бюллетени вашего дистрибутива |
| Проверка | Нужен root? |
|---|---|
| Версия ядра — попадает ли она в затронутый диапазон (≥ 4.13) | Нет |
Модуль algif_aead — загружен, присутствует на диске или в чёрном списке | Нет |
Параметры загрузки — наличие initcall_blacklist=algif_aead_init | Нет |
| Доступность сокетов AF_ALG — открыт ли путь эксплуатации | Нет |
| Статус SELinux | Нет |
| Статус AppArmor | Да — без root только частичный вывод |
| Статус патча дистрибутива — CVE указан в журнале изменений ядра | Нет |
Root не требуется для запуска скрипта — все проверки, кроме статуса AppArmor, работают от обычного пользователя. Запуск с
sudoрекомендуется для получения полных результатов и является более безопасным выбором при передаче черезcurl.
Скрипт разработан для работы во всех основных дистрибутивах Linux:
| Семейство дистрибутивов | Проверка пакетного менеджера | Путь к модулям |
|---|---|---|
| Debian, Ubuntu | dpkg + журнал изменений ядра | /lib/modules/ |
| RHEL, CentOS, Amazon Linux | rpm (kernel, kernel-rt) | /lib/modules/ |
| SUSE, openSUSE | rpm (kernel-default) | /lib/modules/ |
| Arch Linux | pacman + ссылка на бюллетень | /usr/lib/modules/ |
| Fedora | rpm + запасной вариант /usr/lib/modules/ | /usr/lib/modules/ |
Требуется
bash— скрипт использует специфичный для bash синтаксис и не будет работать подsh,ashилиdash. В Alpine Linux (где по умолчанию используется busybox ash) сначала установите bash:apk add bash
Без root — работают большинство проверок:
curl -fsSL https://raw.githubusercontent.com/codesource/copyfail-check/main/check_copyfail.sh | bash
С root — полные результаты, включая статус AppArmor:
curl -fsSL https://raw.githubusercontent.com/codesource/copyfail-check/main/check_copyfail.sh | sudo bash
Совет: В production закрепите конкретный SHA коммита, чтобы скрипт не мог измениться без вашего ведома:
curl -fsSL https://raw.githubusercontent.com/codesource/copyfail-check/COMMIT_SHA/check_copyfail.sh | sudo bash
curl -fsSL https://raw.githubusercontent.com/codesource/copyfail-check/main/check_copyfail.sh -o check_copyfail.sh
less check_copyfail.sh
bash check_copyfail.sh # без root
sudo bash check_copyfail.sh # полные результаты
Цикл SSH
for HOST in server1 server2 server3; do
echo "=== $HOST ==="
ssh "$HOST" "curl -fsSL https://raw.githubusercontent.com/codesource/copyfail-check/main/check_copyfail.sh | sudo bash"
done
Ansible
- name: Check Copy Fail vulnerability
hosts: all
tasks:
- name: Run check script
script: check_copyfail.sh
become: yes
Параллельный SSH
pssh -h hosts.txt -i \
"curl -fsSL https://raw.githubusercontent.com/codesource/copyfail-check/main/check_copyfail.sh | sudo bash"
============================================================
Copy Fail CVE-2026-31431 – Vulnerability Check
============================================================
>>> Kernel Version
[INFO] Running kernel: 5.15.0-107-generic
[WARN] Kernel 5.15.0-107-generic is in the affected range (4.13 – 6.x).
>>> algif_aead Module Status
[WARN] algif_aead module is currently LOADED — system is exploitable.
[WARN] Module file found at: /lib/modules/5.15.0-107-generic/kernel/crypto/algif_aead.ko
[WARN] algif_aead is NOT blacklisted — it can be loaded on demand.
>>> Kernel Boot Parameter Mitigation
[WARN] initcall_blacklist=algif_aead_init is NOT set in boot parameters.
>>> AF_ALG Socket Reachability
[WARN] AF_ALG sockets are reachable by this user — exploit path is open.
>>> Mandatory Access Control (SELinux / AppArmor)
[WARN] Neither SELinux nor AppArmor tools detected — no MAC layer present.
>>> Distribution Patch Status
[WARN] Could not confirm CVE-2026-31431 is listed as fixed in running kernel's changelog.
============================================================
SUMMARY
============================================================
!! LIKELY VULNERABLE — No confirmed mitigation detected.
Recommended actions (in order of preference):
1. Apply your distro's kernel update as soon as available.
2. Add to /etc/modprobe.d/copyfail.conf:
blacklist algif_aead
install algif_aead /bin/true
Then run: sudo depmod -a && sudo update-initramfs -u
3. Add to kernel boot parameters (grub):
initcall_blacklist=algif_aead_init
4. Immediately unload the module if loaded:
sudo rmmod algif_aead
============================================================
Применяйте в порядке предпочтения:
1. Обновите ядро (лучшее решение)
# Debian / Ubuntu
sudo apt update && sudo apt upgrade linux-image-$(uname -r)
# RHEL / CentOS / Amazon Linux
sudo yum update kernel
# SUSE
sudo zypper update kernel-default
2. Добавьте модуль в чёрный список (немедленно, постоянно)
sudo tee /etc/modprobe.d/copyfail.conf << 'EOF'
blacklist algif_aead
install algif_aead /bin/true
EOF
sudo depmod -a
# Debian/Ubuntu
sudo update-initramfs -u
# RHEL/Fedora
sudo dracut -f
3. Выгрузите модуль сейчас (немедленно, не сохраняется после перезагрузки)
sudo rmmod algif_aead
4. Параметр загрузки ядра (альтернатива чёрному списку)
Добавьте initcall_blacklist=algif_aead_init в конфигурацию GRUB и перезагрузитесь.
MIT — используйте свободно, без каких-либо гарантий. Всегда проверяйте скрипты перед запуском от root.