Ícone do site Dolutech

LangGrinch: Vulnerabilidade Crítica no LangChain

langchain

A descoberta de duas vulnerabilidades críticas no LangChainCVE-2025-68664 (CVSS 9.3) e CVE-2025-68665 (CVSS 8.6) – expõe uma das frameworks de IA mais utilizadas globalmente a ataques sofisticados de prompt injection capazes de exfiltrar secrets empresariais, chaves de API e credenciais de bases de dados através de uma única resposta de LLM manipulada.

O que é o LangGrinch e Por Que é Crítico

Batizada de LangGrinch pelo pesquisador de segurança Yarden Porat da Cyata Security, esta vulnerabilidade representa um marco preocupante na intersecção entre inteligência artificial e segurança clássica. Reportada em 4 de dezembro de 2025, a falha afeta o langchain-core, o pacote Python fundamental que alimenta centenas de milhões de instalações de aplicações baseadas em Large Language Models (LLMs) em todo o mundo.

Neste artigo do Blog Dolutech, exploramos em profundidade os mecanismos técnicos destas vulnerabilidades, seu impacto devastador no ecossistema de IA agentic e as medidas urgentes que organizações precisam implementar para proteger suas infraestruturas.

A gravidade desta descoberta não reside apenas no score CVSS de 9.3, mas no facto de que a vulnerabilidade existe no núcleo da framework LangChain — não numa ferramenta periférica ou num caso extremo de integração. Como destacou Porat, “esta não é apenas uma bug numa biblioteca. É um estudo de caso num padrão maior: sua aplicação pode desserializar dados que acredita ter produzido com segurança.”

Contexto: Quando IA Encontra Segurança Clássica

O LangChain é uma framework open-source extremamente popular para construção de aplicações alimentadas por LLMs. Proporciona abstrações para gestão de memória conversacional, execução de ferramentas, streaming de eventos, caching e orquestração de agentes autónomos. Para suportar estes workflows complexos, a Dolutech identificou que o LangChain depende fortemente de serialização — o processo de converter objetos complexos em formatos estruturados que podem ser armazenados, transmitidos e posteriormente reconstruídos.

A serialização é o ponto onde a confiança pode ser traída. Durante décadas, vulnerabilidades de desserialização insegura (CWE-502) têm sido exploradas por atacantes para obter execução remota de código. O que torna o LangGrinch particularmente insidioso é que combina este vetor clássico com uma superfície de ataque moderna: outputs de LLMs são inputs não confiáveis.

A Chave ‘lc’: Mecanismo de Serialização do LangChain

O LangChain utiliza um formato de serialização customizado onde dicionários contendo uma chave especial 'lc' representam objetos serializados internamente pela framework. Esta chave funciona como um marcador que indica “isto é um objeto LangChain legítimo, não apenas dados arbitrários do utilizador.”

O problema crítico identificado pela nossa análise: as funções dumps() e dumpd() no langchain-core falharam em escapar adequadamente dicionários controlados pelo utilizador que continham esta chave 'lc' reservada. Quando estes dados não escapados são posteriormente desserializados via load() ou loads(), as estruturas injetadas são tratadas como objetos LangChain legítimos em vez de dados de utilizador comuns.

CVE-2025-68664: Serialization Injection no Python LangChain Core

A vulnerabilidade CVE-2025-68664 afeta versões do langchain-core anteriores a 0.3.81 e todas as versões de 1.0.0 até 1.2.5 (exclusive). Com um score CVSS de 9.3, esta é uma falha crítica que permite:

Vetores de Ataque Identificados

  1. Extração de Secrets de Variáveis de Ambiente: Quando a desserialização é executada com secrets_from_env=True (que era o padrão até à correção), atacantes podem forçar a framework a ler e exfiltrar qualquer variável de ambiente do sistema, incluindo:
    • Chaves de API de provedores cloud (AWS, Azure, GCP)
    • Credenciais de bases de dados
    • Strings de conexão RAG
    • Tokens de autenticação de serviços externos
    • Secrets de vaults empresariais
  2. Instanciação de Classes em Namespaces Confiáveis: A vulnerabilidade permite instanciar classes Serializable dentro dos namespaces pré-aprovados (langchain_core, langchain, langchain_community), incluindo aquelas com efeitos colaterais perigosos durante a inicialização, como:
    • Requisições de rede para endpoints controlados pelo atacante
    • Operações de filesystem
    • Execução de templates Jinja2
  3. Execução Arbitrária de Código via Templates: Em certas configurações, a combinação da falha de escapamento com templates Jinja2 pode levar a execução remota de código.

Fluxos Vulneráveis na Framework

A advisory oficial do LangChain lista 12 fluxos distintos onde a vulnerabilidade é explorável, incluindo casos extremamente comuns como:

