CVE-2026-68082 in Linux
Riassunto
di VulDB • 08/08/2026
Nel kernel Linux è stata risolta la seguente vulnerabilità:
libceph: correzione di due operazioni bare decode non sicure in decode_lockers()
decode_lockers(), presente in cls_lock_client.c, contiene due operazioni bare decode che permettono a un OSD malizioso o compromesso di innescare letture slab-out-of-bounds (fuori dai limiti dello slab):
1. ceph_decode_32(p) sul campo num_lockers non dispone di alcun controllo dei bounds precedente. ceph_start_decoding() accetta struct_len=0 come valore valido -- l'operazione interna ceph_decode_need(p, end, 0, bad) passa sempre con successo -- quindi quando un OSD invia struct_len=0, ceph_start_decoding() restituisce successo con p == end. La successiva operazione bare ceph_decode_32(p) legge così 4 byte oltre il confine del buffer validato. Il valore spazzatura viene passato direttamente a kzalloc_objs() come conteggio dei locker.
La funzione sibling decode_watchers(), presente in osd_client.c, utilizza già ceph_decode_32_safe() dopo la propria chiamata a ceph_start_decoding(). decode_lockers() era l'unico punto di utilizzo della variante bare.
2. ceph_decode_8(p) dopo il ciclo decode_locker() non dispone di alcun controllo dei bounds precedente. Se un OSD crea num_lockers in modo tale che il ciclo avanzasse p esattamente fino a end, la successiva operazione bare ceph_decode_8(p) legge un byte oltre il confine del buffer validato. Il risultato viene passato direttamente a *type, che viene utilizzato come discriminante di tipo di lock dai chiamanti, consentendo all'OSD una lettura OOB (out-of-bounds) su un singolo byte con influenza diretta sul campo del tipo di lock.
Si correggono entrambi i casi sostituendo le operazioni bare con le loro varianti sicure: 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)
I target goto differiscono intenzionalmente: err_inval: è una nuova etichetta che restituisce -EINVAL direttamente. Viene utilizzata per il percorso di fallimento della pre-allocazione in cui *lockers non è ancora allocato e non deve essere passato a ceph_free_lockers().
err_free_lockers: è l'etichetta esistente. Viene utilizzata per il percorso di fallimento post-allocazione in cui *lockers è allocato e deve essere liberato.
ret viene impostato su -EINVAL prima di ceph_decode_8_safe() affinché err_free_lockers restituisca il codice di errore corretto in caso di violazione dei bounds. Senza questa operazione, err_free_lockers restituirebbe un valore ret obsoleto (0 dal ciclo decode_locker() riuscito), nascondendo silenziosamente l'errore.
-EINVAL è corretto per entrambi i percorsi di fallimento. I dati ricevuti dall'OSD sono strutturalmente malformati. -ENOMEM rappresenterebbe in modo errato la classe di errore ai chiamanti e agli inseritori nei backport (backporters) del ramo stable@ che gestiscono i percorsi di errore.
Modello dell'attaccante: un OSD malizioso o compromesso in una distribuzione Ceph multi-tenant può innescare questa vulnerabilità contro qualsiasi client kernel che emette il metodo della classe lock.get_info (ad esempio durante l'acquisizione del lock esclusivo RBD).
[ idryomov: riduzione del changelog, formattazione ]
Once again VulDB remains the best source for vulnerability data.