CVE-2026-93228 в Linux Kernel: svcrdma и нулевой segcount в XDR-фрагментах Write/Reply

CVE: CVE-2026-93228
Продукт: Linux Kernel
Дата публикации: 24.09.2026
Критичность: CRITICAL
CVSS: 9.1 (3.1)
EPSS: нет данных; процентиль нет данных
CISA KEV: нет подтверждения в каталоге CISA KEV

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


Уязвимость CVE-2026-93228 затрагивает модуль svcrdma в Linux Kernel. Проблема возникает, когда удалённый peer отправляет Write или Reply chunk с нулевым segcount.

Проверка xdr_check_write_chunk() пропускает значение 0, после чего xdr_inline_decode(stream, 0) не сдвигает курсор, а pcl_alloc_write() добавляет в список rc_write_pcl или rc_reply_pcl объект svc_rdma_chunk с ch_segcount == 0.

Патч добавляет явное отклонение нулевого segcount на границе декодирования и перестраивает порядок добавления chunk в список после заполнения массива сегментов.

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


Риск связан с приёмом некорректного XDR-фрагмента RPC/RDMA-сервисом: нулевой segcount проходит проверку диапазона, создаёт вырожденный объект в списке parsed chunks и остаётся видимым для потребителей.

Проблема подтверждена патчами ядра Linux и описана как критическая по CVSS 3.1.

  • Тип риска: обработка некорректного входного данных в svcrdma; нулевой segcount создаёт chunk с ch_segcount == 0
  • CVSS: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:H, оценка 9.1, severity CRITICAL
  • Вектор атаки: удалённый peer может отправить Write или Reply chunk с segcount == 0 без необходимости локального доступа и без взаимодействия пользователя
  • Факт эксплуатации: в предоставленных источниках нет подтверждения реальных эксплуатаций; есть патч и техническое описание механизма
  • EPSS: данные отсутствуют

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


Затронут Linux Kernel с компонентом svcrdma, реализующим RPC/RDMA.

Патч модифицирует файлы net/sunrpc/xprtrdma/svc_rdma_pcl.c и net/sunrpc/xprtrdma/svc_rdma_recvfrom.c. В предоставленных источниках нет перечня конкретных версий ядра или дистрибутивов, поэтому точный диапазон уязвимых релизов не подтверждается.

  • Компонент: svcrdma в Linux Kernel
  • Файлы патча: net/sunrpc/xprtrdma/svc_rdma_pcl.c, net/sunrpc/xprtrdma/svc_rdma_recvfrom.c
  • Версии ядра: не раскрыты в предоставленных источниках
  • Дистрибутивы: не раскрыты в предоставленных источниках

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


Функция xdr_check_write_chunk() проверяет только верхнюю границу segcount: segcount > rctxt->rc_maxpages. Значение 0 проходит проверку, после чего вызывается xdr_inline_decode(&rctxt->rc_stream, 0).

Этот вызов возвращает текущий курсор без сдвига и не изменяет состояние потока.

Далее pcl_alloc_write() создаёт chunk через pcl_alloc_chunk(segcount, 0) и добавляет его в список rc_write_pcl или rc_reply_pcl. При segcount == 0 цикл заполнения массива сегментов не выполняется, но объект chunk остаётся в списке с ch_segcount == 0.

Патч меняет проверку на segcount == 0 || unlikely(segcount > rctxt->rc_maxpages), что приводит к возврату false и отклонению фрагмента до добавления в список. Дополнительно перемещается вызов list_add_tail() после цикла заполнения сегментов, чтобы в список попадал только полностью заполненный chunk.

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


Удалённый peer подключается к RPC/RDMA-сервису и отправляет XDR-фрагмент типа Write или Reply. Поле segcount в этом фрагменте равно 0.

В xdr_check_write_chunk() значение 0 не отклоняется, потому что проверка только сравнивает его с rc_maxpages. Функция xdr_inline_decode(stream, 0) завершается успешно и возвращает true.

Далее pcl_alloc_write() вызывает pcl_alloc_chunk(0, 0). Цикл for (j = 0; j < segcount; j++) не выполняется. До патча list_add_tail(&chunk->ch_list, &pcl->cl_chunks) вызывался до цикла, поэтому chunk с ch_segcount == 0 добавлялся в список parsed chunks.

