Skip to main content

LangGraph Checkpoint Stores CVE-2026-115883

| EUVDEUVD-2026-109182 MEDIUM
Improper Input Validation (CWE-20)
2026-10-23 GitHub_M GHSA-6hmw-9432-67qq
6.0
CVSS 4.0 · Vendor: GitHub_M
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Access store as low-privileged authenticated tenant
  2. Exploit
    Pass namespace label containing '.' into unvalidated method
  3. Execution
    Label flattens via '.'.join to victim namespace
  4. Impact
    Read, 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.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
Patch available 0.4% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – 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

langgraph-checkpoint-postgres < 3.1.3
langgraph-checkpoint-sqlite < 3.1.2
langgraph < 1.2.15

Affected Packages

pypi langgraph-checkpoint-postgres fix: 3.1.3
pypi langgraph-checkpoint-sqlite fix: 3.1.2
euvd langgraph fix: 1.2.15

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

Vendor (GitHub_M) PRIMARY 6.0 MEDIUM
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
vuln.today AI 7.1 HIGH

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.

3.1 AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:L/A:N
4.0 AV:N/AC:L/AT:P/PR:L/UI:N/VC:H/VI:L/VA:N/SC:N/SI:N/SA:N

Primary rating from Vendor (GitHub_M).

CVSS VectorVendor: GitHub_M

Attack Vector
Network
Attack Complexity
Low
Attack Requirements
Present
Privileges Required
Low
User Interaction
None
Vulnerable system: Confidentiality
High
Vulnerable system: Integrity
Low
Vulnerable system: Availability
None
Subsequent system: Confidentiality
None
Subsequent system: Integrity
None
Subsequent system: Availability
None

Lifecycle Timeline

1
Patch available
Oct 23, 2026 - 22:03 EUVD

DescriptionCVE.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
† from your stack dependencies † transitive graph · vuln.today resolves 4-path depth
  • 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

EPSS Score
0.4%
Top 65% exploitable
Prevalence
Medium
popular LLM-agent framework; Postgres/SQLite store add-ons not universally deployed
Threat Intel
1
1 source
Social Media
1
Sightings
Data Quality
5 sources
Confidence: Medium

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.

SignalValue
Severity MEDIUM
CISA KEV No
Public POC No
EPSS 0.4%
Patch available Yes
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation
None
System Exposure· derived
Open
Automatable
No
Human Impact· derived
Medium
Technical Impact
Partial

Priority Score

30
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +30
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy