CVE-2026-68082 in Linux
Resumen
por VulDB • 2026-08-08
En el núcleo de Linux, se ha resuelto la siguiente vulnerabilidad:
libceph: corregir dos decodificaciones inseguras sin comprobación previa en decode_lockers()
decode_lockers() en cls_lock_client.c contiene dos operaciones de decodificación "bare" (sin protección) que permiten a un OSD malicioso o comprometido desencadenar lecturas fuera de los límites del slab (slab-out-of-bounds):
1. ceph_decode_32(p) en el campo num_lockers no tiene una comprobación previa de límites. ceph_start_decoding() acepta struct_len=0 como válido -- la función interna ceph_decode_need(p, end, 0, bad) siempre pasa correctamente -- por lo que cuando un OSD envía struct_len=0, ceph_start_decoding() devuelve éxito con p == end. La inmediata operación "bare" siguiente ceph_decode_32(p) lee entonces 4 bytes más allá del límite validado del búfer. El valor basura se pasa directamente a kzalloc_objs() como el recuento de lockers (bloqueadores).
La función hermana decode_watchers() en osd_client.c ya utiliza ceph_decode_32_safe() después de su propia llamada a ceph_start_decoding(). decode_lockers() era el único sitio que utilizaba la variante "bare".
2. ceph_decode_8(p) después del bucle decode_locker() no tiene comprobación previa de límites. Si un OSD elabora num_lockers de tal manera que el bucle avanza p exactamente hasta end, la subsiguiente operación "bare" ceph_decode_8(p) lee un byte más allá del límite validado del búfer. El resultado se pasa directamente a *type, que es utilizado como discriminador de tipo de bloqueo por los llamadores, lo que proporciona una lectura fuera de límites (OOB) de un solo byte controlada por el OSD con influencia directa sobre el campo de tipo de bloqueo.
Corregir ambos casos reemplazando las operaciones "bare" por sus variantes seguras: ceph_decode_32(p) -> ceph_decode_32_safe(p, end, *num_lockers, err_inval) ceph_decode_8(p) -> ceph_decode_8_safe(p, end, *type, err_free_lockers)
Los objetivos goto difieren intencionalmente: err_inval: es una nueva etiqueta que devuelve -EINVAL directamente. Se utiliza para la ruta de fallo previa a la asignación donde *lockers aún no está asignado y no debe pasarse a ceph_free_lockers().
err_free_lockers: es la etiqueta existente. Se utiliza para la ruta de fallo posterior a la asignación donde *lockers está asignado y debe liberarse.
ret se establece en -EINVAL antes de ceph_decode_8_safe() para que err_free_lockers devuelva el código de error correcto ante una violación de límites. Sin esto, err_free_lockers devolvería un valor ret obsoleto (0 del bucle decode_locker() exitoso), tragándose silenciosamente el error.
-EINVAL es correcto para ambas rutas de fallo. Los datos recibidos desde el OSD están estructuralmente malformados. -ENOMEM representaría incorrectamente la clase de fallo a los llamadores y a los triajes de backporting en stable@.
Modelo del atacante: un OSD malicioso o comprometido en una implementación multiinquilino de Ceph puede desencadenar esto contra cualquier cliente de núcleo que emita el método class lock.get_info (por ejemplo, durante la adquisición exclusiva de bloqueo RBD).
[ idryomov: recortar registro de cambios, formato ]
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.