CVE-2026-89547 в Linux Kernel: SUNRPC-ошибка, уязвимые версии и защита

CVE: CVE-2026-89547
Продукт: Linux Kernel
Дата публикации: 11.09.2026
Критичность: HIGH
CVSS: 8.1 (3.1)
EPSS: 0,57%; процентиль 45,31%
CISA KEV: нет подтверждения в каталоге CISA KEV

Краткое описание​


Уязвимость в подсистеме SUNRPC ядра Linux приводит к повреждению памяти при неудачном выделении per-CPU счетчиков. Ошибка затрагивает nfsd, lockd и NFS callback, создавая риск отказа в обслуживании и потери целостности данных. Статья описывает механику сбоя, условия эксплуатации и способы проверки исправления.

Основные характеристики​


Риск связан с повреждением памяти в ядре при запуске RPC-сервисов, что может привести к отказу в обслуживании или компрометации целостности системы. Эксплуатация требует локального доступа и специфических условий с памятью.

  • Тип ошибки: Неверная обработка ошибок выделения памяти (memory corruption).
  • CVSS 3.1: 8.1 (HIGH). Вектор: CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H.
  • Условия атаки: Высокая сложность (High), требуется локальный доступ администратора и сбой выделения памяти.
  • Эксплуатация: Нет подтверждений активного использования в реальных атаках.
  • EPSS: 0,57% (процентиль 45,31%).

Какие продукты и версии затронуты​


Уязвимость затрагивает подсистему SUNRPC в ядре Linux, используемую сервисами nfsd, lockd и NFS callback. Ошибка проявляется при инициализации per-CPU счетчиков в функции __svc_create().

  • Компонент: net/sunrpc/svc.c.
  • Функции: __svc_create(), percpu_counter_init().
  • Сервисы: nfsd, lockd, NFS callback service.

Точные номера версий ядра, в которых присутствует уязвимость, не раскрыты в переданных источниках. Рекомендуется сверяться с официальными списками обновлений вашего дистрибутива.

Причина уязвимости​


Причина ошибки заключается в игнорировании кодов возврата при инициализации per-CPU счетчиков в функции __svc_create(). При неудачном выделении памяти структура счетчика остается в неинициализированном состоянии.

  • Сбой выделения: percpu_counter_init() не может выделить память, но ошибка не обрабатывается.
  • NULL-указатель: Поле fbc->counters остается NULL, а внутренние структуры (raw_spinlock_t, list_head) не инициализируются.
  • Возврат объекта: Функция возвращает частично сконструированный объект svc_serv вызывающим сервисам.

В результате сервисы начинают работать с поврежденными структурами данных, что приводит к непредсказуемому поведению ядра.

Как работает атака​


Атака реализуется через повреждение памяти в горячих путях обработки RPC-запросов. Когда сервис работает с неинициализированными счетчиками, инкременты в функциях svc_xprt_enqueue(), svc_handle_xprt() и svc_pool_wake_idle_thread() обращаются к NULL-указателю.

  • Механизм доступа: Указатель является per-CPU смещением, поэтому обращение не вызывает сбой (fault), а записывает данные в смещение ноль области per-CPU текущего процессора.
  • Повреждение данных: Запись затрещивает переменные, расположенные в этой области, что приводит к скрытому повреждению памяти.
  • Чтение статистики: Обращение к /proc/fs/nfsd/pool_stats читает поврежденные данные и возвращает некорректные значения.
  • Сбой отладки: При включенных CONFIG_DEBUG_SPINLOCK или lockdep система может аварийно завершиться (splat) из-за неинициализированного спина-лока.

Условия успешной эксплуатации​


Для успешной эксплуатации уязвимости необходимо выполнение ряда строгих условий, что делает атаку сложной для удаленного противника.

  • Локальный доступ: Требуется права локального администратора для запуска RPC-сервисов.
  • Давление памяти: Необходимо, чтобы выделение per-CPU памяти завершилось ошибкой во время инициализации.
  • Инъекция сбоев: Альтернативный путь — использование fault injection для симуляции неудачи выделения.
  • Отсутствие удаленного триггера: Удаленный хост не может самостоятельно вызвать состояние сбоев при запуске сервиса.

Возможный сценарий атаки​


Сценарий предполагает, что локальный администратор запускает nfsd, lockd или NFS callback в условиях критической нехватки памяти или с включенной инъекцией сбоев. Во время инициализации __svc_create() выделение per-CPU счетчиков завершается ошибкой, но сервис продолжает запуск.

  • Фаза 1: Сервис стартует с неинициализированными счетчиками.
  • Фаза 2: При обработке первых RPC-запросов функции инкремента обращаются к NULL-указателю.
  • Фаза 3: Происходит скрытое повреждение per-CPU данных, что может привести к нестабильности ядра или отказу в обслуживании.

Данный сценарий не предполагает удаленного доступа, а фокусируется на локальном сбое конфигурации или ресурсов.

Есть ли публичный эксплойт​


В переданных источниках отсутствуют сведения о публичных эксплойтах, PoC или подтвержденной эксплуатации CVE-2026-89547 в реальных атаках. Официальные коммиты содержат только описание исправления и техническую механику ошибки.

  • PoC: Не обнаружен в предоставленных данных.
  • Эксплуатация: Нет подтверждений использования в дикой природе.
  • Статус: Уязвимость задокументирована, но публичные инструменты для атаки не раскрыты.

Отсутствие сведений об эксплойте не означает, что он не существует, но на текущий момент доступные источники не содержат готовых payload или инструкций по компрометации.

Признаки эксплуатации​


