Авторы безопасности исследуют уязвимость CVE-2026-31431, получившую название «Copy Fail», которая позволяет атаковать страницу кэша и получить контроль над исполняемыми файлами типа /usr/bin/su. В прошлом году было показано, как эта ошибка может стать толчком для изоляции по задаче с помощью виртуальных машин, но теперь команда разобрала атаку детально, от отладки ассемблера до мониторинга ядра в реальном времени. Исследователи создали лабораторию на базе Fedora 43 и запустили уязвимую версию ядра 6.17.1, чтобы доказать концепцию.
Сначала они изучили вредоносный код. Атака использует сжатые данные, которые разворачиваются в ELF-файл. Этот файл перезаписывает начало системной утилиты su. Когда ОС запускает су, она загружает поврежденные данные из кэша страниц и исполняет вредоносный бинарник вместо легитимной программы. Исследователи применили техники ELF golfing, убранные заголовки разделов и сократившие размер полезной нагрузки до нескольких десятков байтов. Ключевые системные вызовы setuid и execve реализованы через цепочки инструкций x86-64, где RIP-относительные нагрузки указывают на строку "/bin/sh", а трюки с push/pop экономят байты.
Чтобы воспроизвести сценарий, в контейнере запускали утилиту strace с правами системного трекинга и отключенными ограничениями seccomp. Выходные данные трекинга показывали, как атакующий через сплит-каналы и криптографические сокетные API записывает данные из буфера в кэш страниц без проверки прав доступа. Когда процесс su запускался, ядро выполняло вызов setuid(0) и возвращало код успеха.
Тем не менее, архитектура rootless контейнеров с Podman заблокировала полный взлом хоста. Контейнеры используют пространства имен пользователей. Корневой UID внутри контейнера равен 0, но благодаря маппингу он соответствует обычному пользователю 1000 на хосте. Даже при получении права root внутри изоляции атакующий не может изменить файлы системы или записать информацию в /etc/shadow. Это ограничение подтверждается содержимым файла uid_map, где виден мapp UID 0 контейнера к UID 1000 хоста.
Дополнительно команда проверила поведение ядра с помощью eBPF и bpftrace, чтобы видеть отклонение вызова setuid. Исследования подтверждают, что страница кэша разделяется между контейнерами, использующими одинаковые слои образов. Если злоумышленник испортит бинарник в кэше, другие контейнеры могут исполнить отравленную версию. Решение — переход на эфемерные микро-ВМ или внедрение механизмов перехвата DNS и блокировки сетевых запросов. Использование пространств имен пользователей в OpenShift с версии 4.20 уже решает эту проблему, ограничивая утечки прав на уровне ядра.