Um CVE publicado na segunda-feira registra que os wheels oficiais do Flair para as versões 0.15.0 e 0.15.1 ainda contêm flair/models/clustering.py, cujo caminho de carregamento do modelo retorna pickle.loads(joblib.load(...)). Esse é o mesmo sink, no mesmo arquivo, de um CVE de 2024 — que lista 0.15.0 como a versão corrigida.
O que "corrigido" significava
O suporte a clustering foi removido na 0.15.0 — da API documentada. Não foi removido do artefato distribuído. O módulo ainda está no wheel e pode ser acessado importando diretamente flair.models.clustering. O novo aviso diz isso de forma clara: "a versão corrigida no registro anterior não se aplica ao pacote distribuído."
O que a formulação convencional entende errado
A armadilha aqui não está no código, e sim nos metadados. "Corrigido na 0.15.0" em um registro de CVE foi interpretado como se o código tivesse saído do pacote; na prática, significava que os mantenedores deixaram de oferecer suporte à funcionalidade. Quem usa um scanner de análise de composição de software que lê o campo de versão corrigida do registro de 2024 marca uma instalação da 0.15.1 como limpa. Ela não está limpa. A segunda leitura equivocada vai na direção oposta, para o alarme: as pontuações são 8.4 e 7.8 HIGH, mas o vetor é local — AV:L com interação do usuário exigida. A vítima precisa carregar um arquivo de modelo fornecido pelo atacante. Trata-se de um problema de cadeia de suprimentos com pesos não confiáveis, não de um RCE de rede, e divulgar o 8.4 sem o vetor exagera bastante a gravidade. Ambas as pontuações são secundárias; o NVD não publicou um CVSS primário.
As datas que pioram a situação
O Flair 0.15.0 foi enviado ao PyPI em 20 de dezembro de 2024. A 0.15.1 veio em seguida em 5 de fevereiro de 2025 e é a versão atual desde então — cerca de 18 meses durante os quais o arquivo permaneceu presente, a funcionalidade ficou sem documentação e os metadados do ecossistema indicaram que o problema estava resolvido. Hoje também não existe versão corrigida.
Por que essa classe se repete
"Carregue um arquivo de modelo e execute o código dele" é o risco mais antigo no ecossistema de ML em Python, e o pickle ainda é a serialização padrão em grande parte dele. O que torna este caso instrutivo é que a falha está no registro, não no código: um aviso de dois anos atrás deixou um sink ativo marcado como resolvido, e as ferramentas automatizadas de que a maioria das organizações depende acreditaram nisso.
