O Guaraci salva modelos treinados no formato .joblib, que por baixo usa
pickle — o mecanismo de serialização nativo do Python. Pickle não é
apenas dados: um arquivo .joblib pode conter instruções que executam
código arbitrário no seu computador no exato momento em que o arquivo é
carregado, antes de qualquer validação de conteúdo ser sequer possível.
Isso não é uma falha do Guaraci — é como o pickle funciona para qualquer
software Python que o usa (incluindo scikit-learn, joblib, pandas).
Mas significa que carregar um .joblib de origem desconhecida equivale a
rodar um programa desconhecido no seu computador.
guaraci.predicao.carregar_modelo(caminho, confiar=False)é o único ponto de carregamento de modelo em todo o projeto (CLI e app web). Por padrão, recusa carregar — é preciso passarconfiar=Trueexplicitamente, uma confirmação humana de que a origem é confiável.- Na CLI, isso aparece como uma pergunta de confirmação (s/n) antes de qualquer leitura do arquivo.
- No app web, é uma caixa de seleção obrigatória ("I trust the source of this model file") antes do botão de predição funcionar.
- Manifesto de integridade (
<modelo>.manifest.json, gerado automaticamente junto de todomodelo_plsda.joblibexportado pelo pipeline): registra o hash SHA-256 do arquivo, versões deguaraci/scikit-learn/numpy/Python, timestamp e classes do modelo. Quando esse manifesto existe ao lado do.joblib,carregar_modeloconfere o hash antes de chamarjoblib.load— se o arquivo foi trocado ou corrompido depois que o manifesto foi gerado, o carregamento é bloqueado antes de o pickle executar, não apenas avisado depois. - Deploy público (Streamlit Community Cloud ou similar): o operador
pode definir a variável de ambiente
GUARACI_DISABLE_MODEL_UPLOAD=1para desabilitar completamente o carregamento de modelo pela interface web — isso desliga tanto o uploader de.joblibquanto o campo de caminho local (corrigido em 2026-08-07: um campo de texto num app web público nunca é "só o operador digita", qualquer visitante alcança; antes só o uploader era desligado, e o campo de caminho local sozinho já bastava para contornar a proteção — verdocs/auditoria/AUDITORIA_SEGURANCA_2026-08-07.md, achado S1). Com a flag ativa, a aba de Predição não carrega nenhum modelo pela web — rode a CLI localmente para prever amostras nesse modo. - Uploads isolados por sessão: quando o carregamento de modelo está habilitado, cada visitante grava seu upload numa subpasta temporária própria (identificador aleatório, nunca exposto ao cliente), não mais um caminho fixo compartilhado entre todas as sessões — fecha uma condição de corrida entre usuários concorrentes e remove o caminho previsível que o achado S1 explorava (ver mesmo relatório, achado S2).
- O manifesto detecta arquivo trocado depois de gerado — não valida
automaticamente que um
.joblibde terceiro (sem manifesto, ou com manifesto de origem desconhecida) é seguro. Não existe verificação automática de "isto é seguro" para pickle; a decisão de confiar é sempre humana. confiar=Truenão é uma prova criptográfica — é uma confirmação explícita de que você reconhece o risco e confia na origem (você mesmo treinou o modelo, ou a fonte é conhecida e verificada por outro canal).
- Só carregue modelos
.joblibque você mesmo treinou, ou que recebeu de uma fonte que você confia plenamente (colega de equipe, repositório interno controlado). - Nunca carregue um
.joblibrecebido por e-mail, link público ou repositório de terceiros sem verificação, mesmo que o remetente pareça confiável — o formato do arquivo não permite inspeção segura do conteúdo antes de carregar. - Prefira compartilhar dados de entrada (espectros/CSV) e deixar cada
pessoa treinar seu próprio modelo, em vez de compartilhar o
.joblibpronto, quando a fonte não for inteiramente confiável.
Se você encontrar uma vulnerabilidade de segurança no Guaraci (além do risco inerente ao pickle documentado acima, que é uma limitação conhecida e não uma falha a ser "corrigida"), abra uma issue privada ou entre em contato diretamente: erleysdacosta@gmail.com.
Ver também docs/VALIDATION.md (validação numérica) e docs/MANUAL.md
(uso da aba/menu de Predição).