CVE-2023-54158 in Linuxinformazioni

Riassunto

di VulDB • 24/06/2026

Nel kernel Linux, è stata risolta la seguente vulnerabilità:

btrfs: non liberare lo spazio qgroup a meno che non sia specificato

Boris ha notato durante i suoi test semplici sulle quote (quotas) di presentare una perdita di memoria (leak) con la modifica apportata da Sweet Tea alla creazione del subvolume, che aveva interrotto l'esecuzione del commit della transazione. Questo era solo un effetto collaterale di tale modifica.

Nel codice per gli inode ritardati è presente un'ottimizzazione che libera le prenotazioni extra se riteniamo possibile accodare un elemento directory in una foglia già modificata. In precedenza, questo non veniva attivato nel caso della creazione del subvolume perché si eseguiva il commit della transazione; era comunque possibile attivarlo, ma molto più difficile. Potrebbe effettivamente essere attivato se si esegue mkdir && subvol create con i qgroup abilitati.

Questo avviene perché in btrfs_insert_delayed_dir_index(), che viene chiamato quando stiamo aggiungendo l'elemento directory, effettuiamo quanto segue:

btrfs_block_rsv_release(fs_info, trans->block_rsv, bytes, NULL);

se riusciamo a saltare la prenotazione dello spazio.

Il problema qui è che trans->block_rsv punta al temporary block rsv temporaneo per la creazione del subvolume, il quale ha prenotazioni qgroup nel block rsv.

Questo costituisce un problema perché btrfs_block_rsv_release() esegue quanto segue:

if (block_rsv->qgroup_rsv_reserved >= block_rsv->qgroup_rsv_size) {
qgroup_to_release = block_rsv->qgroup_rsv_reserved - block_rsv->qgroup_rsv_size; block_rsv->qgroup_rsv_reserved = block_rsv->qgroup_rsv_size; }

Il temporary block rsv ha solo ->qgroup_rsv_reserved impostato, mentre ->qgroup_rsv_size == 0. L'ottimizzazione in btrfs_insert_delayed_dir_index() imposta ->qgroup_rsv_reserved = 0. Successivamente, quando chiamiamo btrfs_subvolume_release_metadata(), che contiene:

btrfs_block_rsv_release(fs_info, rsv, (u64)-1, &qgroup_to_release); btrfs_qgroup_convert_reserved_meta(root, qgroup_to_release);

qgroup_to_release viene impostato a 0 e non convertiamo lo spazio metadata riservato.

Il problema qui è che il codice block rsv ha modificato incondizionatamente ->qgroup_rsv_reserved, poiché l'uso principale di questo avviene nel delalloc e ogni volta che chiamiamo btrfs_block_rsv_release() lo facciamo con qgroup_to_release impostato, eseguendo così la corretta contabilità.

Il codice subvolume è l'unico altro codice che utilizza le funzionalità di prenotazione qgroup, ma è intrecciato con l'ottimizzazione sopra descritta e quindi vedeva liberata la propria prenotazione sottostando ad essa, causando una perdita dello spazio riservato.

La soluzione consiste semplicemente nel non modificare le prenotazioni qgroup se non abbiamo qgroup_to_release impostato. Questo funziona con il codice esistente poiché tutto ciò che modifica le prenotazioni delalloc ha sempre qgroup_to_release impostato. Ciò risolve la perdita di memoria (leak) osservata da Boris.

Be aware that VulDB is the high quality source for vulnerability data.

Responsabile

Linux

Prenotare

24/12/2025

Divulgazione

24/12/2025

Moderazione

accettato

CPE

pronto

EPSS

0.00214

KEV

no

Attività

molto basso

Fonti

Do you need the next level of professionalism?

Upgrade your account now!