Критическая уязвимость во FreeBSD позволяет получить root через скрипт-оболочку за шесть секунд

FreeBSD

Проект FreeBSD выпустил экстренные обновления безопасности, закрывающие сразу несколько опасных уязвимостей. Главная из них - CVE-2026-7270, позволяющая непривилегированному пользователю выполнить код на уровне ядра и получить полный контроль над системой. Проблема присутствует во всех выпусках операционной системы, начиная с 2013 года, а рабочий эксплоит уже опубликован в открытом доступе.

Детали уязвимостей

Корень уязвимости кроется в системном вызове execve, который отвечает за запуск новых программ. В ядре FreeBSD существует функция exec_args_adjust_args, обрабатывающая сценарии с шебангом - первой строкой вроде "#!/bin/sh", указывающей путь к интерпретатору. Разработчики допустили ошибку в арифметике при вычислении размера данных для копирования. Вместо вычитания значения переменной consume из результирующей длины в функции memmove её ошибочно прибавили. Из-за этого при перемещении аргументов в буфере копируется в два раза больше байт, чем нужно.

Последствия оказались фатальными. Ядро использует для хранения аргументов запускаемых процессов специальный пул exec_map - набор смежных буферов фиксированного размера, по одному на каждое ядро процессора. Переполнение из одного буфера перезаписывает начало соседнего. Поскольку буферы располагаются в памяти подряд без защитных промежутков, это не вызывает немедленного сбоя и остаётся незамеченным, пока другой процесс не попытается использовать испорченные данные.

Исследователи, обнаружившие уязвимость, разработали элегантную схему атаки. Они обратили внимание, что демон sshd при каждом входящем подключении к порту 22 ответвляет дочерний процесс через вызов fork и execve. Этот процесс - /usr/libexec/sshd-session - запускается с правами root. Ключевая деталь: sshd использует вызов execv, а не execve, что означает наследование окружения родительского процесса. Кроме того, поскольку все идентификаторы пользователя и группы остаются неизменными, флаг issetugid возвращает ноль, и динамический компоновщик FreeBSD по-прежнему обрабатывает переменную LD_PRELOAD.

Эксплоит подготавливает все буферы exec_map, записывая в них фальшивую среду с записью LD_PRELOAD=/tmp/evil.so. Затем он циклически запускает скрипт с очень длинным первым аргументом, провоцируя переполнение в момент, когда соседний буфер используется процессом sshd-session. Если момент выбран верно, данные из соседнего буфера перезаписывают среду sshd-session, и динамический компоновщик загружает вредоносную библиотеку ещё до старта основной программы. Библиотека создаёт исполняемый файл /tmp/rootsh с установленным битом suid root - после этого любой локальный пользователь может запустить его и получить оболочку с правами суперпользователя.

Вероятность успеха одной попытки оценивается всего в 0,6 процента, но благодаря высокой скорости повторения (около двух тысяч итераций в секунду) на четырёхъядерном процессоре root достигается в среднем за шесть секунд. Авторы эксплоита проверили его на системах FreeBSD от версии 11.0 до 14.4, и во всех случаях атака сработала.

Уязвимость уже устранена. Обновления выпущены для веток 15.0-RELEASE-p7, 14.4-RELEASE-p3, 14.3-RELEASE-p12 и 13.5-RELEASE-p13. Для более старых поддерживаемых выпусков доступен патч ядра. Администраторам настоятельно рекомендуется установить обновление как можно скорее, особенно на серверах, доступных для локальных пользователей.

Помимо этой критической проблемы, в том же наборе исправлений закрыто ещё несколько уязвимостей. В библиотеке libnv, используемой для межпроцессного взаимодействия в ядре и пользовательском пространстве, обнаружены два переполнения буфера: одно из-за неверной проверки размера сообщения, другое - из-за отсутствия контроля размера файлового дескриптора в вызове select. Обе потенциально позволяют локальному злоумышленнику повысить привилегии.

Клиент dhclient, отвечающий за получение сетевых настроек по протоколу DHCP, содержит сразу две удалённо эксплуатируемые уязвимости. Первая - переполнение буфера в куче при обработке специально сформированного DHCP-пакета, что может привести к выполнению произвольного кода. Вторая - подстановка произвольных директив в конфигурационный файл через неэкранированные кавычки в поле BOOTP, что также позволяет выполнить команды с правами root при обращении к вредоносному DHCP-серверу.

Пакетный фильтр pf имеет уязвимость в обработке пакетов SCTP. Из-за отсутствия ограничения глубины рекурсии при разборе параметров злоумышленник может отправить специально оформленный пакет, что приведёт к переполнению стека ядра и панике системы. Проблема затрагивает любую систему, где включён pf, независимо от правил фильтрации.

На платформе amd64 выявлена ошибка в функции pmap_pkru_update_range, отвечающей за применение ключей защиты памяти. Непривилегированный пользователь может заставить ядро обработать пользовательскую память как запись таблицы страниц, что даёт возможность перезаписать недоступные области памяти. Наконец, в обработчике ioctl-команды TIOCNOTTY обнаружено обращение к уже освобождённой памяти, которое также позволяет непривилегированному процессу получить права root.

Таким образом, апрельский выпуск исправлений для FreeBSD - один из самых масштабных за последнее время. Особую тревогу вызывает уязвимость CVE-2026-7270: её эксплуатация не требует специальных условий, кроме возможности запускать скрипты из-под непривилегированного пользователя, и занимает считанные секунды. Всем системным администраторам, использующим FreeBSD, следует немедленно обновить свои системы до актуальных версий.

Ссылки

Комментарии: 0