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.
Ссылки на исправления:
- Upstream commit
- Stable commit 0d9c0586af703890afe1bd0cfe641e3a3af1c32d
- Stable commit 228aaa620fe6a7bc8b5b21dd348b4836b1760c61
- Stable commit 44fe800ec13386c88bd5b32bcd1deaa1e17535d5
- Stable commit 48812c8103071d550d9ab4a3431be5bdc52255bc
- Stable commit 71ec8bbfa4a183f1e623662f9cfbcd702e433bdb
- Stable commit b1f3313e7b3e396e4985fea5c709477387e0a065
- Stable commit c345d9d0b3eefc990bb90cf565325785aab06aab
Исправление
Исправление добавляет проверку 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, который не затрагивает эту ошибку.
Официальные источники
- NVD — CVE-2026-90413
- FIRST EPSS — CVE-2026-90413
- IB/isert: reject login PDUs declaring more data than was received - kernel/git/stable/linux.git - Linux kernel stable tree
- IB/isert: reject login PDUs declaring more data than was received - kernel/git/stable/linux.git - Linux kernel stable tree
- IB/isert: reject login PDUs declaring more data than was received - kernel/git/stable/linux.git - Linux kernel stable tree
- IB/isert: reject login PDUs declaring more data than was received - kernel/git/stable/linux.git - Linux kernel stable tree
- IB/isert: reject login PDUs declaring more data than was received - kernel/git/stable/linux.git - Linux kernel stable tree
- IB/isert: reject login PDUs declaring more data than was received - kernel/git/stable/linux.git - Linux kernel stable tree
- IB/isert: reject login PDUs declaring more data than was received - kernel/git/stable/linux.git - Linux kernel stable tree
- IB/isert: reject login PDUs declaring more data than was received - kernel/git/stable/linux.git - Linux kernel stable tree
История обновлений статьи
- 22.09.2026 — Опубликована первая версия материала.