Специфичные индикаторы компрометации (IOC) для CVE-2026-89547 в переданных источниках не раскрыты. Ниже приведены общие точки контроля, которые не являются специфичными для этой уязвимости, но могут указывать на аномалии в работе RPC-сервисов.

  • Аномалии в /proc/fs/nfsd/pool_stats: Невозможность чтения или возврат некорректных значений.
  • Сбои в логах ядра: Сообщения о неинициализированных спина-локах (при включенной отладке).
  • Нестабильность nfsd/lockd: Аварийное завершение или зависание процессов RPC-сервисов.

Рекомендуется сопоставлять эти признаки с общей политикой мониторинга ядра и сетевых сервисов.

Как обнаружить атаку​


Обнаружение атаки или проявления уязвимости затруднено из-за скрытого характера повреждения памяти. Основные методы контроля основаны на мониторинге состояния RPC-сервисов и логов ядра.

  • Мониторинг логов: Поиск сообщений о сбоях в net/sunrpc/svc.c или неинициализированных структурах.
  • Проверка статистики: Периодическое чтение /proc/fs/nfsd/pool_stats для выявления некорректных данных.
  • Отладочные режимы: Использование CONFIG_DEBUG_SPINLOCK или lockdep в тестовых средах для выявления неинициализированных локов.

В продакшен-средах рекомендуется полагаться на общую стабильность сервисов и отсутствие аварийных завершений ядра.

Как проверить свою версию​


Для проверки текущей версии ядра и определения необходимости обновления используйте следующие команды. Они позволяют безопасно получить информацию о версии без изменения состояния системы.

Bash:
uname -r
uname -a
cat /proc/version

Полученные данные необходимо сопоставить с официальными списками обновлений вашего дистрибутива Linux. Точные номера версий, в которых исправлена CVE-2026-89547, не указаны в переданных источниках, поэтому сверка с vendor-документацией обязательна.

Исправление​


Исправление CVE-2026-89547 заключается в проверке кодов возврата при инициализации per-CPU счетчиков и корректном откате при неудаче. Обновление ядра до версии, содержащей соответствующий патч, является основным методом устранения уязвимости.

  • Проверка ошибок: Добавление проверки возвращаемых значений percpu_counter_init() в __svc_create().
  • Откат инициализации: При сбое выделение памяти происходит освобождение уже инициализированных счетчиков в текущем и предыдущих пулах.
  • Корректное освобождение: Использование percpu_counter_destroy() для каждого счетчика при завершении работы сервиса.

Рекомендуется установить последние доступные обновления ядра от вашего поставщика дистрибутива.

Временные меры защиты​


Пока обновление ядра не установлено, можно снизить риск проявления уязвимости, ограничив условия, при которых она может сработать. Эти меры не заменяют патч, но уменьшают вероятность сбоев.

  • Мониторинг памяти: Контроль за уровнем использования памяти и swap, чтобы избежать критической нехватки ресурсов при запуске сервисов.
  • Ограничение fault injection: Отключение механизмов инъекции сбоев в продакшен-средах, если они не используются для тестирования.
  • Перезапуск сервисов: При подозрении на повреждение состояния — безопасная перезагрузка nfsd, lockd или NFS callback.

Эти меры являются временными и не гарантируют защиту от всех сценариев эксплуатации.

Как проверить устранение уязвимости​


После установки обновления ядра необходимо убедиться, что патч применен и сервисы работают корректно. Проверка включает сверку версии и функциональное тестирование RPC-сервисов.

  • Проверка версии: Использование uname -r и uname -a для подтверждения установки обновленного ядра.
  • Функциональное тестирование: Запуск nfsd, lockd и NFS callback в условиях нормальной нагрузки.
  • Мониторинг логов: Убедиться, что отсутствуют сообщения об ошибках инициализации per-CPU счетчиков.

Если сервисы работают стабильно и статистика в /proc/fs/nfsd/pool_stats корректна, уязвимость считается устраненной.

Вывод​


CVE-2026-89547 представляет собой серьезную уязвимость в подсистеме SUNRPC, способную привести к повреждению памяти и отказу в обслуживании. Эксплуатация требует локального доступа и специфических условий с памятью, что снижает риск для типичных серверов, но требует внимания администраторов.

  • Приоритет: Высокий для систем с активным использованием NFS и RPC-сервисов.
  • Действие: Обновление ядра до последней стабильной версии.
  • Мониторинг: Контроль стабильности RPC-сервисов и логов ядра.

Своевременное применение патчей и мониторинг состояния системы позволяют минимизировать риски, связанные с этой уязвимостью.

Официальные источники​


  1. NVD — CVE-2026-89547
  2. FIRST EPSS — CVE-2026-89547
  3. SUNRPC: Check svc pool percpu counter allocation - kernel/git/stable/linux.git - Linux kernel stable tree
  4. SUNRPC: Check svc pool percpu counter allocation - kernel/git/stable/linux.git - Linux kernel stable tree
  5. SUNRPC: Check svc pool percpu counter allocation - kernel/git/stable/linux.git - Linux kernel stable tree
  6. SUNRPC: Check svc pool percpu counter allocation - kernel/git/stable/linux.git - Linux kernel stable tree
  7. SUNRPC: Check svc pool percpu counter allocation - kernel/git/stable/linux.git - Linux kernel stable tree
  8. CVEs — The Linux Kernel documentation

История обновлений статьи​


  • 13.09.2026 — Опубликована первая версия материала.
  • 13.09.2026 — Уточнены сведения об уязвимых версиях, оценке риска или исправлении.
  • 15.09.2026 — Уточнены сведения об уязвимых версиях, оценке риска или исправлении.
 
Последнее редактирование:
Назад
Верх Низ