CVE-2026-90413 в Linux Kernel: out-of-bounds read в iSER target при обработке login PDU

CVE: CVE-2026-90413
Продукт: Linux Kernel
Дата публикации: 17.09.2026
Критичность: CRITICAL
CVSS: 9.1 (3.1)
EPSS: 0,83%; процентиль 55,54%
CISA KEV: нет подтверждения в каталоге CISA KEV

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


Уязвимость CVE-2026-90413 затрагивает драйвер iSER (iSCSI Extensions for RDMA) в Linux Kernel. В isert_login_recv_done() количество байтов, фактически помещённых HCA в login buffer, не сравнивается с длиной, которую заявляет BHS login PDU.

Далее isert_rx_login_req() копирует min(login_req_len, MAX_KEY_VALUE_PAIRS) байт в login->req_buf, а код чтения использует объявленную длину из того же буфера. Буфер имеет фиксированный размер MAX_KEY_VALUE_PAIRS (8192), поэтому инициатор, заявляющий больше данных, чем отправляет, читает за пределы буфера до аутентификации.

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


Риск связан с чтением за пределы выделенного ядром буфера login->req_buf в драйвере iSER при обработке login PDU. Инициатор управляет заявленной длиной DataSegmentLength и может вызвать out-of-bounds read до завершения аутентификации.

  • Тип ошибки: out-of-bounds read / memory corruption; конкретный CWE не указан в предоставленных источниках
  • CVSS v3.1: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:H, оценка 9.1, severity CRITICAL
  • Вектор атаки: удалённый, без необходимости авторизации, без взаимодействия пользователя; цель — Linux kernel с активным iSER target
  • Факт эксплуатации: в предоставленных источниках нет отдельного подтверждения массовой эксплуатации; есть подтверждённое воспроизведение на 7.2.0-rc4 с soft-RoCE (rdma_rxe) под KASAN
  • EPSS: 0,83% (percentile 55,54%), что указывает умеренный уровень вероятности автоматической эксплуатации в популяции

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


Затронут Linux Kernel с драйвером iSER target. В предоставленных источниках нет полного списка версий дистрибутивов или пакетов; воспроизведение указано для ядра 7.2.0-rc4.

  • Компонент: drivers/infiniband/ulp/isert/ib_isert.c — драйвер iSER target
  • Функции: isert_login_recv_done(), isert_rx_login_req(), iscsi_target_locate_portal(), iscsi_decode_text_input(), iscsi_target_do_login()
  • Параметр: DataSegmentLength в BHS login PDU, поле dlength в struct iscsi_hdr
  • Буфер: login->req_buf с фиксированным размером MAX_KEY_VALUE_PAIRS (8192)
  • Версия воспроизведения: 7.2.0-rc4 с soft-RoCE (rdma_rxe) и KASAN

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


isert_login_recv_done() фиксирует количество байтов, которое HCA реально поместило в login buffer, но не сравнивает это значение с длиной, заявленной в BHS login PDU.

isert_rx_login_req() копирует min(login_req_len, MAX_KEY_VALUE_PAIRS) байт в login->req_buf. При этом последующий код чтения использует объявленную длину из того же буфера: для первого PDU в iscsi_target_locate_portal() выполняется payload_length = ntoh24(login_req->dlength); tmpbuf = kmemdup_nul(login->req_buf, payload_length, GFP_KERNEL); для последующих PDU аналогичное чтение происходит в iscsi_decode_text_input(), достигаемом из iscsi_target_do_login().

login->req_buf имеет фиксированный размер MAX_KEY_VALUE_PAIRS (8192). Если инициатор объявляет больше данных, чем фактически отправляет, payload_length превышает фактический объём, и чтение выходит за пределы буфера. iSER не вызывает iscsi_target_check_login_request(), тогда как iscsit over TCP использует эту проверку и читает ровно столько байтов из сокета, сколько заявлено.

