Следующая версия ядра Linux, 7.2, будет включать флаг OPENAT2_REGULAR для системного вызова openat2. Эта функция позволяет программам гарантировать, что они открывают только обычные файлы, предотвращая перенаправление на специальные устройства, такие как /dev/null или FIFO, которые могут вызывать неожиданное блокирующее поведение и уязвимости безопасности.
Как работает OPENAT2_REGULAR в ядре 🛡️
Флаг OPENAT2_REGULAR действует как фильтр в системном вызове openat2. При активации ядро проверяет, является ли целевой файл обычным (S_IFREG), прежде чем разрешить открытие. Если файл является блочным устройством, FIFO или сокетом, операция завершается ошибкой EISDIR или EPERM. Эта проверка происходит после разрешения символических ссылок, закрывая путь для атак, использующих ссылки для указания на специальные устройства. Реализация была запрошена группой UAPI для защиты приложений, обрабатывающих пользовательские файлы.
Прощай, испуг от /dev/null и шаловливых FIFO 😅
До сих пор доверчивая программа могла открыть файл и обнаружить, что это FIFO, который заставлял её вечно ждать данные, или, что еще хуже, /dev/null, который молча поглощал весь её вывод. С OPENAT2_REGULAR эти страхи заканчиваются: если файл не является обычным, ядро говорит «нет», и разработчик экономит часы отладки. Это как поставить фильтр на вход диска, чтобы пропускать только настоящие файлы, а не карнавальные маски.