CVE-2026-100075 в Linux Kernel: ошибка счётчиков RDMA/srpt и последствия для send queue credits

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

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


Уязвимость CVE-2026-100075 находится в драйвере RDMA/srpt ядра Linux. При частичном сбое функции srpt_alloc_rw_ctxs() путь отката освобождает память, но оставляет устаревшие значения n_rw_ctx и n_rdma вместе со старым указателем rw_ctxs.

Позднее вычитание send queue credits в srpt_queue_response() или srpt_write_pending() использует неверное количество кредитов. Это может нарушить учёт доступных мест в send queue и привести к повреждению состояния ядра.

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


Риск связан с некорректным восстановлением счётчиков после ошибки в RDMA/srpt, что ломает балансировку send queue credits.

  • Тип ошибки: логическая ошибка управления памятью и счётчиками в драйвере InfiniBand SRP target.
  • CVSS: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H со счётом 9.8.
  • Вектор атаки: удалённый, без необходимости привилегий и взаимодействия пользователя.
  • Факт эксплуатации: в предоставленных источниках нет подтверждённого факта активной эксплуатации.
  • EPSS: данные отсутствуют.

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


Затронут Linux Kernel с компонентом RDMA/srpt. В предоставленных данных конкретные диапазоны версий ядра не раскрыты.

  • Компонент: драйвер drivers/infiniband/ulp/srpt/ib_srpt.c.
  • Функция: srpt_alloc_rw_ctxs() в пути отката после частичного провала многобуферного описателя.
  • Связанный upstream commit: b38f98e176050850f41bb6415f3a71400056623e.
  • Stable commits с исправлением: 717ab4d0614e9446bf8e2de6229464499e4008d6, af00051dbc9f467d4840ec709680660a3f8990fa, af073bd245180393bcb15d33d3990a6bdc32593a, bd02d644bd19a2795c018635d273d91e45d2bb95, be1478849e1abb1e12dc12e14cdbf800cc6fa99a, f1f2252da52cdda912da9993f39f58783b01b38f, f65f45dfa1e6e2eaa9e11c8b8ce8857799cb189d.
  • Пакеты дистрибутивов: в предоставленных данных не раскрыты.

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


Ошибка возникает в функции srpt_alloc_rw_ctxs(), которая выделяет контексты read/write для многобуферного описателя.

Если выделение или обработка завершается с ошибкой после частичной инициализации, путь отката освобождает память через kfree(ioctx->rw_ctxs). При этом переменные ioctx->n_rw_ctx и ioctx->n_rdma не сбрасываются до значений, зафиксированных до начала цикла.

После освобождения памяти указатель rw_ctxs остаётся вешающим. Счётчики продолжают хранить значения из незавершённой операции.

Когда позже вызываются srpt_queue_response() или srpt_write_pending(), они вычитают из переменной sq_wr_avail количество кредитов, основанное на этих устаревших счётчиках. Вычитание становится неверным по величине.

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


Атака требует доступа к RDMA/srpt target и возможности вызвать путь отката в srpt_alloc_rw_ctxs().

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

Неверное вычитание send queue credits может привести к отрицательному или завышенному балансу доступных мест в send queue. Это искажает учёт запросов и может вызвать повреждение состояния ядра при последующих операциях с очередью.

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

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


Для успешной эксплуатации нужны следующие условия.

  • Система использует драйвер RDMA/srpt как target.
  • В ядре активен компонент drivers/infiniband/ulp/srpt.
  • Доступна операция, вызывающая srpt_alloc_rw_ctxs() с многобуферным описателем.
  • Операция завершается ошибкой после частичной инициализации контекстов.
  • После отката счётчики n_rw_ctx, n_rdma или указатель rw_ctxs остаются устаревшими до последующего обращения к send queue credits.

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


Сценарий предполагает работу RDMA/srpt target с многобуферными запросами.

Атакующий направляет запрос, который приводит к частичному провалу в srpt_alloc_rw_ctxs(). Путь отката освобождает память и возвращает ошибку. Счётчики не сбрасываются.

Далее система обрабатывает ответ или pending write через srpt_queue_response() или srpt_write_pending(). Эти функции вычитают неверное количество send queue credits из sq_wr_avail.

Балансировка очереди становится некорректной. Последующие операции с send queue могут использовать повреждённое состояние счётчиков или указателей.

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


В предоставленных источниках есть только описание ошибки и патч ядра.

  • PoC: в данных нет отдельного публичного PoC.
  • Техническое описание: доступно через commit и diff патча.
  • Подтверждённая эксплуатация: не подтверждена.
  • Патч: доступен как stable commits Linux kernel.

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

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


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

Можно использовать только общие точки контроля, которые не являются специфичными именно для CVE-2026-100075.

  • Аномальные значения переменных send queue credits в debug-инструментах ядра.
  • Ошибки или сбои при обработке RDMA/srpt target с многобуферными описателями.
  • Внезапные падение или зависание процессов, использующих InfiniBand SRP target.
  • Аномальная нагрузка на драйвер ib_srpt в логах ядра.
  • Отклонения от ожидаемого поведения после операций с ошибкой выделений памяти.

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


Для обнаружения можно использовать проверки версии ядра и анализ состояния RDMA/srpt.

  • Проверить версию ядра через uname -r, uname -a или cat /proc/version.
  • Определить, установлен ли модуль ib_srpt или драйвер InfiniBand SRP target.
  • Проверить наличие stable commits с исправлением в истории сборки ядра.
  • Мониторить логи ядра на ошибки в srpt_alloc_rw_ctx, srpt_queue_response и srpt_write_pending.
  • Анализировать метрики send queue credits, если доступны через debug-инструменты или tracing.

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


