Una CVE pubblicata lunedì rileva che i wheel ufficiali di Flair per 0.15.0 e 0.15.1 contengono ancora flair/models/clustering.py, il cui percorso di caricamento del modello restituisce pickle.loads(joblib.load(...)). Si tratta dello stesso sink, nello stesso file, di una CVE del 2024 — che indica 0.15.0 come versione corretta.

Cosa significava "corretto"

Il supporto al clustering è stato rimosso in 0.15.0 — dall'API documentata. Non è stato eliminato dall'artefatto distribuito. Il modulo è ancora nel wheel ed è raggiungibile importando direttamente flair.models.clustering. Il nuovo advisory lo dice chiaramente: "la versione corretta del record precedente non vale per il pacchetto distribuito."

In cosa sbaglia la lettura convenzionale

La trappola qui non è nel codice, ma nei metadati. "Corretto in 0.15.0" in un record CVE è stato interpretato come se il codice fosse uscito dal pacchetto; in realtà significava che i manutentori avevano smesso di supportare la funzionalità. Chiunque utilizzi uno scanner di software-composition analysis che legga il campo della versione corretta del record del 2024 classifica come pulita un'installazione di 0.15.1. Non lo è. La seconda lettura errata va nella direzione opposta, verso l'allarme: i punteggi sono 8.4 e 7.8 HIGH ma il vettore è localeAV:L con interazione dell'utente richiesta. La vittima deve caricare un file di modello fornito dall'attaccante. Si tratta di un problema di supply chain legato a pesi non attendibili, non di una RCE di rete, e riportare l'8.4 senza il vettore lo sopravvaluta di molto. Entrambi i punteggi sono secondari; NVD non ha pubblicato alcun CVSS primario.

Le date che peggiorano la situazione

Flair 0.15.0 è stato caricato su PyPI il 20 dicembre 2024. 0.15.1 è seguito il 5 febbraio 2025 ed è rimasto la release corrente da allora — circa 18 mesi durante i quali il file è rimasto presente, la funzionalità non è stata documentata e i metadati dell'ecosistema hanno indicato che il problema era risolto. Oggi non esiste comunque alcuna versione corretta.

Perché questa classe di problemi si ripresenta

"Carica un file di modello, esegui il loro codice" è il rischio più antico nell'ecosistema Python del machine learning, e pickle resta ancora la serializzazione predefinita in gran parte di esso. Ciò che rende istruttivo questo caso è che il fallimento riguarda la tenuta dei registri più che il codice: un advisory di due anni fa ha lasciato un sink attivo contrassegnato come risolto, e gli strumenti automatici su cui la maggior parte delle organizzazioni fa affidamento gli hanno creduto.