После этого потребители могут получить доступ к вырожденному объекту через rc_write_pcl или rc_reply_pcl. В исходном описании патча указано, что предыдущий патч сделал pcl_for_each_segment() безопасным для ch_segcount == 0, поэтому текущая проблема не приводит к обходу памяти в том виде, как это могло быть ранее.

Патч добавляет отклонение нулевого segcount на границе декодирования и перестраивает порядок операций так, чтобы list_add_tail() выполнялся после заполнения сегментов.

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


Для воспроизведения механизма из патча нужны следующие условия:

  • RPC/RDMA-сервис: активен компонент svcrdma в ядре Linux
  • Удалённый доступ: peer может отправлять XDR-фрагменты Write или Reply
  • Поле segcount == 0: фрагмент содержит нулевой segcount
  • Отсутствие отклонения: версия ядра не содержит патч, добавляющий проверку segcount == 0 в xdr_check_write_chunk()
  • Список parsed chunks: chunk с ch_segcount == 0 попадает в rc_write_pcl или rc_reply_pcl

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


Сценарий описан на уровне механизма из патча и не подтверждается как реально используемый атакой.

  • Удалённый peer отправляет RPC/RDMA-запрос с XDR-фрагментом Write или Reply.
  • Поле segcount в фрагменте равно 0.
  • Функция xdr_check_write_chunk() пропускает проверку и возвращает true.
  • Функция pcl_alloc_write() создаёт chunk с ch_segcount == 0.
  • До патча list_add_tail() добавляет этот chunk в список parsed chunks до заполнения сегментов.
  • Потребитель получает доступ к вырожденному объекту через rc_write_pcl или rc_reply_pcl.

Патч меняет порядок: сначала заполняется массив сегментов, затем вызывается list_add_tail(). При segcount == 0 фрагмент отклоняется до добавления в список.

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


В предоставленных источниках нет отдельного PoC, эксплойта или подтверждения реальной эксплуатации.

Есть патч ядра Linux с техническим описанием механизма и диффами. Патч показывает, как изменить проверку segcount == 0 и перестроить порядок добавления chunk в список. Это позволяет понять механику проблемы, но не является подтверждённым инструментом атаки.

Отсутствие сведений о PoC или эксплуатации не означает их отсутствие; оно означает, что в данном пакете доказательств они не представлены.

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


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

  • Аномальные XDR-фрагменты: фрагменты Write или Reply с segcount == 0 в трафике RPC/RDMA
  • Вырожденные объекты в памяти: chunk с ch_segcount == 0 в списках rc_write_pcl или rc_reply_pcl, если доступен debug-инструментарий
  • Аномальная нагрузка на svcrdma: рост числа обработанных XDR-фрагментов без соответствующего изменения RPC-нагрузки
  • Необычные ошибки декодирования: возврат false из xdr_check_write_chunk() или xdr_check_reply_chunk() после изменения поведения патча
  • Отсутствие специфичных сигнатур: в предоставленных источниках нет подтверждённых IOC, поэтому перечисленные признаки являются неспецифичными

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


Для обнаружения аномалий можно использовать следующие методы.

  • Локальная проверка версии ядра: определить, установлен ли патч CVE-2026-93228 в текущем ядре
  • Анализ трафика RPC/RDMA: искать XDR-фрагменты Write или Reply с segcount == 0
  • Проверка логов ядра: искать сообщения об отклонении некорректных XDR-фрагментов после применения патча
  • Debug-инструментарий: если доступен, проверять состояние rc_write_pcl и rc_reply_pcl на наличие chunk с ch_segcount == 0
  • Общие точки контроля: при отсутствии специфичных IOC использовать мониторинг аномальной нагрузки и ошибок декодирования в svcrdma

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


Команды проверки версии ядра из пакета доказательств:

Bash:
uname -r

Bash:
uname -a

Bash:
cat /proc/version

Эти команды показывают версию ядра, но не подтверждают наличие патча CVE-2026-93228. Для проверки патча нужно сравнивать текущую версию с релизами, содержащими commit 45dbdb2637b7fc5f1355b588780d2a7fb0516805 или его upstream-версию 9808eb7656666acc7291bae9ab6b987bd16e47e0. В предоставленных источниках нет списка дистрибутивных пакетов с патчем.