Исправление добавляет функцию isert_check_login_req(), которая сравнивает dlength с login_req_len и возвращает -EINVAL при превышении. Проверка вызывается в isert_get_login_rx() для первого PDU и в isert_login_recv_done() для последующих.

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


Атака использует несовпадение между фактическим количеством доставленных байтов и заявленной длиной DataSegmentLength в login PDU.

Инициатор подключается к iSER target и отправляет login PDU с ключевыми парами key=value. В BHS он указывает dlength больше, чем реально содержит payload. Ядро фиксирует login_req_len по фактическому приёму, но не проверяет dlength против этого значения.

Для первого PDU путь идёт через iscsi_target_locate_portal(). Функция извлекает payload_length из dlength и вызывает kmemdup_nul(login->req_buf, payload_length, GFP_KERNEL). Если payload_length больше 8192, чтение берёт данные за пределами выделенного буфера.

Для последующих PDU путь идёт через iscsi_target_do_login() и iscsi_decode_text_input(). Там также используется тот же login buffer и объявленная длина. В обоих случаях чтение происходит до аутентификации, и инициатор управляет длиной.

В предоставленных источниках нет подтверждения того, что out-of-bounds read ведёт к удалённому выполнению кода или изменению состояния системы; есть подтверждённый KASAN report с чтением размера 8193, 16384 и 61440 в зависимости от заявленной длины.

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


Для успешного срабатывания описанного поведения нужны следующие условия.

  • Активный iSER target: на целевой системе загружен драйвер drivers/infiniband/ulp/isert и работает iSCSI Extensions for RDMA target
  • RDMA-интерфейс: доступен soft-RoCE (rdma_rxe) или аналогичный HCA; в воспроизведении использован rdma_rxe
  • Удалённый доступ к login PDU: атакующий может отправлять iSCSI login PDU на iSER target до аутентификации
  • Контроль dlength: инициатор управляет полем DataSegmentLength в BHS login PDU
  • Ядро без исправления: версия не содержит isert_check_login_req() или эквивалентную проверку dlength <= login_req_len
  • Отсутствие TCP-only iSCSI: iscsit over TCP не затрагивает эту ошибку, потому что использует iscsi_target_check_login_request() и читает с сокета ровно заявленное количество байтов

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


Сценарий описывает последовательность действий для воспроизведения out-of-bounds read в iSER target.

  • Подготовить Linux kernel без исправления CVE-2026-90413 и включить iSER target
  • Запустить soft-RoCE (rdma_rxe) или использовать HCA, поддерживающий iSCSI over RDMA
  • Настроить KASAN для фиксации out-of-bounds read
  • Подключить инициатор к iSER target и отправить первый login PDU с реальным key=value payload
  • В BHS первого PDU указать dlength больше фактического размера, например 8193, 16384 или 61440
  • Наблюдать за KASAN report в iscsi_target_locate_portal() и kmemdup_nul
  • Для второго пути отправить последующий login PDU с завышенным dlength
  • Наблюдать за KASAN report в iscsi_decode_text_input() и iscsi_target_do_login()

В предоставленных источниках указано, что на 7.2.0-rc4 с soft-RoCE под KASAN unpatched build давал сбой в 3 из 3 запусков на каждом пути; patched build не выдавал сбоев в аналогичных запусках.

Обычная login после исправления завершается успешно.

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


В предоставленных источниках есть подтверждённое воспроизведение уязвимости на ядре 7.2.0-rc4 с soft-RoCE (rdma_rxe) под KASAN.

Инициатор отправляет реальный key=value payload и одновременно указывает в BHS dlength больше фактического размера: 8193, 16384 или 61440. Отчёт KASAN фиксирует чтение за пределы буфера login->req_buf размером 8192.

Для первого PDU сбой возникает в iscsi_target_locate_portal() через kmemdup_nul. Для второго PDU сбой возникает в iscsi_decode_text_input() через iscsi_target_do_login().

В источниках нет отдельного публичного эксплойта, который бы демонстрировал удалённое выполнение кода или изменение состояния системы после out-of-bounds read. Есть только подтверждённый crash report и описание механики.

