CVE, опубликованная в понедельник, указывает, что официальные wheel-пакеты Flair для 0.15.0 и 0.15.1 по-прежнему содержат flair/models/clustering.py, а его путь загрузки модели возвращает pickle.loads(joblib.load(...)). Это тот же sink, в том же файле, что и в CVE 2024 года, — в которой 0.15.0 указана как исправленная версия.
Что означало «исправлено»
Поддержка кластеризации была убрана в 0.15.0 — из задокументированного API. Но она не была удалена из распространяемого артефакта. Модуль по-прежнему находится в wheel и доступен при прямом импорте flair.models.clustering. Новое уведомление прямо говорит об этом: «в более ранней записи fixed version не соответствует поставляемому пакету».
Что неверно в привычной трактовке
Ловушка здесь не в коде, а в метаданных. Формулировку «исправлено в 0.15.0» в записи CVE поняли так, будто код покинул пакет; на самом деле это означало лишь, что сопровождающие прекратили поддержку функции. Любой, чьё средство software composition analysis читает поле fixed-version из записи 2024 года, считает установку 0.15.1 безопасной. Это не так. Второе неверное прочтение идёт в обратную сторону, к тревоге: оценки составляют 8.4 и 7.8 HIGH, но вектор локальный — AV:L, при этом требуется взаимодействие пользователя. Жертва должна загрузить файл модели, предоставленный атакующим. Это проблема цепочки поставок с ненадёжными весами, а не сетевой RCE, и упоминание 8.4 без вектора сильно преувеличивает риск. Обе оценки Secondary; NVD не публиковала первичную CVSS.
Даты, которые делают ситуацию хуже
Flair 0.15.0 была загружена в PyPI 20 декабря 2024 года. За ней последовала 0.15.1 — 5 февраля 2025 года; с тех пор она остаётся текущим релизом — примерно 18 месяцев, в течение которых файл присутствует, функция не документирована, а метаданные экосистемы говорят, что проблема устранена. Сейчас также не существует исправленной версии.
Почему этот класс уязвимостей повторяется
«Загрузи файл модели и запусти их код» — старейшая опасность в экосистеме Python ML, и pickle по-прежнему остаётся стандартной сериализацией во многих таких случаях. Эта история поучительна тем, что сбой произошёл в учёте, а не в коде: двухлетней давности уведомление пометило живой sink как устранённый, и автоматизированные инструменты, на которые рассчитывает большинство организаций, поверили этому.
