LangChain CVE-2025-68664: Como Dados Pessoais Vazam do Seu Pipeline RAG
Atualizado para 2026.
Uma falha crítica foi encontrada no LangChain no final de 2025. O CVE é CVE-2025-68664. A pontuação CVSS é 9.3 (Crítico).
Ela afeta o código de serialização do LangChain.
O que CVE-2025-68664 faz
O LangChain tem duas funções de serialização: dumps() e dumpd(). Elas convertem objetos Python em texto.
A falha está no tratamento de closures.
Quando o LangChain serializa um callable, ele captura o contexto do closure.
Um atacante que controla a resposta do LLM pode acionar dumps(). A função então lê variáveis de ambiente do processo Python.
O resultado é a exposição de dados. Chaves de API, strings de banco de dados, segredos JWT e credenciais AWS podem aparecer na saída do modelo.
Um atacante que injeta texto em um documento fonte RAG pode ler seus segredos de produção.
Versões afetadas: LangChain abaixo de 0.3.22 (Python). A versão 0.3.22 contém a correção.
Dados do PyPI mostram uso amplo de versões antigas até março de 2026.
Como Dados Pessoais Vazam em Pipelines RAG
CVE-2025-68664 é um caso extremo de um problema mais amplo.
Dados vazam rotineiramente por pipelines RAG. Nenhum atacante é necessário.
Aqui está uma configuração RAG empresarial padrão.
Primeiro, a ingestão. Você indexa documentos da empresa em um armazenamento vetorial. Pense em tickets de suporte, e-mails de clientes, contratos e registros de RH.
Armazenamentos vetoriais comuns são Pinecone, Weaviate e pgvector.
Segundo, a recuperação. Um usuário faz uma pergunta. O sistema busca os cinco fragmentos mais relevantes.
Terceiro, a geração. Esses fragmentos vão para um LLM — GPT-4o, Claude ou Gemini — como contexto.
O passo dois é o problema. Os fragmentos recuperados contêm tudo o que os documentos fonte continham. Isso inclui:
- Nomes de clientes, endereços de e-mail e números de telefone
- Valores de contratos, números de conta e identificadores fiscais
- Dados salariais e notas de avaliação de funcionários
- Nomes de pacientes em notas clínicas
- Números de identificação nacional em arquivos de imigração
Esses dados vão para o LLM sem modificação. Eles podem aparecer na saída do modelo.
São registrados pelo provedor do LLM. Ficam no histórico de conversação. Fluem para sua pilha de observabilidade.
Nenhum ataque é necessário. É assim que o RAG funciona por design. Esse design cria um risco real de privacidade.
68 Padrões de Segredos em Documentos Empresariais
Ferramentas de segurança rastreiam 68 padrões de segredos conhecidos. Eles aparecem com mais frequência do que as equipes esperam.
Aqui estão os mais comuns.
- AWS Access Key IDs (
AKIA...) - Chaves de API da OpenAI (
sk-...) - Chaves de API da Anthropic (
sk-ant-...) - URIs de banco de dados (
postgresql://user:password@host/db) - Tokens JWT (cabeçalhos codificados em base64)
- GitHub Personal Access Tokens
- Chaves secretas da Stripe (
sk_live_...) - Chaves de API da SendGrid
- SIDs de conta Twilio e tokens de autenticação
- Blocos PEM de chave privada
Um ticket de suporte pode conter uma chave de API de um cliente de uma sessão de depuração.
Um contrato pode incluir credenciais de banco de dados de uma transferência técnica.
Um arquivo de configuração indexado por engano pode expor um armazenamento inteiro de segredos.
Quando esses arquivos entram em um armazenamento vetorial sem saneamento, cada consulta pode passar os segredos para o LLM.
Eles também podem chegar ao usuário final.
A Solução: Anonimizar Antes de Incorporar
A abordagem correta anonimiza os documentos antes do chunking e da incorporação.
Essa etapa é obrigatória para qualquer sistema que lida com dados de clientes.
Aqui está um exemplo em Python usando a API anonym.legal:
import requests
import os
ANONYM_API_KEY = os.environ["ANONYM_API_KEY"]
ANONYM_BASE_URL = "https://anonym.legal/api"
def anonymize_before_embedding(text: str) -> tuple[str, dict]:
"""Anonimizar dados pessoais antes da incorporação."""
response = requests.post(
f"{ANONYM_BASE_URL}/presidio/anonymize",
json={
"text": text,
"language": "en",
"anonymizers": {
"DEFAULT": {"type": "replace", "new_value": "[REDACTED]"},
"PERSON": {"type": "mask", "masking_char": "*", "chars_to_mask": 4, "from_end": False},
"EMAIL_ADDRESS": {"type": "replace", "new_value": "[EMAIL]"},
"PHONE_NUMBER": {"type": "replace", "new_value": "[PHONE]"},
"CRYPTO": {"type": "replace", "new_value": "[SECRET]"},
"URL": {"type": "keep"},
}
},
headers={"Authorization": f"Bearer {ANONYM_API_KEY}"}
)
result = response.json()
return result["text"], result.get("items", [])
def build_rag_index(documents: list[str], vectorstore):
"""Construir um índice RAG apenas com documentos limpos."""
anonymized_docs = []
for doc in documents:
clean_text, entities = anonymize_before_embedding(doc)
anonymized_docs.append(clean_text)
print(f"Removed {len(entities)} PII entities from document")
vectorstore.add_texts(anonymized_docs)
A API anonym.legal cobre 285+ tipos de entidades. Nomes, e-mails, telefones, IDs nacionais, chaves de API e URIs de banco de dados são todos detectados.
Nenhum dado sensível chega ao armazenamento vetorial. Portanto, nada sensível pode vazar para os usuários.
Consulte o guia do desenvolvedor para padrões de integração com LangChain e LlamaIndex.
Corrija CVE-2025-68664 Agora Mesmo
Se você usa LangChain abaixo de 0.3.22, atualize agora:
pip install "langchain>=0.3.22" "langchain-core>=0.3.22"
Após o patch, verifique suas configurações de cadeia para riscos de injeção. Aqui estão três passos.
Primeiro, valide os fragmentos recuperados. Faça isso antes de chegarem ao LLM.
Remova o conteúdo que corresponde a padrões de injeção como ignore previous instructions, system: ou <INST>.
Segundo, anonimize antes de incorporar. Isso reduz a superfície de ataque.
Se uma injeção ocorrer, os dados sensíveis não estão mais lá para serem extraídos.
Terceiro, restrinja as permissões da cadeia. As cadeias LangChain não devem ler variáveis de ambiente além do necessário.
Use uma conta de serviço com escopo mínimo.
A Matemática É Simples
A pontuação CVSS é 9.3. A correção é uma chamada de API por documento.
A combinação de CVE-2025-68664 e o risco geral de dados RAG é uma responsabilidade real.
A solução é clara: anonimizar na ingestão, não no momento da consulta.
Consulte a visão geral de segurança e conformidade para requisitos RAG empresariais.
Fontes
- NVD CVE-2025-68664, CVSS 9.3, vulnerabilidade de serialização do LangChain
- Aviso de segurança do LangChain, langchain-ai/langchain GitHub, 2025
- OWASP LLM Top 10: LLM01 Injeção de Prompt, LLM06 Divulgação de Informações Sensíveis
- Documentação de tipos de entidade anonym.legal — 285+ tipos suportados