Исправление добавляет проверку dlength <= login_req_len в обоих путях: isert_get_login_rx() для первого PDU и isert_login_recv_done() для последующих.

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


Специфичных IOC для этой уязвимости в предоставленных источниках нет. Ниже приведены неспецифичные точки контроля, которые можно использовать при подозрении на аномальную активность iSER target.

  • Аномальные login PDU: dlength в BHS заметно превышает фактический размер payload или повторяется с завышенными значениями 8193, 16384, 61440
  • KASAN/ASLR reports: сообщения slab-out-of-bounds в kmemdup_nul, iscsi_target_locate_portal(), iscsi_decode_text_input() или iscsi_target_do_login()
  • Завершение login по таймеру: malformed subsequent PDU не вызывает немедленного отказа, а оставляет login для разрыва через login timer
  • Ошибки -EINVAL из isert_check_login_req(): после исправления при отправке PDU с завышенным dlength появляется лог "login PDU declares %u data bytes but only %d were received"
  • Аномальная нагрузка на iSER: многократные попытки login без успешной аутентификации, особенно с нестандартными значениями DataSegmentLength
  • Системные сбои: panic или oops в jumbled buffer каллибровке при обработке login PDU до аутентификации

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


Для обнаружения аномалий можно использовать логи ядра, KASAN и мониторинг iSER target.

  • KASAN: искать сообщения slab-out-of-bounds в kmemdup_nul с адресами, указывающими на kmalloc-8k область размером 8192
  • Стек: iscsi_target_locate_portal() для первого PDU, iscsi_decode_text_input() и iscsi_target_do_login() для последующих
  • Логирование iSER: после исправления функция isert_check_login_req() пишет "login PDU declares %u data bytes but only %d were received"
  • Сетевой анализ: проверять login PDU на соответствие между фактическим размером и dlength в BHS; значения 8193, 16384, 61440 могут указывать на попытку эксплуатации
  • Мониторинг состояния: отслеживать незавершённые login с таймаутами и повторные попытки подключения к iSER target
  • Проверка версий: убедиться, что ядро содержит исправление через uname -r или cat /proc/version

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


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

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

Эти команды показывают текущую версию ядра. В предоставленных источниках нет точного списка версий, содержащих уязвимость или исправление; воспроизведение указано для 7.2.0-rc4.

Для проверки наличия исправления можно искать наличие функции isert_check_login_req() в исходниках драйвера:

Bash:
grep -r "isert_check_login_req" /lib/modules/$(uname -r)/kernel/drivers/infiniband/ulp/isert/

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

Также можно проверить через git:

Bash:
git log --oneline | grep "isert_check_login_req"

или искать upstream commit 2488b5b4827e5415768afc8daf097e8eb83c98df.

Ссылки на исправления:


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


Исправление добавляет проверку dlength <= login_req_len в двух путях обработки login PDU.

  • isert_get_login_rx(): проверка вызывается для первого login PDU до вызова isert_rx_login_req()
  • isert_login_recv_done(): проверка вызывается для последующих PDU до вызова isert_rx_login_req()
  • isert_check_login_req(): новая функция, которая извлекает dlength из struct iscsi_hdr и сравнивает с login_req_len
  • Отказ при превышении: если dlength больше login_req_len, функция возвращает -EINVAL и не выполняет чтение за пределы буфера
  • Разрешённый диапазон: dlength <= login_req_len допустимо, потому что полученное количество может включать до трёх байтов iSCSI padding

После исправления копия из буфера больше не превышает копию в буфер: posted login SGE равен ISER_RX_PAYLOAD_SIZE, поэтому login_req_len не может превышать MAX_KEY_VALUE_PAIRS.

  • Обновить ядро до версии, содержащей upstream commit 2488b5b4827e5415768afc8daf097e8eb83c98df или stable backport
  • Перезагрузить систему после обновления
  • Проверить наличие функции isert_check_login_req() в модуле iSER
  • Повторить тест login PDU с завышенным dlength и убедиться, что KASAN не фиксирует out-of-bounds read

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


