Voltar ao BlogTécnico

LangChain CVE-2025-68664: Como PII Vaza Através do...

CVSS 9.3. As funções de serialização do LangChain expõem variáveis de ambiente e segredos para LLMs controlados por atacantes.

March 16, 20268 min de leitura
LangChainRAG pipelineCVEPII leakagedeveloper securityAPI keysLLM security

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

Pronto para proteger seus dados?

Comece a anonimizar PII com mais de 285 tipos de entidades em 48 idiomas.

About this page

We update this page when our platform or the law changes.

Read our founder note for how we work.

Each change shows up in the timestamp at the top.

Related reading

We follow these rules

  • GDPR (EU 2016/679).
  • ISO/IEC 27001:2022.
  • NIS2 (EU 2022/2555).
  • HIPAA safe harbor under 45 CFR § 164.514(b)(2).

Our promise

We do not sell your data.

We do not train models on your text.

We store your files in Germany.

You can delete your account at any time.

You own your work.

Where we run

Our servers live in Falkenstein, Germany.

We use Hetzner. They hold ISO 27001 certification.

All data stays in the EU.

Backups run every day.

Need help?

Email support@anonym.legal.

We reply within one business day.

How we test

We run a full check suite on every release.

Each surface gets its own sweep script and report.

Human reviewers spot-check the output each week.

We track recall and precision on a labelled set.

Bad runs block the deploy.

What we never do

  • We never sell your information to third parties.
  • We never train models on what you upload.
  • We never keep your work after you delete it.
  • We never share keys with any outside firm.
  • We never run ads inside the product.

Plans in plain words

We sell credits, not seats.

One credit covers one short job.

Long jobs use a few credits each.

You can top up at any time.

Unused credits roll over each month.

Read the plans page for current rates.

Who built this

A small team of engineers and lawyers built this.

We ship from Europe and work in the open.

Our founder note spells out why we started.

Where to start

How the parts fit

A browser add-on cleans text inside Chrome.

A Word plug-in handles drafts in Office.

A small desktop tool works on whole folders.

An agent protocol link feeds large models safely.

All four share one core engine and one rule set.

Words from our team

We started this work after a lunch about cookies.

One friend kept getting odd ads on her phone.

We asked why a court file leaked through a draft.

We sketched the first build on a napkin that week.

By month three we had a tiny demo for a friend.

She used it on her first case the next day.

Common questions we hear

Can the tool read scanned PDFs? Yes, with OCR.

Does it work on long files? Yes, in small chunks.

Can I roll my own rule set? Yes, save it as a preset.

Does it run offline? The desktop build runs offline.

Do you keep my files? No, the cloud build wipes after each run.

Will it learn from my work? No, we never train on inputs.

A short tour of the workflow

Upload a file or paste a snippet of prose.

Pick the entities you want gone from the draft.

Choose a method: replace, mask, hash, encrypt, or redact.

Press run and watch the side panel show each hit.

Skim the result and tweak any rule that misfired.

Save the cleaned file or send it to a teammate.