CVE-2025-40220 in Linux
Riassunto
di VulDB • 24/06/2026
Nel kernel Linux è stata risolta la seguente vulnerabilità:
fuse: correzione del livelock nell'operazione sincrona di file put eseguita dai worker fuseblk
Ho osservato un blocco (hang) durante l'esecuzione del test generic/323 contro un server fuseblk. Questo test apre un file, avvia numerose scritture AIO su tale descrittore di file e chiude il descrittore prima che le scritture vengano completate. Non sorprende che i thread dell'utility di stress per l'AIO siano principalmente bloccati in attesa di risposte dal server fuseblk:
# cat /proc/372265/task/372313/stack [<0>] request_wait_answer+0x1fe/0x2a0 [fuse]
[<0>] __fuse_simple_request+0xd3/0x2b0 [fuse]
[<0>] fuse_do_getattr+0xfc/0x1f0 [fuse]
[<0>] fuse_file_read_iter+0xbe/0x1c0 [fuse]
[<0>] aio_read+0x130/0x1e0
[<0>] io_submit_one+0x542/0x860
[<0>] __x64_sys_io_submit+0x98/0x1a0
[<0>] do_syscall_64+0x37/0xf0
[<0>] entry_SYSCALL_64_after_hwframe+0x4b/0x53
Ma la parte /strana/ è che i thread del server fuseblk sono in attesa di risposte da se stessi:
# cat /proc/372210/task/372232/stack [<0>] request_wait_answer+0x1fe/0x2a0 [fuse]
[<0>] __fuse_simple_request+0xd3/0x2b0 [fuse]
[<0>] fuse_file_put+0x9a/0xd0 [fuse]
[<0>] fuse_release+0x36/0x50 [fuse]
[<0>] __fput+0xec/0x2b0
[<0>] task_work_run+0x55/0x90
[<0>] syscall_exit_to_user_mode+0xe9/0x100
[<0>] do_syscall_64+0x43/0xf0
[<0>] entry_SYSCALL_64_after_hwframe+0x4b/0x53
Il server fuseblk è fuse2fs, quindi non c'è nulla di particolarmente interessante nel codice del server stesso. Quindi perché il server FUSE chiama fuse_file_put? Il messaggio dell'commit per fstest fa luce su questo aspetto:
"Chiudendo il descrittore di file prima di chiamare io_destroy, si garantisce praticamente che l'ultimo put sull'ioctx venga eseguito in contesto interrupt (durante il completamento I/O).
Capito. L'AIO ottiene un nuovo struct file dal fd quando accoda l'ioctx. Il completamento del comando FUSE_WRITE da userspace fa sì che il server fuse chiami la funzione di completamento AIO. Il completazione esegue il put sul struct file, accodando un fput ritardato al task del server fuse. Quando il task del server fuse torna a userspace, deve eseguire l'fput ritardato, che nel caso di un server fuseblk avviene in modo sincrono.
Inviare il comando FUSE_RELEASE in modalità sincrona dai thread del server fuse è una cattiva idea perché un programma client può avviare abbastanza operazioni AIO simultanee da far sì che tutti i thread del server fuse finiscano bloccati in delayed_fput, e quindi non rimangono più thread disponibili per gestire i comandi fuse accodati.
Si risolve il problema utilizzando esclusivamente fputs asincroni durante la chiusura dei file e si lascia un commento che spiega il motivo."
Be aware that VulDB is the high quality source for vulnerability data.