Nós destacamos que muitos destes casos não envolvem chamadas diretas a load() ou loads() por parte dos programadores, tornando extremamente fácil negligenciar que dados não confiáveis estão sendo desserializados.

CVE-2025-68665: Vulnerabilidade Paralela no LangChain.js

A CVE-2025-68665 (CVSS 8.6) demonstra que este padrão de vulnerabilidade atravessa ecossistemas. Afetando os pacotes JavaScript/TypeScript @langchain/core (versões anteriores a 0.3.80 e 1.1.8) e langchain (versões anteriores a 0.3.37 e 1.2.3), esta falha paralela existe no método toJSON() e subsequentemente quando objetos são stringificados usando JSON.stringify().

A mecânica é análoga à variante Python: o método não escapa objetos com chaves 'lc' ao serializar dados free-form em kwargs. Quando dados controlados pelo utilizador contêm esta estrutura de chave, são tratados como objetos LangChain legítimos durante desserialização.

Para organizações que executam stacks mistos de Python e JavaScript, A Dolutech alerta que este deve ser tratado como um lembrete de que o padrão viaja entre ecossistemas: serialização baseada em marcadores, output de modelo não confiável e desserialização posterior é uma forma de risco recorrente.

Prompt Injection: O Vetor de Ataque Primário

O aspecto mais perturbador destas vulnerabilidades é que não requerem acesso direto ao código da aplicação ou APIs internas. O vetor de ataque primário é através de prompt injection via campos de resposta de LLM.

Como explicado por Yarden Porat: “O vetor de ataque mais comum é através de campos de resposta LLM como additional_kwargs ou response_metadata, que podem ser controlados via prompt injection e depois serializados/desserializados em operações de streaming. Este é exatamente o tipo de intersecção ‘IA encontra segurança clássica’ onde organizações são apanhadas desprevenidas. Output de LLM é um input não confiável.”

Como Funciona o Ataque

  1. Um atacante formula um prompt malicioso que manipula o LLM a incluir estruturas específicas com a chave 'lc' nos seus metadata de resposta
  2. A framework LangChain serializa esta resposta (incluindo os campos manipulados) durante operações normais como streaming ou logging
  3. Quando esta estrutura serializada é posteriormente desserializada, a framework trata o payload injetado como um objeto LangChain legítimo
  4. Se secrets_from_env=True estiver ativo, o atacante consegue exfiltrar variáveis de ambiente
  5. Alternativamente, o atacante pode instanciar classes específicas para triggar requisições de rede para endpoints controlados, exfiltrando dados sensíveis através de headers HTTP

Exemplo Técnico de Exploração

Embora os pesquisadores da Cyata tenham deliberadamente optado por não publicar exploits copy-paste completos para dar tempo às equipas de segurança, a advisory técnica revela o mecanismo fundamental:

# Estrutura maliciosa injetada via prompt injection
malicious_payload = {
    "lc": 1,
    "type": "secret",
    "id": ["AWS_SECRET_ACCESS_KEY"]  # Nome da variável de ambiente alvo
}

# Quando serializado via dumps() e depois desserializado com secrets_from_env=True
# a framework LangChain lê a variável de ambiente e retorna seu valor

Um caminho de exploração particularmente elegante identificado envolve a classe ChatBedrockConverse do langchain_aws:

  1. Esta classe está na allowlist padrão de loads()
  2. Executa uma requisição GET durante a construção/inicialização
  3. O endpoint GET é controlado pelo atacante via campo endpoint_url
  4. Headers HTTP específicos podem ser populados com variáveis de ambiente via feature secrets_from_env
  5. Resultado: exfiltração silenciosa de secrets através de tráfego HTTP outbound, mesmo que o atacante não veja as respostas do LLM diretamente

A Dolutech enfatiza que mesmo atacantes que não conseguem visualizar respostas de LLM podem exfiltrar secrets instanciando as classes certas, tornando esta uma ameaça de canal lateral extremamente perigosa.

Impacto Global: Escala da Superfície de Ataque

A gravidade do LangGrinch é amplificada pela adoção massiva do LangChain. Por volume de downloads, langchain é um dos componentes de framework de IA mais amplamente deployados globalmente na atualidade. Esta não é uma ferramenta de nicho — é infraestrutura crítica dentro de sistemas de produção em:

Nós analisamos que estamos entrando numa fase onde frameworks de IA agentic se estão tornando infraestrutura crítica dentro de sistemas de produção. Formatos de serialização, pipelines de orquestração, execução de ferramentas, caches e tracing já não são “encanamento” — fazem parte do seu perímetro de segurança.

Prêmio Record de Bug Bounty

O projeto LangChain decidiu atribuir um bounty de $4,000 USD por esta descoberta. Segundo a plataforma huntr onde o LangChain opera seu programa de bounties, este é o valor máximo já atribuído no projeto, com bounties anteriores chegando a apenas $125 — um testemunho da gravidade crítica desta vulnerabilidade.