Проверка версии ядра:

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

Проверка наличия модуля RDMA/srpt:

Bash:
lsmod | grep ib_srpt

Проверка, применён ли патч в исходниках ядра:

Bash:
git log --oneline | grep -E '717ab4d0614e9446bf8e2de6229464499e4008d6|af00051dbc9f467d4840ec709680660a3f8990fa|af073bd245180393bcb15d33d3990a6bdc32593a|bd02d644bd19a2795c018635d273d91e45d2bb95|be1478849e1abb1e12dc12e14cdbf800cc6fa99a|f1f2252da52cdda912da9993f39f58783b01b38f|f65f45dfa1e6e2eaa9e11c8b8ce8857799cb189d'

Проверка файла драйвера:

Bash:
grep -n 'ioctx->rw_ctxs = NULL;' /lib/modules/$(uname -r)/kernel/drivers/infiniband/ulp/srpt/ib_srpt.o 2>/dev/null || echo "binary check unavailable"

Если используется бинарное ядро без исходников, grep по .o может не дать читаемого результата. В этом случае надёжнее сверять версию сборки с официальными списками stable commits.

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


Исправление доступно через stable commits Linux kernel.

  • Применить upstream commit b38f98e176050850f41bb6415f3a71400056623e в исходниках ядра.
  • Обновить дистрибутивное ядро до версии, содержащей один из stable commits: 717ab4d0614e9446bf8e2de6229464499e4008d6, af00051dbc9f467d4840ec709680660a3f8990fa, af073bd245180393bcb15d33d3990a6bdc32593a, bd02d644bd19a2795c018635d273d91e45d2bb95, be1478849e1abb1e12dc12e14cdbf800cc6fa99a, f1f2252da52cdda912da9993f39f58783b01b38f, f65f45dfa1e6e2eaa9e11c8b8ce8857799cb189d.
  • Пересобрать модуль ib_srpt или ядро после применения патча.
  • Проверить, что в исходниках есть строки сброса счётчиков и обнуления указателя в пути отката.

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


Временные меры ограничены.

  • Остановить использование RDMA/srpt target на уязвимых системах до обновления ядра.
  • Отключить модуль ib_srpt, если он не требуется для текущих сервисов.
  • Перенаправить RDMA-трафик на другой target или другую реализацию, если доступна.
  • Ограничить доступ к портам и интерфейсам InfiniBand, обслуживающим srpt target.
  • Зафиксировать состояние send queue credits до и после операций с ошибкой для контроля отклонений.

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


После обновления нужно подтвердить, что патч применён.

  • Проверить версию ядра: uname -r.
  • Проверить наличие stable commit в истории сборки или пакетного репозитория.
  • Проверить исходник ib_srpt.c на строки:

    Bash:
    grep -n 'ioctx->rw_ctxs = NULL;' /path/to/linux-source/drivers/infiniband/ulp/srpt/ib_srpt.c
    grep -n 'ioctx->n_rw_ctx = n_rw_ctx;' /path/to/linux-source/drivers/infiniband/ulp/srpt/ib_srpt.c
    grep -n 'ioctx->n_rdma = n_rdma;' /path/to/linux-source/drivers/infiniband/ulp/srpt/ib_srpt.c
  • Запустить тестовые операции RDMA/srpt с многобуферными описателями и проверить отсутствие ошибок в логах ядра.
  • Убедиться, что баланс send queue credits не уходит в отрицательные значения при повторных ошибках.

Вывод​


CVE-2026-100075 — критическая ошибка учётного состояния в RDMA/srpt. Она ломает балансировку send queue credits после частичного сбоя выделения контекстов.

Практическое значение для администратора: если система работает как SRP target и использует многобуферные запросы, нужно проверить версию ядра и применить stable patch.

Без патча состояние счётчиков может стать некорректным. Это создаёт риск повреждения ядра при последующих операциях с send queue.

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


  1. NVD — CVE-2026-100075
  2. RDMA/srpt: Fix srpt_alloc_rw_ctxs() unwind counters - kernel/git/stable/linux.git - Linux kernel stable tree
  3. RDMA/srpt: Fix srpt_alloc_rw_ctxs() unwind counters - kernel/git/stable/linux.git - Linux kernel stable tree
  4. RDMA/srpt: Fix srpt_alloc_rw_ctxs() unwind counters - kernel/git/stable/linux.git - Linux kernel stable tree
  5. RDMA/srpt: Fix srpt_alloc_rw_ctxs() unwind counters - kernel/git/stable/linux.git - Linux kernel stable tree
  6. RDMA/srpt: Fix srpt_alloc_rw_ctxs() unwind counters - kernel/git/stable/linux.git - Linux kernel stable tree
  7. RDMA/srpt: Fix srpt_alloc_rw_ctxs() unwind counters - kernel/git/stable/linux.git - Linux kernel stable tree
  8. RDMA/srpt: Fix srpt_alloc_rw_ctxs() unwind counters - kernel/git/stable/linux.git - Linux kernel stable tree
  9. RDMA/srpt: Fix srpt_alloc_rw_ctxs() unwind counters - kernel/git/stable/linux.git - Linux kernel stable tree

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


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