CVE-2026-90125 in Linux
Сводка
по VulDB • 17.09.2026
В ядре Linux была устранена следующая уязвимость:
smb: client: исправление утечки буфера запроса в smb2_new_read_req()
Функция smb2_new_read_req() выделяет буфер запроса с помощью smb2_plain_req_init(), но передает его вызывающей стороне через *buf = req только в самом конце функции. Между этими операциями находятся два оператора возврата ошибки:
rc = smb2_plain_req_init(SMB2_READ, io_parms->tcon, server, (void **) &req, total_len); if (rc) return rc;
if (server == NULL) return -ECONNABORTED; [...]
rdata->mr = smbd_register_mr(server->smbd_conn, &rdata->subreq.io_iter, true, need_invalidate); if (!rdata->mr) return -EAGAIN;
В случае любого из этих сценариев буфер не освобождается и не возвращается вызывающей стороне, что приводит к его утечке. Вызывающая сторона не может очистить этот ресурс: smb2_async_readv() выполняет переход 'goto out' при ненулевом значении кода возврата, что пропускает вызов cifs_small_buf_release(buf) в блоке async_readv_out; кроме того, на этом этапе buf еще не был присвоен.
В пути записи (write path) этой проблемы никогда не возникало. smb2_async_writev() регистрирует область памяти inline и переходит к метке освобождения вместо возврата:
wdata->mr = smbd_register_mr(...); if (!wdata->mr) {
rc = -EAGAIN; goto async_writev_out; }
Коммит b7972092199f ("cifs: smbd: Retry on memory registration failure") в одном патче изменил оба случая с возврата -ENOBUFS на возврат -EAGAIN, что поставило эти два варианта кода рядом.
На практике достижим только возврат -EAGAIN, поскольку smb2_plain_req_init() сначала вызывает smb2_reconnect(), и эта функция уже завершается ошибкой с кодом -EIO при server == NULL до выделения каких-либо ресурсов. Оба случая возврата обрабатываются одинаковым образом здесь, а не оставляют один из них корректным случайно.
Поскольку код ошибки -EAGAIN является повторяемым (replayable error), ошибка также достигает блока повторных попыток в конце smb2_async_readv(), который помечает подзапрос как NETFS_SREQ_NEED_RETRY; таким образом, неудачная регистрация может быть повторена вместо завершения операции ввода-вывода, и каждая такая попытка приводит к утечке еще одного буфера. Функция smb2_should_replay() выполняет короткое замыкание (short-circuits) при tcon->retry, поэтому в случае жесткого монтирования (hard mount) количество попыток не ограничивается настройкой retransmission.
Затронут только асинхронный путь чтения. Вызывающая сторона синхронного SMB2_read() передает rdata == NULL, и блок регистрации памяти защищен проверкой на rdata.
Путь обработки ошибки регистрации памяти был указан рецензентом Sashiko AI при рассмотрении несвязанного патча к smb2_async_readv().
If you want to get best quality of vulnerability data, you may have to visit VulDB.