Пока обновление ядра недоступно, можно снизить вероятность эксплуатации.

  • Ограничить доступ к iSER target: закрыть RDMA-интерфейсы или отключить iSER target, если он не требуется
  • Фильтровать login PDU на сетевом уровне: блокировать соединения с dlength больше фактического размера payload; значения 8193, 16384, 61440 могут быть маркерами атаки
  • Ограничить количество попыток login: использовать rate limiting для iSCSI login на уровне firewal или netfilter
  • Мониторинг KASAN/ASLR: включить ядро с KASAN в тестовых средах и отслеживать reports из iscsi_target_locate_portal() и iscsi_decode_text_input()
  • Использовать iscsit over TCP вместо iSER: в предоставленных источниках указано, что iscsit over TCP не затрагивает эту ошибку, потому что использует iscsi_target_check_login_request()
  • Ограничить доступ к RDMA: использовать ACL или firewall для ограничения доступа к RDMA-интерфейсам
  • Логирование и алерты: настроить алерты на сообщения "login PDU declares %u data bytes but only %d were received" после исправления или на KASAN reports до него

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


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

  • Обновить ядро до версии, содержащей isert_check_login_req()
  • Перезагрузить систему
  • Проверить наличие функции в модуле:

Bash:
grep -r "isert_check_login_req" /lib/modules/$(uname -r)/kernel/drivers/infiniband/ulp/isert/

  • Запустить iSER target и подключить инициатор
  • Отправить login PDU с dlength больше фактического размера, например 8193
  • Убедиться, что KASAN не фиксирует out-of-bounds read в iscsi_target_locate_portal() или iscsi_decode_text_input()
  • Проверить логи на наличие сообщения "login PDU declares %u data bytes but only %d were received"
  • Повторить тест с dlength 16384 и 61440
  • Убедиться, что обычная login завершается успешно после исправления

В предоставленных источниках указано, что patched build не выдавал сбоев в 3 из 3 запусков на обоих путях, а обычная login завершалась успешно.

Вывод​


CVE-2026-90413 — это out-of-bounds read в драйвере iSER target Linux Kernel, вызванный отсутствием проверки между заявленной длиной DataSegmentLength и фактическим количеством доставленных байтов. Инициатор может управлять dlength до аутентификации и вызвать чтение за пределы буфера login->req_buf размером 8192.

Исправление добавляет isert_check_login_req() в оба пути: первый PDU через isert_get_login_rx(), последующие через isert_login_recv_done(). После обновления копия из буфера больше не превышает копию в буфер, и out-of-bounds read не воспроизводится.

Для защиты нужно обновить ядро до версии с исправлением или ограничить доступ к iSER target. Если iSER не используется, можно отключить драйвер или перейти на iscsit over TCP, который не затрагивает эту ошибку.

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


  1. NVD — CVE-2026-90413
  2. FIRST EPSS — CVE-2026-90413
  3. IB/isert: reject login PDUs declaring more data than was received - kernel/git/stable/linux.git - Linux kernel stable tree
  4. IB/isert: reject login PDUs declaring more data than was received - kernel/git/stable/linux.git - Linux kernel stable tree
  5. IB/isert: reject login PDUs declaring more data than was received - kernel/git/stable/linux.git - Linux kernel stable tree
  6. IB/isert: reject login PDUs declaring more data than was received - kernel/git/stable/linux.git - Linux kernel stable tree
  7. IB/isert: reject login PDUs declaring more data than was received - kernel/git/stable/linux.git - Linux kernel stable tree
  8. IB/isert: reject login PDUs declaring more data than was received - kernel/git/stable/linux.git - Linux kernel stable tree
  9. IB/isert: reject login PDUs declaring more data than was received - kernel/git/stable/linux.git - Linux kernel stable tree
  10. IB/isert: reject login PDUs declaring more data than was received - kernel/git/stable/linux.git - Linux kernel stable tree

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


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