A memória do seu agente de IA é uma superfície de ataque. A Check Point Research provou que dá para ir de SQL injection a execução remota de código através do checkpointer do LangGraph. Na Tech86, acompanhamos de perto essa classe de vulnerabilidade — não é a primeira vez que a camada de persistência de agentes de IA vira vetor de comprometimento.
A cadeia: de SQL injection a RCE pela memória do agente
O LangGraph é um dos frameworks de agentes mais usados do ecossistema LangChain, com 50 milhões de downloads mensais segundo o PyPI Stats. O checkpointer é o componente que dá ao agente memória persistente: salva o estado da conversa, o contexto, as ferramentas usadas. É o que permite ao agente retomar de onde parou.
A Check Point Research descobriu duas CVEs que formam uma cadeia de exploração completa, além de uma CVE classificada como defense-in-depth:
CVE-2025-67644 (CVSS 7.3 pelo CNA; o NVD avaliou 7.8): SQL injection no checkpointer SQLite. A função _metadata_predicate() interpola filter keys em f-strings sem validação. O vetor são as chaves, não os valores. Aplicações que aceitam filter keys não confiáveis em buscas estão vulneráveis. Patch: langgraph-checkpoint-sqlite 3.0.1+.
CVE-2026-27022: mesma classe de injeção no checkpointer Redis do ecossistema JavaScript/Node.js (@langchain/langgraph-checkpoint-redis). Mesmo mecanismo, backend e runtime diferentes. CVSS 6.5 (CNA). O NVD ainda não publicou avaliação independente.
CVE-2026-28277 (CVSS 6.8 pelo CNA; o NVD avaliou 7.2): desserialização insegura de msgpack durante o carregamento de checkpoints. O checkpointer reconstrói objetos Python a partir de dados msgpack. Se um atacante pode modificar os dados do checkpoint no backing store — por exemplo, após comprometer o banco via SQL injection — ele fornece um payload que executa código arbitrário quando o checkpoint é carregado. Patch: langgraph 1.0.10+.
A cadeia é linear: SQL injection → manipulação dos dados do checkpoint → desserialização msgpack → execução remota de código. Cada etapa habilita a próxima.
O debate sobre defense-in-depth
O GitHub advisory classifica a CVE-2026-28277 como "post-exploitation / defense-in-depth" e afirma que não há evidência de exploração em ambiente real. Segundo a própria classificação do advisory, isso é correto como avaliação de severidade isolada.
Mas a cadeia que a Check Point documentou muda o cálculo. O pré-requisito para a desserialização insegura — escrita no checkpoint store — é alcançável via SQL injection. A classificação "defense-in-depth" só se sustenta se o checkpointer não estiver exposto a input não confiável. Se está, a cadeia é completa e a severidade real é significativamente maior que a classificação individual sugere.
Na Tech86, vimos essa dinâmica antes: vulnerabilidades classificadas como defense-in-depth que, na prática, formam cadeias completas de exploração. A classificação correta depende do contexto de deployment, não apenas da vulnerabilidade isolada.
O vetor independente: fallback para pickle
Além disso, a CVE-2026-27794, descoberta pela Trend Micro Zero Day Initiative (ZDI), afeta o BaseCache em langgraph-checkpoint anterior a 4.0.0, que tem fallback para pickle. Pickle é um formato de serialização do Python que permite execução arbitrária de código por definição — é uma propriedade documentada do formato.
Esse fallback permite RCE direto, sem necessidade de SQL injection como passo prévio. É um vetor independente, separado da cadeia SQLi→RCE, e tão grave quanto. Qualquer deployment com langgraph-checkpoint anterior a 4.0.0 está exposto, independentemente de o checkpointer aceitar input não confiável.
Quem está em risco
Equipes que hospedam LangGraph localmente com checkpointer SQLite ou Redis e expõem get_state_history() com filtro controlado pelo usuário. A nuvem gerenciada da LangChain usa PostgreSQL e não é vulnerável à cadeia documentada, segundo o GitHub advisory e a Check Point Research.
O perfil de risco é claro: se o deployment aceita filter keys não confiáveis, a cadeia SQLi→RCE é completa. Se usa langgraph-checkpoint anterior a 4.0.0, o fallback pickle é um vetor independente. Muitas equipes se encaixam nos dois cenários simultaneamente.
A mitigação que funciona
A mitigação principal é ativar LANGGRAPH_STRICT_MSGPACK=true em produção. Isso muda a política de desserialização para allowlist — apenas tipos seguros são reconstruídos a partir de dados msgpack. O LangGraph pode derivar automaticamente a allowlist a partir dos schemas do grafo ao compilar.
Além da flag, é necessário aplicar os patches: langgraph-checkpoint-sqlite 3.0.1+, langgraph 1.0.10+ e langgraph-checkpoint 4.0.0+. E restringir filter keys em get_state_history() — nunca passe input do usuário diretamente como chaves de filtro.
A infraestrutura que dá memória ao agente dá persistência ao atacante
O que o ecossistema de supply chain de IA já mostrou repetidamente agora se repete na camada de persistência do agente. A infraestrutura que dá ao agente memória e continuidade é a mesma que dá ao atacante persistência e execução.
Na Tech86, operamos com a premissa de que cada camada de infraestrutura que adiciona funcionalidade ao agente adiciona também superfície de ataque. Monitoramento contínuo, isolamento de rede e patches aplicados não são opcionais — são o mínimo. É por isso que nosso EDR monitora endpoints de IA em tempo real, detectando padrões de exploração antes que a cadeia se complete.
