De SQLi a RCE: explorando o checkpointer do LangGraph
Aprofundamento CEVIU
Aprofundamento
A Check Point Research expôs uma cadeia de exploração realista que transforma uma simples injeção SQL em RCE, sem necessidade de comprometer o banco de dados primeiro. O vetor crítico é a exposição não intencional do método get_state_history(), comum em aplicações que exibem histórico de conversas ou estados de agentes para usuários finais. Quando esse endpoint aceita filtros como {'metadata.user_id': '123'} e passa diretamente para _metadata_predicate(), o atacante substitui '123' por '123' UNION SELECT X'...', NULL, NULL, NULL, NULL --. O SQLite executa a consulta injetada, devolve um blob falso contendo msgpack malicioso, e o LangGraph desserializa sem restrição, ativando os.system() no processo.
O ponto fraco técnico não está só na falta de parametrização: é na arquitetura de confiança implícita. O framework assume que os dados retornados pelo checkpointer são sempre legítimos, mesmo quando provenientes de uma consulta manipulada. A CVE-2026-28277 não é um bug isolado de desserialização, é uma falha de design que permite que qualquer código Python seja reconstruído via _msgpack_ext_hook, incluindo módulos do sistema. O modo estrito (LANGGRAPH_STRICT_MSGPACK=1) existe desde março de 2026, mas não é ativado por padrão, e poucos desenvolvedores sabem que ele bloqueia até mesmo datetime e UUID se não forem explicitamente permitidos na allowlist.
Por que isso importa
LangGraph não é um experimento acadêmico: é a camada de estado por trás de centenas de sistemas de IA empresarial em produção, desde assistentes bancários até fluxos de atendimento governamental. Um único endpoint mal configurado com get_state_history() pode expor toda a infraestrutura ao controle remoto. Diferente de RCE tradicional, aqui o ataque ocorre dentro do ciclo normal de execução do agente, burlando WAFs que não inspecionam payloads binários em colunas BLOB. E pior: o patch da CVE-2025-67644 (lançado em dezembro de 2025) resolve apenas a injeção inicial, mas se uma aplicação ainda usa langgraph 1.0.9 ou inferior, o payload msgpack injetado via SQL continua sendo executado sem restrição. Isso significa que atualizar só o checkpointer não é suficiente: é preciso atualizar o core do LangGraph também.
Perguntas frequentes
O LangSmith é afetado por essa cadeia de vulnerabilidades?
Não. O LangSmith é um serviço gerenciado pela LangChain e não utiliza os checkpointers vulneráveis em sua arquitetura interna. As falhas impactam apenas implementações auto-hospedadas que usam langgraph-checkpoint-sqlite, langgraph-checkpoint-redis ou langgraph em versões antigas.
Como saber se minha aplicação está exposta ao <code>get_state_history()</code>?
Verifique se há rotas públicas ou APIs que chamam app.get_state_history() ou checkpointer.list() com parâmetros dinâmicos vindos de requisições HTTP. Se o filtro é construído a partir de request.args, request.json ou headers, e não é validado contra um esquema rígido, a exposição existe.
O que acontece se eu usar apenas PostgreSQL como checkpointer?
A CVE-2025-67644 foi confirmada apenas no SQLite e Redis. Mas a pesquisa da Check Point identificou problemas similares de concatenação direta de parâmetros (como LIMIT e ttl) também no PostgreSQL checkpointer. Embora não tenham sido explorados publicamente, o risco de injeção persiste se a aplicação não usar consultas parametrizadas em todas as camadas.
Posso desativar a desserialização de msgpack inteiramente?
Sim, mas com trade-offs. Definir LANGGRAPH_STRICT_MSGPACK=1 força o uso de uma allowlist pré-definida de tipos seguros. Se seu agente depende de objetos personalizados serializados com extensões msgpack, você precisará registrá-los manualmente via register_msgpack_ext_type(). Caso contrário, a desserialização falhará com ValueError.
Fontes
- research.checkpoint.comfonte original
- Categoria
- CEVIU Segurança da Informação
- Publicado
- 15 de junho de 2026
- Editoria
- CEVIU Segurança da Informação