Для проверки в git-репозитории можно использовать:

Bash:
git log --oneline --all | grep -i "svcrdma: Reject Write/Reply chunks with segcount 0"

или искать конкретный commit:

Bash:
git rev-list --contains 9808eb7656666acc7291bae9ab6b987bd16e47e0

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


Основной способ исправления — применение патча ядра Linux, который добавляет проверку segcount == 0 в xdr_check_write_chunk() и перестраивает порядок list_add_tail() в pcl_alloc_write().

  • Патч: commit 45dbdb2637b7fc5f1355b588780d2a7fb0516805 в stable-дерево Linux Kernel
  • Upstream commit: 9808eb7656666acc7291bae9ab6b987bd16e47e0
  • Файлы патча: net/sunrpc/xprtrdma/svc_rdma_pcl.c, net/sunrpc/xprtrdma/svc_rdma_recvfrom.c
  • Изменение проверки: if (segcount == 0 || unlikely(segcount > rctxt->rc_maxpages)) return false;
  • Изменение порядка: list_add_tail() вызывается после цикла заполнения сегментов

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

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


При невозможности немедленно применить патч можно использовать следующие временные меры.

  • Ограничение доступа к RPC/RDMA: отключить или ограничить доступ к svcrdma для недоверенных peers
  • Фильтрация XDR-фрагментов: на уровне сетевого фильтра или прокси отклонять фрагменты Write или Reply с segcount == 0, если это поддерживается реализацией
  • Мониторинг нагрузки: отслеживать аномальный рост числа обработанных XDR-фрагментов в svcrdma
  • Ограничение rc_maxpages: уменьшить значение rc_maxpages для сокращения пространства некорректных значений segcount, если это допустимо конфигурацией
  • Общие меры: при отсутствии специфичного обхода использовать базовые ограничения доступа и мониторинг аномалий в RPC/RDMA-сервисе

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


После применения патча нужно проверить, что проверка segcount == 0 работает.

  • Проверка версии ядра: убедиться, что установлен патч или релиз, содержащий его
  • Тестирование с segcount == 0: отправить тестовый XDR-фрагмент Write или Reply с segcount == 0 и проверить, что xdr_check_write_chunk() возвращает false
  • Проверка списка parsed chunks: убедиться, что chunk с ch_segcount == 0 не попадает в rc_write_pcl или rc_reply_pcl
  • Анализ логов: проверить, что при отклонении фрагмента появляются ожидаемые сообщения об ошибке декодирования
  • Отсутствие вырожденных объектов: если доступен debug-инструментарий, убедиться, что в списках parsed chunks нет chunk с ch_segcount == 0

Вывод​


CVE-2026-93228 — критическая уязвимость в svcrdma Linux Kernel, связанная с отсутствием проверки нулевого segcount в XDR-фрагментах Write и Reply.

Патч добавляет явное отклонение segcount == 0 на границе декодирования и перестраивает порядок добавления chunk в список parsed chunks.

Риск подтверждается патчами ядра и техническим описанием механизма. В предоставленных источниках нет данных о конкретных уязвимых версиях дистрибутивов, PoC или реальной эксплуатации. Для защиты нужно применить патч или убедиться, что svcrdma не принимает XDR-фрагменты с segcount == 0.

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


  1. NVD — CVE-2026-93228
  2. svcrdma: Reject Write/Reply chunks with segcount 0 - kernel/git/stable/linux.git - Linux kernel stable tree
  3. svcrdma: Reject Write/Reply chunks with segcount 0 - kernel/git/stable/linux.git - Linux kernel stable tree
  4. svcrdma: Reject Write/Reply chunks with segcount 0 - kernel/git/stable/linux.git - Linux kernel stable tree
  5. svcrdma: Reject Write/Reply chunks with segcount 0 - kernel/git/stable/linux.git - Linux kernel stable tree
  6. CVEs — The Linux Kernel documentation

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


  • 25.09.2026 — Опубликована первая версия материала.
 
Назад
Верх Низ