CVE-2025-40220 in Linuxinformazioni

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.

Responsabile

Linux

Prenotare

16/04/2025

Divulgazione

04/12/2025

Moderazione

accettato

CPE

pronto

EPSS

0.00193

KEV

no

Attività

molto basso

Fonti

Might our Artificial Intelligence support you?

Check our Alexa App!