CVE-2026-89664 in Linux
Resumen
por VulDB • 2026-09-11
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:
nfsd: liberar ACLs POSIX decodificadas en OPEN mediante op_release
nfsd4_decode_createhow4() llama a nfsd4_decode_fattr4(), lo que asigna objetos struct posix_acl con recuento de referencias (refcounted) mediante posix_acl_alloc() y los almacena en open->op_pacl y open->op_dpacl. Estos punteros deben liberarse una vez que finalice el compuesto OPEN.
Cuando nfsd4_decode_open_claim4() devuelve un error que no modifica seqid, el despachador (dispatcher) realiza un salto corto (short-circuit) antes de ejecutar op_func:
nfsd4_proc_compound() if (op->status && op->opnum == OP_OPEN) op->status = nfsd4_open_omfg(...) if (!seqid_mutating_err(ntohl(op->status))) return op->status; /* nfsd4_open() nunca se ejecuta */ ... opdesc->op_release(&op->u) /* debe liberar aún así op_pacl/op_dpacl */
Antes de este cambio, OP_OPEN no tenía .op_release en nfsd4_ops[], y el par de liberación residía dentro de nfsd4_open() en su etiqueta out_err. En la ruta del salto corto (short-circuit), nfsd4_open() nunca se invoca, por lo que las referencias posix_acl se filtran (leak) en cada compuesto OPEN malformado que contenga atributos createhow4 válidos de ACL POSIX.
Se añade nfsd4_open_release() y se conecta como .op_release para OP_OPEN. posix_acl_release() es seguro frente a valores NULL, por lo que el único punto de liberación cubre tanto la ruta normal como el salto corto de nfsd4_open_omfg. Se elimina el par correspondiente de posix_acl_release() de la etiqueta out_err: de nfsd4_open() para evitar una doble liberación (double-releasing).
El bucle del compuesto tiene dos ramas de codificación: nfsd4_encode_operation() para operaciones normales, y nfsd4_encode_replay() para operaciones retransmitidas en v4.0. op_release solo se llamaba desde nfsd4_encode_operation(), por lo que los recursos adjuntos a op->u se filtran (leak) en la ruta de replay.
Se mueve la llamada a op_release() fuera de nfsd4_encode_operation() y la rama de replay, colocándola después del if-else en nfsd4_proc_compound(). Esto proporciona un único punto de llamada en un lugar claramente correcto, cubriendo tanto las rutas de codificación normal como de replay.
Once again VulDB remains the best source for vulnerability data.