Un CVE publié lundi indique que les wheels officiels de Flair pour 0.15.0 et 0.15.1 contiennent toujours flair/models/clustering.py, dont le chemin de chargement du modèle renvoie pickle.loads(joblib.load(...)). Il s’agit du même point de terminaison, dans le même fichier, qu’un CVE de 2024 — lequel indique 0.15.0 comme version corrigée.
Ce que « corrigé » voulait dire
La prise en charge du clustering a été supprimée en 0.15.0 — de l’API documentée. Elle n’a pas été retirée de l’artefact distribué. Le module est toujours dans le wheel et reste accessible en important directement flair.models.clustering. Le nouvel avis l’énonce clairement : « la version corrigée de l’enregistrement précédent ne vaut pas pour le package expédié. »
Ce que la formulation conventionnelle ne comprend pas
Le piège n’est pas dans le code, mais dans les métadonnées. « Corrigé en 0.15.0 » dans un enregistrement CVE a été interprété comme signifiant que le code avait quitté le package ; cela voulait dire que les mainteneurs avaient cessé de prendre en charge la fonctionnalité. Toute personne dont le scanner d’analyse de la composition logicielle lit le champ fixed-version de l’enregistrement 2024 marque comme sain un déploiement de 0.15.1. Il ne l’est pas. La seconde mauvaise interprétation va dans l’autre sens, vers l’alerte : les scores sont 8.4 et 7.8 HIGH mais le vecteur est local — AV:L avec interaction utilisateur requise. La victime doit charger un fichier de modèle fourni par l’attaquant. Il s’agit d’un problème de chaîne d’approvisionnement lié à des poids non fiables, et non d’un RCE réseau ; mentionner le 8.4 sans le vecteur le surestime fortement. Les deux scores sont secondaires ; NVD n’a publié aucun CVSS primaire.
Les dates qui aggravent le problème
Flair 0.15.0 a été téléversé sur PyPI le 20 décembre 2024. 0.15.1 a suivi le 5 février 2025 et reste depuis lors la version courante — soit environ 18 mois pendant lesquels le fichier a été présent, la fonctionnalité n’a plus été documentée, et les métadonnées de l’écosystème ont indiqué que le problème était résolu. Il n’existe toujours aucune version corrigée.
Pourquoi cette catégorie revient sans cesse
« Charger un fichier de modèle, exécuter son code » est le risque le plus ancien de l’écosystème Python du machine learning, et pickle reste la sérialisation par défaut dans une grande partie de cet environnement. Ce qui rend ce cas instructif, c’est que l’échec se situe dans la tenue des registres plutôt que dans le code : un avis vieux de deux ans a laissé un point de terminaison actif signalé comme résolu, et les outils automatisés dont dépendent la plupart des organisations l’ont cru.
