
BPF LSM блокировщик для CVE-2026-31431 (Copy Fail) — блокирует привязки authencesn AF_ALG во время выполнения без перезагрузки системы
Proof of concept — среда выполнения для смягчения последствий CVE-2026-31431 («Copy Fail») — повышения привилегий в ядре Linux через криптографический шаблон authencesn в algif_aead.
В отличие от блокировки модулей, это не требует перезагрузки. Программа BPF LSM перехватывает socket_bind и блокирует все привязки AEAD через AF_ALG — подсистему, эксплуатируемую Copy Fail. Это предотвращает обходы через вложенность криптографических шаблонов (например, pcrypt(authencesn(...))). Другое использование AF_ALG (hash, skcipher) не затрагивается.
Заблокированные попытки регистрируются в реальном времени с указанием PID, имени процесса и временной метки.
CONFIG_BPF_LSM=y и lsm=bpf в параметрах загрузкиmake doctor # проверить все предварительные требования
git clone https://github.com/atgreen/block-copyfail.git
cd block-copyfail
make ubi8-build
sudo ./block-copyfail
Блокировщик остаётся активным до нажатия Ctrl-C, после чего корректно отключается.
Для сборки на вашей машине нужны SBCL и Whistler (компилятор eBPF на Common Lisp):
git clone https://github.com/atgreen/whistler.git ~/git/whistler
make build
sudo ./block-copyfail
Сборка внутри контейнера UBI8 позволяет получить бинарник, работающий на RHEL/CentOS/Alma/Rocky 8+, Fedora, Ubuntu 20.04+ и любом Linux с glibc 2.28 или новее. SBCL или Whistler на целевой системе не нужны — просто скопируйте бинарник и запустите его.
make ubi8-build
scp block-copyfail root@server:
ssh root@server ./block-copyfail
Создаёт стандартный файл .bpf.o, загружаемый через bpftool, libbpf или любой загрузчик BPF:
make elf
sudo mkdir -p /sys/fs/bpf/copyfail
sudo bpftool prog loadall block-copyfail.bpf.o /sys/fs/bpf/copyfail autoattach
Для отключения и удаления:
sudo rm -rf /sys/fs/bpf/copyfail
При запущенном блокировщике в одном терминале запустите тест в другом:
python3 trigger-test.py
Тестовый скрипт пытается выполнить привязку AEAD через AF_ALG (эксплойт не выполняется).
Ожидаемый вывод в тестовом терминале:
BLOCKED: aead/authencesn(hmac(sha256),cbc(aes)) — [Errno 1] Operation not permitted
BLOCKED: aead/gcm(aes) — [Errno 1] Operation not permitted
ALLOWED: hash/sha256
ALLOWED: skcipher/cbc(aes)
Ожидаемый вывод в терминале блокировщика:
Copy Fail blocker active — all AF_ALG AEAD binds blocked.
Other AF_ALG usage (hash, skcipher) unaffected.
Watching for blocked attempts. Press Ctrl-C to exit.
TIME PID COMMAND
---- --- -------
06:38:12 31337 python3
Без запущенного блокировщика тестовый скрипт выводит ALLOWED для всех четырёх алгоритмов.
Программа BPF считывает 7 байт struct sockaddr_alg из аргументов socket_bind через bpf_probe_read_kernel, проверяет salg_family == AF_ALG и salg_type == "aead" и возвращает -EPERM при совпадении. Это блокирует все привязки алгоритмов AEAD независимо от вложенности шаблонов. События отправляются в пользовательское пространство через кольцевой буфер.
Написано на Whistler — диалекте Common Lisp, который компилируется напрямую в байткод eBPF — без C, clang или LLVM.
MIT