Маленькая опечатка в коде ядра FreeBSD превращала любого пользователя в суперадмина
NewsMakerОшибка срабатывала раньше, чем система успевала защититься.
В FreeBSD закрыли уязвимость CVE-2026-45250 в системном вызове
Команда безопасности FreeBSD выпустила бюллетень FreeBSD-SA-26:18.setcred и подготовила исправления для поддерживаемых веток. FreeBSD 14.3 нужно обновить до
Системный вызов
Уязвимость возникла при обработке списка дополнительных групп. В функции
В упрощённом виде проблема сводилась к выражению
Переполнение буфера в стеке ядра опасно тем, что повреждает данные, с которыми работает сама операционная система. В простом случае система падает с паникой ядра и требует перезагрузки. В более тяжёлом варианте атакующий может повлиять на дальнейшее выполнение кода в ядре и получить права суперпользователя .
Особенно важен порядок операций. Ядро сначала копировало переданный пользователем список групп, а уже потом проверяло, имеет ли процесс право менять полномочия. Поэтому уязвимость мог вызвать любой локальный пользователь. Такой сценарий опасен для серверов с обычными учётными записями, jail-окружениями, контейнерной инфраструктурой или сервисами, которые после отдельного взлома дают атакующему ограниченный доступ к системе.
Исследователи назвали уязвимость FatGid и описали рабочее локальное повышение привилегий для FreeBSD 14.3 и 14.4 на архитектуре amd64. По их данным, получение root возможно даже при включённых защитах SMAP и SMEP. Эти механизмы процессоров x86 мешают ядру обращаться к пользовательской памяти и выполнять код из пользовательского пространства. Обычно они усложняют эксплуатацию ошибок в ядре, но в данном случае исследователи нашли путь через уже загруженные структуры ядра.
Подробную цепочку эксплуатации в новостном тексте приводить не стоит. Она включает конкретные смещения, внутренние структуры ядра, подготовку поддельных объектов в памяти и переход через код загруженного модуля. Для администраторов важнее практический риск: на не обновлённых FreeBSD 14.3 и 14.4 ошибка может превратить локальный доступ с низкими правами в полный контроль над системой.
Отдельный вариант эксплуатации связан с модулем
FreeBSD 15.0 тоже получила исправление. Там исходная ошибка в коде присутствовала, но соседние участки ядра отличались от FreeBSD 14.4. По данным исследователей, известная им цепочка не превращала переполнение в получение root на этой ветке. Однако обычный локальный пользователь всё равно мог вызвать панику ядра, поэтому обновление для FreeBSD 15.0 также важно.
История исправления получилась не совсем обычной. В основной ветке FreeBSD ошибочный код исчез ещё в ноябре 2025 года после переработки
Пользователям нужно проверить версию и уровень исправлений своей системы. Если FreeBSD 14.3 ниже
FreeBSD 13.x и более старые ветки эта ошибка не затрагивает, потому что в них нет
В FreeBSD закрыли уязвимость CVE-2026-45250 в системном вызове
setcred(2). Ошибка находилась в коде ядра и позволяла обычному локальному пользователю вызвать панику ядра или, на части систем, повысить привилегии до root. Проблема срабатывала до проверки прав вызывающего процесса, поэтому для запуска уязвимого кода не требовались административные права. Команда безопасности FreeBSD выпустила бюллетень FreeBSD-SA-26:18.setcred и подготовила исправления для поддерживаемых веток. FreeBSD 14.3 нужно обновить до
14.3-RELEASE-p14, FreeBSD 14.4 - до 14.4-RELEASE-p5, FreeBSD 15.0 - до 15.0-RELEASE-p9. Исправления также внесены в ветки stable/14 и stable/15. Системный вызов
setcred(2) впервые попал к пользователям в FreeBSD 14.3-RELEASE. Он нужен привилегированным программам, которые должны за 1 шаг задать полный набор полномочий процесса: реальные, эффективные и сохранённые идентификаторы пользователя и группы, список дополнительных групп и метку обязательного контроля доступа MAC. Такой вызов заменяет несколько отдельных операций вроде setuid(2), setgid(2) и setgroups(2). Уязвимость возникла при обработке списка дополнительных групп. В функции
kern_setcred_copyin_supp_groups() ядро должно было скопировать из пользовательского пространства массив идентификаторов групп. Но в расчёте размера использовался не размер элемента gid_t, а размер указателя. На 64-битных системах указатель занимает 8 байт, а gid_t - 4 байта. Из-за этой разницы ядро могло записать в буфер вдвое больше данных, чем ожидалось. В упрощённом виде проблема сводилась к выражению
sizeof(*groups). В нужном месте оно давало размер указателя, хотя код должен был учитывать размер идентификатора группы. Когда память выделялась динамически, лишний запас не приводил к переполнению. Но на пути с буфером в стеке ядра данные выходили за границы локального массива. Переполнение буфера в стеке ядра опасно тем, что повреждает данные, с которыми работает сама операционная система. В простом случае система падает с паникой ядра и требует перезагрузки. В более тяжёлом варианте атакующий может повлиять на дальнейшее выполнение кода в ядре и получить права суперпользователя .
Особенно важен порядок операций. Ядро сначала копировало переданный пользователем список групп, а уже потом проверяло, имеет ли процесс право менять полномочия. Поэтому уязвимость мог вызвать любой локальный пользователь. Такой сценарий опасен для серверов с обычными учётными записями, jail-окружениями, контейнерной инфраструктурой или сервисами, которые после отдельного взлома дают атакующему ограниченный доступ к системе.
Исследователи назвали уязвимость FatGid и описали рабочее локальное повышение привилегий для FreeBSD 14.3 и 14.4 на архитектуре amd64. По их данным, получение root возможно даже при включённых защитах SMAP и SMEP. Эти механизмы процессоров x86 мешают ядру обращаться к пользовательской памяти и выполнять код из пользовательского пространства. Обычно они усложняют эксплуатацию ошибок в ядре, но в данном случае исследователи нашли путь через уже загруженные структуры ядра.
Подробную цепочку эксплуатации в новостном тексте приводить не стоит. Она включает конкретные смещения, внутренние структуры ядра, подготовку поддельных объектов в памяти и переход через код загруженного модуля. Для администраторов важнее практический риск: на не обновлённых FreeBSD 14.3 и 14.4 ошибка может превратить локальный доступ с низкими правами в полный контроль над системой.
Отдельный вариант эксплуатации связан с модулем
zfs.ko. На системах FreeBSD с пулом ZFS такой модуль обычно загружен, поэтому условие выглядит реалистичным для многих серверов. При этом сама уязвимость находится не в ZFS, а в реализации setcred(2). Модуль ZFS в описанном сценарии использовали как часть цепочки, которая позволяла обойти включённые аппаратные защиты. FreeBSD 15.0 тоже получила исправление. Там исходная ошибка в коде присутствовала, но соседние участки ядра отличались от FreeBSD 14.4. По данным исследователей, известная им цепочка не превращала переполнение в получение root на этой ветке. Однако обычный локальный пользователь всё равно мог вызвать панику ядра, поэтому обновление для FreeBSD 15.0 также важно.
История исправления получилась не совсем обычной. В основной ветке FreeBSD ошибочный код исчез ещё в ноябре 2025 года после переработки
setcred(), но сообщение к коммиту не говорило о переполнении буфера. Отдельный бюллетень безопасности появился позже, уже вместе с исправлениями для поддерживаемых релизов. Пользователям нужно проверить версию и уровень исправлений своей системы. Если FreeBSD 14.3 ниже
14.3-RELEASE-p14, FreeBSD 14.4 ниже 14.4-RELEASE-p5 или FreeBSD 15.0 ниже 15.0-RELEASE-p9, систему нужно обновить и перезагрузить. Способ обновления зависит от типа установки: на одних системах используют freebsd-update, на других - пакеты базовой системы или обновление из исходного кода по инструкции FreeBSD. FreeBSD 13.x и более старые ветки эта ошибка не затрагивает, потому что в них нет
setcred(2). Ветка main уже не содержит уязвимый код. Для рабочих серверов главный шаг простой: установить исправление, перезагрузиться с новым ядром и отдельно проверить системы, где есть локальные пользователи, jail-окружения или сервисы с ограниченными правами.