Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAccess store as low-privileged authenticated tenant
-
ExploitPass namespace label containing '.' into unvalidated method
-
ExecutionLabel flattens via '.'.join to victim namespace
-
ImpactRead, overwrite or delete another tenant's items
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V2 - Validation and Business Logic Input validation, allowlisting
|
| Exploitation Conditions | Exploitation requires ALL of: (1) use of PostgresStore, AsyncPostgresStore, SqliteStore, or AsyncSqliteStore from langgraph-checkpoint-postgres < 3.1.3 or langgraph-checkpoint-sqlite < 3.1.2 (InMemoryStore is NOT affected because it compares namespace tuples); (2) an application design that relies on namespace tuples to separate users/tenants; and (3) untrusted input being allowed to choose a namespace label that reaches get, search, delete, list_namespaces, their async equivalents, or ops passed directly to batch/abatch - note that put/aput already rejected dotted labels, so write-through-put is not the vector. The concrete trigger is a label containing '.' (e.g. ('tenant.bob',)) that dot-joins to the same stored text as ('tenant','bob'). Limiting factors: the attacker must be an authenticated low-privileged caller (PR:L) with the ability to influence namespace labels; it depends on the multi-tenant namespace-isolation usage pattern rather than a default library install; and LangSmith's HTTP store API and the Agent Server (from 0.15.5/0.16.2) already reject such labels, with LangSmith Cloud deployments fixed on next revision, so self-hosted deployments are the primary exposure. |
| Impact | This is a medium-severity, deployment-dependent tenant-isolation flaw rather than a broad remote-compromise bug. The supplied CVSS 4.0 vector (CVSS:4.0/AV:N/AC:L/AT:P/PR:L/UI:N/VC:H/VI:L/VA:N, score 6.0) tells a consistent story: network-reachable and low-complexity to trigger, but it carries AT:P (a specific attack requirement) and PR:L (the actor must already be an authenticated/low-privileged caller), which is why the score lands at medium despite VC:H. The high confidentiality impact reflects cross-tenant reads; integrity is rated low (overwrite/deletion of individual items) and availability none. No CISA KEV listing is present, so this is NOT confirmed actively exploited. No EPSS score was provided, so statistical exploitation probability cannot be weighed. No standalone exploit or PoC reference was supplied - the three references are the GitHub Security Advisory, the fix PR, and the fix commit - so the status is no public exploit identified. The vuln.today decision label is 'this_month' (not act_now/emergency), aligning with the medium technical score. No explicit SSVC decision-point values (automatable, technical impact) were provided, so that framework cannot be independently applied here. Net: real but conditional priority - genuinely dangerous ONLY where one of the affected Postgres/SQLite stores is used, namespaces are relied on to separate users/tenants, AND untrusted input can choose a namespace label reaching an unvalidated method; otherwise it is a high-impact-on-paper issue with a narrow real-world trigger. The advisory's CWE-863 (improper authorization) describes the mechanism more precisely than the NVD-assigned CWE-20. |
| Exploit ScenarioDerived | In a multi-tenant LangGraph application that uses PostgresStore or SqliteStore and relies on namespace tuples to keep tenants apart, an authenticated low-privileged user supplies a namespace label such as ('tenant.bob',). Because the store flattens namespaces with '.'.join() and these labels were not validated on get/search/delete/list_namespaces/batch, the label resolves to the victim's ('tenant','bob') namespace, letting the attacker read, overwrite, or delete another tenant's stored items. No public exploit code was identified; the mechanism is documented in the vendor advisory with concrete call examples. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 23, 2026
Cross-namespace data exposure in the Postgres- and SQLite-backed LangGraph stores (langgraph-checkpoint-postgres before 3.1.3 and langgraph-checkpoint-sqlite before 3.1.2) lets an authenticated, low-privileged caller who can influence a namespace label read, overwrite, or delete items stored under a different tenant's namespace. The stores flatten a namespace with ".".join(namespace), so a single label such as ("tenant.bob",) resolves to the same stored text as ("tenant", "bob"); only put/aput validated labels, while get, search, delete, list_namespaces, their async variants, and ops passed straight to batch/abatch accepted dotted labels unchecked. Exposure is deployment-dependent rather than universal: it requires an application that relies on namespace tuples to isolate tenants and passes untrusted input into those calls, InMemoryStore is unaffected because it compares namespace tuples, and there is no public exploit identified at time of analysis. The reported CVSS 4.0 score is 6.0, while the independent assessment rates it CVSS 3.1 AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:L/A:N.
RemediationAI
Vendor-released patch: upgrade to langgraph-checkpoint-postgres 3.1.3 and langgraph-checkpoint-sqlite 3.1.2, both of which require langgraph-checkpoint 4.3.0; that base release adds label validation to get, search, delete and list_namespaces (raising InvalidNamespaceError for empty, non-string, or dot-containing labels) and the store packages apply validate_op_namespace to every op passed to batch/abatch. Fixes are carried in https://github.com/langchain-ai/langgraph/pull/9217 and commit https://github.com/langchain-ai/langgraph/commit/bfcfea554ed5c7f7be562cebf8825e911b493ab1. On LangSmith Cloud, new deployments and revisions already include the fix and existing deployments pick it up on their next revision; self-hosted LangSmith deployments should upgrade, and Agent Server 0.15.5 or 0.16.2 and later already reject these labels at the API layer. Store implementations outside this repository that convert namespaces into delimited text should call langgraph.store.base.validate_op_namespace for each op they execute. Until the upgrade can be scheduled, avoid letting untrusted input select namespace labels at all and reject labels containing ".", noting that this application-side filtering duplicates what the patched library now enforces and will not protect call sites that forget it; because InMemoryStore compares namespace tuples it is not affected and is not a substitute for patching the persistent stores.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 3 packages in pypi, euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
LangGraph's checkpoint-saver packages provide persistent state for agent workflows, and their store layer partitions data by a namespace tuple of string labels. The Postgres and SQLite implementations persist that partition as delimited text produced by ".".join(namespace), which makes the tuple structure ambiguous once a label itself contains a dot. Input validation (CWE-20, with the advisory also classifying it as CWE-863 incorrect authorization) was applied only in BaseStore.put/aput, so the flattening collision could be reached through get, search, delete, list_namespaces, their asynchronous equivalents, and through GetOp, PutOp, SearchOp and ListNamespacesOp/MatchCondition entries supplied directly to batch/abatch, which performed no label checking at all. The result is a namespace-confusion primitive that breaks the tenant boundary the namespace was meant to enforce, yielding high confidentiality impact (reads and namespace listings across tenants) and limited integrity impact (overwrites and deletions of another tenant's items), with no availability impact assessed. The fix introduces validate_op_namespace in langgraph-checkpoint 4.3.0, which rejects labels that are empty, non-string, or contain "." by raising InvalidNamespaceError, and the two store packages apply it to every op they execute. Because labels written through put could never contain a dot, no previously stored data becomes unreachable after upgrading.
Know when Langgraph gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
CVSS:4.0/AV:N/AC:L/AT:P/PR:L/UI:N/VC:H/VI:L/VA:N/SC:N/SI:N/SA:N
Network-reachable store op with a trivially-formed dotted label (AC:L) by an authenticated low-privileged caller (PR:L); high cross-tenant read (C:H), limited item overwrite/delete (I:L), no availability loss.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
1DescriptionCVE.org
LangGraph checkpoint savers provide Postgres- and SQLite-backed state persistence for LangGraph workflows and agents. Prior to langgraph-checkpoint-postgres 3.1.3 and langgraph-checkpoint-sqlite 3.1.2, PostgresStore, AsyncPostgresStore, SqliteStore, and AsyncSqliteStore flatten namespace labels with ".".join(namespace), while BaseStore validates labels only for put and aput. Unvalidated dotted labels passed through get, search, delete, list_namespaces, their asynchronous equivalents, or direct batch and abatch operations can resolve to another tenant's stored namespace, allowing cross-namespace reads, overwrites, or deletion. InMemoryStore is not affected because it compares namespace tuples. This issue is fixed in langgraph-checkpoint-postgres 3.1.3 and langgraph-checkpoint-sqlite 3.1.2.
Blast Radius
ecosystem impact- 4 pypi packages depend on langgraph-checkpoint-postgres (3 direct, 1 indirect)
- 278 pypi packages depend on langgraph-checkpoint-sqlite (228 direct, 54 indirect)
Ecosystem-wide dependent count for version 3.1.3 and other introduced versions.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.
Incorrect authorization in the LangGraph Python SDK (langgraph-sdk) versions 0.1.45 through 0.4.3 lets an authenticated
Unsafe deserialization in LangGraph SQLite Checkpoint's JsonPlusSerializer (versions 4.1.0 and prior) allows arbitrary P
LangGraph SQLite Checkpoint versions 1.0.9 and prior are vulnerable to unsafe deserialization of msgpack-encoded objects
Weak hashing in LangGraph's Task Result Cache exposes low-privilege authenticated users to hash collision attacks that c
Path traversal in the LangGraph Python SDK (langgraph-sdk 0.4.0 through 0.4.5, and langgraph 1.2.3 through 1.2.13 via Re
LangGraph CLI versions 0.4.15 through 0.4.31 disclose the short-lived LangSmith registry push token in verbose output: `
EUVD-2026-109182
GHSA-6hmw-9432-67qq
NVD
CVE.org
EPSS
Vulnrichment
Exploit-DB