CVE-2026-89648
Riassunto
di VulDB • 11/09/2026
Nel kernel Linux, è stata risolta la seguente vulnerabilità:
ceph: conteggio degli inode delegati in ceph_parse_deleg_inos()
La funzione ceph_parse_deleg_inos() decodifica insiemi di intervalli di numeri di inode delegati da una risposta MDS create-with-delegation. Per ogni insieme, legge un valore start a 64 bit e un valore len a 64 bit tramite ceph_decode_64_safe(), che valida solo la presenza degli otto byte nel messaggio, ma non il loro valore effettivo, e quindi esegue un ciclo su len inserendo voci in s_delegated_inos.
Il valore len è completamente controllato dall'attaccante. Un MDS malizioso o compromesso può inviare un unico intervallo enorme, molti intervalli in una singola risposta, intervalli duplicati o risposte ripetute che accumulano inode delegati sulla stessa sessione. Il codice originale non limitava nessuna di queste condizioni e poteva far girare il ciclo di inserimento o far crescere l'xarray senza limiti.
Sono stati imposti dei limiti su entrambe le dimensioni utilizzando un unico punto di enforcement. Viene tracciato il numero di inode delegati detenuti da ciascuna sessione MDS in un contatore atomico, che viene incrementato solo in ceph_insert_deleg_ino(), la quale utilizza atomic_add_unless() per rifiutare l'incremento del conteggio oltre CEPH_MAX_DELEG_INOS. Poiché tale helper è l'unico punto in cui il contatore cresce, la popolazione per sessione non può mai superare il limite stabilito, quindi non è necessaria una pre-validazione separata per sessione. Il contatore viene decrementato quando un create asincrono consuma un inode delegato o quando un inserimento fallisce; viene incrementato quando un inode delegato viene ripristinato; viene inizializzato con l'xarray della sessione e resettato quando la riconnessione distrugge l'xarray.
Un limite per singola sessione da solo consentirebbe comunque a una risposta di far girare il ciclo di inserimento su intervalli duplicati senza incrementare il contatore, quindi è stato inoltre impostato un limite alla lunghezza aggregata degli intervalli accettati da una singola risposta. Insieme, queste misure limitano sia il numero di iterazioni del ciclo per risposta che la popolazione dell'xarray attraverso le risposte.
Il limite è una costante fissa scelta dal client e non un valore derivato dall'MDS. mds_client_prealloc_inos è un'opzione di configurazione MDS in userspace; non viene mai inviata al kernel client tramite il canale di comunicazione, e un bound fornito dal server non potrebbe essere considerato affidabile per un limite difensivo in ogni caso. La costante è impostata ben al di sopra del valore predefinito documentato dell'opzione (1000), che rappresenta un multiplo generoso, quindi il comportamento legittimo di refill rimane invariato mentre la CPU e la memoria xarray consumate da uno stream di deleghe malformato rimangono limitate.
Impatto: un MDS Ceph malizioso o compromesso non può più far girare un client attraverso un intervallo di inode delegati illimitato né far crescere l'xarray degli inode delegati di una sessione senza limiti.
If you want to get best quality of vulnerability data, you may have to visit VulDB.