flawopen.com/AI Security/langroid-neo4j-cypher-injection-cve-2026-55615
Langroid CVE-2026-55615: injeção prompt-to-Cypher
Langroid enviava Cypher do modelo ao Neo4j sem validação. Atualize para 0.65.5; as permissões do banco seguem sendo a fronteira de segurança.[1], [2], [4]
Uma bibliotecária recebe uma pergunta em linguagem comum e entrega as instruções de banco resultantes diretamente a um funcionário poderoso. Se uma nota maliciosa alterar a pergunta, ele ainda executa as instruções. A CVE-2026-55615 permitia que conteúdo não confiável influenciasse o Cypher enviado ao Neo4j pelo Langroid.[1]
Conceitos Centrais e Termos
Cypher- Linguagem de consulta do Neo4j para ler e alterar dados em grafo. Procedimentos adicionais dependem da configuração do servidor e das permissões da conta.[1]
Neo4jChatAgent- Agente Langroid que converte tarefas em linguagem natural em Cypher e o envia ao Neo4j por ferramentas de leitura ou criação.[1], [3]
Prompt injection- Entrada não confiável altera o comportamento do modelo. Consultas criadas pelo modelo precisam ser tratadas como entrada não confiável.[1]
Least-privilege database role- Identidade do banco limitada aos dados e operações necessários. Essa fronteira continua necessária mesmo quando há validação na aplicação.[1], [5]
Validador de consultas Cypher- O validador do Langroid 0.65.5 aplica verificações por palavras-chave e padrões. A documentação alerta que essas verificações podem ser contornadas; são defesa em profundidade, não a fronteira de autorização. Controle o acesso com as permissões de papéis do Neo4j.[6], [3]
Mapeamentos de frameworks
- Referência CWE para a fraqueza descrita neste guia: CWE-74
Fluxo de Ataque Passo a Paso
O conteúdo influencia o Cypher enviado pelo agente
Na versão vulnerável, cypher_retrieval_tool encaminha msg.cypher_query a read_query e cypher_creation_tool envia a consulta a write_query. O advisory rastreia esses valores até session.run(query, parameters) e tx.run(query, parameters), sem validação intermediária.[1], [3]
As permissões do banco definem o impacto imediato
A ferramenta de leitura pode revelar dados disponíveis para a conta conectada; a ferramenta de criação pode alterar ou excluir dados dentro das permissões dessa conta. LOAD CSV também permite buscar dados remotos. Acesso a arquivos ou comandos no host depende de procedimentos habilitados e permissões concedidas.[1]
A versão 0.65.5 adiciona validações nas ferramentas
A resolução do mantenedor diz que a 0.65.5 adiciona allow_dangerous_operations desativado por padrão, limita a leitura a consultas somente leitura e verifica primitivas selecionadas nas ferramentas. São defesas em profundidade, não autorização. A resolução do mantenedor e a orientação do Langroid para agentes SQL apontam para papéis de banco com privilégio mínimo como fronteira de segurança.[1], [3], [4], [5]
Código-Fonte: Vulnerável vs. Seguro
O trecho vulnerável segue o caminho do advisory; o exemplo corrigido representa o comportamento da versão 0.65.5 e não reproduz literalmente o patch. A correção valida na fronteira da ferramenta, restringe a leitura e controla operações perigosas. O validador não é sandbox: limite permissões no Neo4j e isole o processo do agente. A documentação do Langroid diz que essas verificações por palavras-chave e padrões podem ser contornadas; mantenha as permissões do Neo4j como fronteira de controle.[1], [3], [4], [6]
# Caminho vulnerável de Neo4jChatAgent (Langroid <= 0.65.4).
def cypher_retrieval_tool(self, msg: CypherRetrievalTool):
query = msg.cypher_query
return self.read_query(query)
def read_query(self, query: str):
with self.driver.session() as session:
return session.run(query, parameters=None)
# Comportamento da versão 0.65.5: validar na fronteira da ferramenta exposta ao LLM.
def cypher_retrieval_tool(self, msg: CypherRetrievalTool):
query = msg.cypher_query
rejection = validate_cypher_query(
query, is_write=False,
allow_dangerous=self.config.allow_dangerous_operations,
)
if rejection is not None:
return rejection
return self.read_query(query)
Lista de Verificação de Segurança para Engenharia
- ✓Inventarie instalações Langroid e lockfiles; atualize ambientes afetados para 0.65.5 ou superior e reconstrua as imagens.[1], [4]
- ✓Mantenha
allow_dangerous_operations=False, salvo necessidade revisada e documentada.[1], [4] - ✓Use uma conta Neo4j exclusiva para cada agente e conceda apenas os rótulos, dados, operações e procedimentos necessários.[1], [5]
- ✓Desative APOC, dbms.security, LOAD CSV e recursos de arquivo/rede/SO que a aplicação não usa; confira as permissões efetivas.[1]
- ✓Mantenha ferramentas de leitura somente leitura e exija autorização separada para gravações importantes.[1], [4]
- ✓Teste a leitura normal e confirme que uma consulta inofensiva de teste de política é bloqueada antes da chamada ao driver.[3], [4]
- ✓Restrinja acesso do host do agente a arquivos, segredos e rede.[1]
- ✓Revise logs do banco e rastros do agente no período vulnerável; troque credenciais se puderem ter sido expostas.