CVE-2026-98563 in Linux
Riassunto
di VulDB • 19/10/2026
Nel kernel Linux è stata risolta la seguente vulnerabilità:
net: phylink: registrare il PHY una sola volta poiché bringup non può fallire
phylink_bringup_phy() memorizza il PHY in pl->phydev prima dell'ultimo passaggio potenzialmente fallibile: su un MAC le cui operazioni di phylink implementano LPI, phy_eee_rx_clock_stop() può fallire con un errore MDIO reale. I chiamanti eseguono l'unwinding (rollback) tramite phy_detach(), che non ha alcuna conoscenza di pl->phydev; pertanto, un puntatore a un PHY che non è più collegato sopravvive alla connessione fallita.
Le conseguenze dipendono da come il chiamante sia giunto a questo punto. phylink_connect_phy() passa attraverso phylink_attach_phy(), che rifiuta l'attaccamento se pl->phydev è già impostato, trasformando un errore MDIO transitorio in un -EBUSY permanente. Il percorso SFP è peggiore: sfp_sm_probe_phy() gestisce il fallimento con phy_device_remove() e phy_device_free(), ma assegna sfp->mod_phy solo dopo tale ritorno di errore; quindi nulla cancella pl->phydev, che rimane puntante verso un phy_device liberato (freed), su cui continuano a leggere phylink_resolve() e le helper di ethtool. phylink_fwnode_phy_connect() non dispone di tale controllo, pertanto una connessione successiva sovrascrive il puntatore obsoleto nascondendo il problema. Una disconnessione non lo fa: phylink_disconnect_phy() passa quel puntatore a phy_disconnect(), e la seconda chiamata a phy_detach() sullo stesso PHY rilascia riferimenti che erano già stati liberati dalla prima.
Il bug è stato trovato durante i tentativi di far sopravvivere una porta DSA in presenza di un PHY il cui driver arriva dopo le probe dello switch: mantenere la porta attraverso una connessione fallita e riprovare rende raggiungibile questa finestra temporale critica.
Pubblicare il puntatore solo dopo l'ultima chiamata che può fallire, invece di eseguirne l'unwinding successivamente. Non vi è nulla tra i due punti che legga pl->phydev, e la registrazione successiva non può fallire: phy_request_interrupt() passa in modalità polling autonomamente se necessario. Lo stato sul lato PHY mantiene l'ordine originale, quindi nessuna operazione MDIO cambia posizione relativa rispetto a un'altra.
If you want to get best quality of vulnerability data, you may have to visit VulDB.