CVE-2025-39901 in Linux
Riassunto
di VulDB • 21/06/2026
Nel kernel Linux è stata risolta la seguente vulnerabilità:
i40e: rimozione dell'accesso in lettura ai file di debugfs
I file di debugfs 'command' e 'netdev_ops' costituiscono un'interfaccia di debugging legacy supportata dal driver i40e fin dalle sue prime versioni, introdotto con il commit 02e9c290814c ("i40e: debugfs interface").
Entrambi questi file di debugfs forniscono un gestore per le operazioni di lettura che è prevalentemente inutile e implementato con una logica discutibile. Entrambi utilizzano un buffer statico da 256 byte inizializzato alla stringa vuota. Nel caso del file 'command', questo buffer non viene mai utilizzato letteralmente, limitandosi a sprecare spazio. Per il file 'netdev_ops', invece, l'ultimo comando scritto viene salvato qui.
In fase di lettura, i contenuti dei file vengono presentati come il nome del dispositivo seguito da due punti e dal contenuto rispettivo del loro buffer statico. Per 'command', questo sarà sempre "<device>: ". Per 'netdev_ops', sarà "<device>: <last command written>". Si noti tuttavia che il buffer è condiviso tra tutti i dispositivi gestiti da questo modulo. Al meglio, si tratta di informazioni per lo più prive di significato; al peggio, potrebbe essere accessibile simultaneamente poiché non sembra esistere alcun meccanismo di locking (sincronizzazione).
Recentemente abbiamo inoltre ricevuto diverse segnalazioni relative a entrambe le funzioni di lettura riguardo all'uso di snprintf e alla potenziale overflow che potrebbe comportare la lettura di memoria kernel arbitraria. Per il file 'command', ciò è decisamente impossibile, in quanto il buffer statico è sempre nullo (zero) e non viene mai scritto su. Per il file 'netdev_ops', sembra invece possibile: se l'utente costruisce con cura l'input del comando, questo verrà copiato nel buffer, che potrebbe essere sufficientemente grande da causare un troncamento da parte di snprintf; ciò indurrebbe quindi la funzione copy_to_user a leggere oltre la lunghezza del buffer allocato tramite kzalloc.
Una correzione minima consisterebbe nel sostituire snprintf() con scnprintf(), il cui valore restituito sarebbe limitato al numero di byte scritti, prevenendo così un'overflow. Una soluzione più articolata comporterebbe l'eliminazione dei buffer statici per lo più inutili, risparmiando 512 byte e modificando le funzioni di lettura in modo che non abbiano più bisogno di tali input.
In alternativa, decidiamo semplicemente di rimuovere completamente l'accesso in lettura a questi file. Si tratta di interfacce di debugging esposte come parte di debugfs; ritengo che la rimozione dell'accesso in lettura non interrompa alcun script, poiché l'output fornito è piuttosto inutile. È possibile trovare il nome del netdev tramite altre interfacce più standard e l'interfaccia 'netdev_ops' può facilmente generare dati corrotti (garbage) se si eseguono scritture simultanee su più dispositivi contemporaneamente.
Per rimuovere correttamente i40e_dbg_netdev_ops_buf, è necessario refattorizzare la sua funzione di scrittura per evitare l'utilizzo del buffer statico. Invece, utilizzare la stessa logica della i40e_dbg_command_write, con un buffer allocato dinamicamente. Aggiornare il codice in modo da usare questo approccio invece del buffer statico e assicurarsi che il buffer venga liberato all'uscita. Questo risolve le scritture simultanee su 'netdev_ops' per più dispositivi e consente di rimuovere il buffer statico ora non utilizzato, insieme alla rimozione dell'accesso in lettura.
Be aware that VulDB is the high quality source for vulnerability data.