Mitigação e Patches: Ação Imediata Necessária

Os maintainers do LangChain responderam de forma decisiva, não apenas corrigindo a bug mas também endurecendo defaults que eram excessivamente permissivos. As correções introduzem:

Patches Disponíveis

Para Python (langchain-core):

Para JavaScript/TypeScript:

Mudanças de Segurança Implementadas

  1. Mecanismo de Escapamento: As funções dumps() e dumpd() agora escapam corretamente dicionários contendo a chave 'lc' para prevenir que dados de utilizador sejam interpretados erroneamente como objetos LangChain
  2. Defaults Restritivos em Desserialização:
    • secrets_from_env alterado de True para False (desabilitando carregamento automático de secrets)
    • Novo parâmetro allowed_objects que permite especificar uma allowlist de classes permitidas para serialização/desserialização
    • Templates Jinja2 bloqueados por default via init_validator
  3. Breaking Changes: Estes são breaking changes para alguns casos de uso, mas necessários para estabelecer uma postura de segurança adequada

Recomendações da Dolutech para Organizações

  1. Atualização Imediata: Upgrade para versões corrigidas ASAP. Esta não é uma vulnerabilidade que pode esperar pelo próximo ciclo de manutenção
  2. Auditoria de Logs: Examinar logs de aplicações e data stores procurando sinais de exploração:
    • Objetos serializados com chaves 'lc' inesperadas
    • Acesso inusual a variáveis de ambiente
    • Outputs de LLM contendo dados estruturados com formato 'lc'
    • Requisições HTTP outbound para endpoints desconhecidos
  3. Revisão de Configurações: Mesmo após patch, revisar configurações de allowed_objects e garantir que apenas classes estritamente necessárias estão permitidas
  4. Defense in Depth:
    • Implementar network segmentation para limitar o que aplicações LangChain podem alcançar
    • Utilizar secrets managers adequados em vez de variáveis de ambiente quando possível
    • Aplicar princípio de least privilege em credenciais de serviço
    • Implementar monitoring de comportamento anómalo em agentes de IA
  5. Validação de Input de LLM: Tratar outputs de LLM como inputs não confiáveis, aplicando sanitização e validação antes de serialização
  6. Runtime Security: Para organizações executando workloads de IA em escala, considerar soluções como Upwind que mapeiam contexto de runtime e identificam onde serviços vulneráveis estão executando, que recursos sensíveis podem aceder e até onde um atacante poderia mover-se lateralmente

Lições para o Ecossistema de IA Agentic

O LangGrinch não é apenas uma bug isolada — é um wake-up call para toda a indústria de IA. Como observou Shahar Tal, co-fundador e CEO da Cyata: “À medida que agentes se movem para produção, a questão de segurança muda de ‘que código executamos’ para ‘que permissões efetivas este sistema acaba exercitando’.”

A Dolutech conclui que o padrão subjacente é claro: quando uma plataforma acidentalmente trata dados moldados por atacantes como estrutura confiável, fronteiras de segurança colapsam rapidamente. Para frameworks de agentes de IA, onde dados estruturados produzidos downstream de um prompt são frequentemente persistidos, transmitidos e reconstruídos posteriormente, isto cria uma superfície de ataque surpreendentemente grande alcançável a partir de um único prompt.

Desenvolvedores e security teams precisam reconhecer que:

Conclusão: Urgência e Vigilância

A descoberta das vulnerabilidades CVE-2025-68664 e CVE-2025-68665 representa um momento crítico na evolução da segurança de IA. Com centenas de milhões de instalações afetadas e um vetor de ataque tão acessível quanto manipular um prompt, organizações que dependem do LangChain enfrentam um risco existencial até que implementem os patches necessários.

Neste artigo, nós exploramos como uma única falha de escapamento numa framework de serialização pode criar um caminho direto desde prompt injection até exfiltração de secrets empresariais críticos. A resposta rápida e abrangente da equipa LangChain, incluindo o endurecimento de defaults permissivos, demonstra maturidade no tratamento de vulnerabilidades críticas.

No entanto, o incidente sublinha uma verdade fundamental para a era da IA agentic: segurança clássica e IA moderna estão convergindo de formas que organizações ainda estão aprendendo a navegar. À medida que frameworks como LangChain se tornam infraestrutura crítica, a gestão de vulnerabilidades neste espaço exige a mesma urgência e rigor que aplicamos a sistemas tradicionais — ou maior.

A Dolutech recomenda tratamento prioritário desta vulnerabilidade. Para security teams e desenvolvimento de IA: o LangGrinch é o seu lembrete de que quando IA encontra segurança clássica, os velhos padrões de vulnerabilidade encontram novos e insidiosos vetores de ataque.

Sair da versão mobile