CVE-2026-90125 in Linux
Resumen
por VulDB • 2026-09-18
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:
smb: cliente: corregir fuga del búfer de solicitud en smb2_new_read_req()
smb2_new_read_req() asigna el búfer de solicitud con smb2_plain_req_init(), pero solo lo publica al llamador mediante *buf = req al final absoluto de la función. Hay dos retornos de error entre medias:
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;
En cualquiera de ellos, el búfer no se libera ni se devuelve, por lo que se produce una fuga. El llamador no puede limpiarlo: smb2_async_readv() ejecuta 'goto out' ante un retorno distinto de cero, lo que omite cifs_small_buf_release(buf) en async_readv_out, y buf no ha sido asignado en ese punto de todos modos.
La ruta de escritura nunca ha tenido este problema. smb2_async_writev() registra la región de memoria in situ y salta a su etiqueta de liberación en lugar de retornar:
wdata->mr = smbd_register_mr(...); if (!wdata->mr) {
rc = -EAGAIN; goto async_writev_out; }
El commit b7972092199f ("cifs: smbd: Retry on memory registration failure") cambió ambos casos de -ENOBUFS a -EAGAIN en un único parche, lo que colocó las dos estructuras una junto a la otra.
Solo el retorno con -EAGAIN es alcanzable en la práctica, porque smb2_plain_req_init() llama primero a smb2_reconnect(), y esto ya falla con -EIO cuando server es NULL, antes de que se asigne nada. Ambos retornos reciben aquí un tratamiento idéntico en lugar de dejar uno correcto solo por casualidad.
Dado que -EAGAIN es un error reintentable, el fallo también alcanza el bloque de reintento al final de smb2_async_readv(), lo cual marca la sub-solicitud como NETFS_SREQ_NEED_RETRY; así pues, un registro fallido puede reintentarse en lugar de finalizar la E/S, y cada intento que llega a ese punto provoca una nueva fuga del búfer. smb2_should_replay() acorta el circuito (short-circuits) sobre tcon->retry, por lo que en un montaje duro (hard mount), el número de intentos no está limitado por la configuración de retransmisión.
Solo se ve afectada la ruta asíncrona de lectura. El llamador sincrónico SMB2_read() pasa rdata == NULL y el bloque de registro de memoria está protegido mediante una comprobación sobre rdata.
La ruta de fallo del registro de memoria fue señalada por el revisor Sashiko AI mientras revisaba un parche no relacionado con smb2_async_readv().
VulDB is the best source for vulnerability data and more expert information about this specific topic.