
Эксплойт для CVE-2026-31431, уязвимости в authencesn ядра Linux, позволяющей локальному пользователю повысить привилегии до root через манипуляцию страничным кэшем.
«Copy Fail» — это критическая логическая уязвимость в криптографическом шаблоне authencesn ядра Linux. Она позволяет непривилегированному локальному пользователю вызвать детерминированную, контролируемую запись 4 байт в page cache любого читаемого файла в системе. Нацелившись на setuid-бинарники (например, /usr/bin/su), злоумышленник может изменить кэш исполнения в памяти и повысить привилегии до Root (UID 0).
В отличие от более старых уязвимостей, таких как «Dirty Cow» или «Dirty Pipe», Copy Fail — это прямолинейный логический дефект, который срабатывает без гонок, повторных попыток или уязвимых к сбоям временных окон. Он высокопортативен и скрытен, поскольку изменяет только page cache в памяти, полностью оставляя файл на диске неизменным, обходя стандартные средства мониторинга целостности файлов.
Уязвимость существует на пересечении трёх различных компонентов ядра:
splice(): Системный вызов splice() передаёт данные между файловыми дескрипторами и каналами (pipes) без копирования, передавая страницы page cache по ссылке. Когда пользователь выполняет splice файла (например, /usr/bin/su) в сокет AF_ALG, входной scatterlist сокета содержит прямые ссылки на кэшированные страницы ядра этого файла.authencesn: Алгоритм authencesn (используемый для расширенных порядковых номеров IPsec) требует перестановки байтов. Для этого он временно записывает 4 байта порядковых номеров в выходной буфер как «scratch-пространство». Однако он записывает за допустимую границу вывода.Из-за оптимизации in-place 2017 года выходной scatterlist содержит страницы page cache, доступные только для чтения, переданные через splice(). Когда authencesn записывает за границу вывода, он напрямую перезаписывает 4 байта в кэшированной памяти ядра целевого файла.
Злоумышленник может воспользоваться этой уязвимостью, выполнив следующие шаги:
AF_ALG и привязать его к authencesn(hmac(sha256),cbc(aes)).sendmsg() с полезной нагрузкой Associated Authenticated Data (AAD), содержащей 4 байта, которые необходимо записать.splice() для передачи целевого файла (/usr/bin/su) в сокет. Смещение и длина определяют точно где в page cache будут записаны 4 байта.recv() запускает операцию дешифрования, выполняя запись в scratch-область за границы буфера непосредственно в page cache целевого файла.execve("/usr/bin/su")). Ядро выполняет изменённую версию из page cache, содержащую внедрённый вредоносный шеллкод, предоставляя root-доступ.Если немедленное применение патча или перезагрузка ядра невозможны, можно смягчить эту уязвимость, заблокировав все связанные модули af_alg и выгрузив их из памяти.
Чтобы заблокировать эти модули, выполните следующие команды:
# 1. Выгрузите модули из памяти, если они в данный момент загружены
sudo modprobe -r algif_hash algif_skcipher algif_aead algif_rng af_alg
# 2. Добавьте модули в чёрный список
echo -e "blacklist af_alg\nblacklist algif_hash\nblacklist algif_skcipher\nblacklist algif_aead\nblacklist algif_rng" | sudo tee /etc/modprobe.d/stop-exploit.conf
# 3. Полностью предотвратите загрузку модуля af_alg
echo "install af_alg /bin/true" | sudo tee -a /etc/modprobe.d/stop-exploit.conf
# 4. Перезагрузите систему, чтобы изменения вступили в полную силу
sudo reboot
Команда безопасности ядра Linux исправила эту уязвимость (коммит: a664bf3d603d). Патч возвращает операции AEAD в AF_ALG к модели out-of-place, разделяя scatterlist источника и назначения. Это предотвращает попадание страниц page cache в доступный для записи scatterlist назначения.
Требуемое действие: Обновите ядро вашего дистрибутива до последней версии, предоставленной вашим вендором (Ubuntu, Amazon Linux, RHEL, SUSE и т. д.), и перезагрузите систему.