Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessSupply crafted thread_id/assistant_id to app
-
DeliveryApp forwards value into v3 stream helper
-
ExploitRelative segments normalized into new path
-
ExecutionSDK sends authenticated GET with its headers
-
PersistServer returns other readable resource
-
ImpactDisclosed data returned to attacker
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V5 - File Handling Path canonicalization, traversal prevention
MITRE ATT&CK
2 techniques across 2 tactics: Discovery, Collection The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Exploitation requires all of: (1) use of langgraph-sdk 0.4.0-0.4.5 (the v3 stream module does not exist in 0.3.x), or langgraph 1.2.3-1.2.13 using RemoteGraph v3 streaming against such an SDK; (2) the application must pass attacker-controlled text directly as a streaming thread_id or assistant_id (for RemoteGraph, via config['configurable']['thread_id']); and (3) the flaw is reached through the v3 get_tree (assistant_id) or _fetch_state/_run_lifecycle_watcher (thread_id) helpers. Limiting factors: impact is read-only (GET, no write), confined to paths on the already-configured and authenticated server; assistant_id controls only the path while thread_id can also influence the query string; the hosted LangGraph Platform is not exposed; and applications that do not forward untrusted identifiers are unaffected. |
| Impact | This is a genuine but modest-severity path-handling flaw, not an urgent priority. The CVSS 3.1 vector (AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N, base 4.3) and CWE-22 are consistent with the advisory: unencoded thread_id/assistant_id values interpolated into authenticated GET paths allow relative segments to redirect a request to another readable path on the same configured server, yielding limited confidentiality impact only (C:L, I:N, A:N - GET-only, no write primitive per the GHSA). No KEV listing, no EPSS score, and no exploit reference were supplied - the only code links are the fix PR/commit and the advisory, so this is no public exploit identified at time of analysis. The vuln.today decision label is this_month, aligning with the low-to-medium signals rather than emergency. The key caveat is PR:L: the 'privilege' here is really the SDK client's own configured authentication headers, while the triggering input (the malicious identifier) comes from an application-exposed attacker; the flaw only manifests if the application passes attacker-controlled text as a streaming thread_id or assistant_id, so real-world exposure depends on application design, not solely on the CVSS metrics. The managed LangGraph Platform is explicitly not exposed. |
| Exploit ScenarioDerived | An application built on langgraph/langgraph-sdk uses RemoteGraph v3 streaming and forwards untrusted user input as a thread_id or assistant_id. An attacker submits a value such as '../assistants/a/graph#' so HTTP path normalization collapses the dot-segments, redirecting the SDK's authenticated GET to a different readable endpoint (via thread_id the attacker can also control the query string, e.g. /store/items?namespace=...&key=...) and causing that response to be returned to the application. No public exploit code was supplied; only the vendor fix and tests are referenced. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 28, 2026
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 RemoteGraph v3 streaming) lets an attacker who controls a streaming thread_id or assistant_id value redirect the SDK's authenticated GET requests to a different readable path on the same configured LangGraph server, with thread_id also able to inject query parameters such as /store/items?namespace=...&key=... . Exploitation requires the application to pass attacker-controlled text directly as those identifiers; requests are GET-only, so the impact is limited to disclosure of another readable path's response (CVSS 4.3, PR:L - authenticated), and the hosted LangGraph Platform is not exposed. The vendor has released fixed versions langgraph-sdk 0.4.6 and langgraph 1.2.14, and no public exploit code was identified at time of analysis.
RemediationAI
Vendor-released patch: upgrade langgraph-sdk to 0.4.6 or later, which percent-encodes assistant_id in get_tree and thread_id in _fetch_state via _quote_path_param in both the synchronous and asynchronous stream modules (commit d89c7e100ec6fc1512544d23b0a7c5169699ef3e, PR 9213, release tag sdk==0.4.6). Applications using RemoteGraph must additionally upgrade langgraph to 1.2.14 or later, since that release pins langgraph-sdk>=0.4.6. Advisory and release references: https://github.com/langchain-ai/langgraph/security/advisories/GHSA-3fx2-cqw9-xr3c, https://github.com/langchain-ai/langgraph/releases/tag/1.2.14, https://github.com/langchain-ai/langgraph/releases/tag/sdk%3D%3D0.4.6. Deployments that cannot upgrade immediately should note that exposure only exists where an application forwards untrusted input as a streaming thread_id or assistant_id (for RemoteGraph, via config['configurable']['thread_id']); constraining those values to server-issued identifiers removes the attack path, at the cost of breaking any workflow that legitimately accepts client-supplied identifiers. No exploitation has been reported against the LangGraph Platform, which is not affected.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 2 packages in pypi
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
The flaw is CWE-22 (improper limitation of a pathname to a restricted directory) manifesting as missing percent-encoding in the SDK's v3 streaming client. Four call sites - the synchronous and asynchronous implementations of get_tree and _fetch_state (used by _run_lifecycle_watcher) - build request URLs by f-string interpolation of self._owner.assistant_id and self.thread_id instead of routing them through the SDK's existing _quote_path_param helper. Because httpx normalizes dot-segments and treats '#' as a fragment delimiter, a value such as '../assistants/a/graph#' collapses the intended '/threads/{id}/state' path into a different path, while the client's authentication headers are still attached to the outgoing request against the already-configured, trusted base URL. The v3 stream module first shipped in the 0.4.0 SDK line, so 0.3.x is unaffected; langgraph's RemoteGraph v3 streaming passes config['configurable']['thread_id'] into threads.stream(...) and its dependency range permits vulnerable SDK versions. assistant_id only influences the path, while thread_id also influences the query string, enabling targeted reads of endpoints like /store/items. The trigger is confirmed by the upstream regression tests, which assert that '../assistants/a/graph#' stays a single encoded segment.
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
AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N
Network GET redirect using the SDK client's own authentication (PR:L), easily triggered (AC:L), yielding only limited read access to other paths on the same server (C:L, I:N, A:N, scope unchanged).
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
1DescriptionCVE.org
LangGraph Python SDK is used to connect to running LangGraph API servers, manage assistants, threads and stream runs from Python applications. From langgraph-sdk 0.4.0 until 0.4.6, and from langgraph 1.2.3 until 1.2.14 when RemoteGraph v3 streaming uses an affected langgraph-sdk version, the synchronous and asynchronous v3 stream get_tree and _fetch_state helpers interpolate caller-controlled assistant_id and thread_id values into authenticated GET request paths without using _quote_path_param. Relative path segments can therefore be normalized into another readable path on the configured server while retaining authentication headers. This issue is fixed in langgraph-sdk 0.4.6 and langgraph 1.2.14.
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
Path traversal exploits occur when applications use user-controlled input to construct file system paths without proper validation.
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
Cross-namespace data exposure in the Postgres- and SQLite-backed LangGraph stores (langgraph-checkpoint-postgres before
Weak hashing in LangGraph's Task Result Cache exposes low-privilege authenticated users to hash collision attacks that c
LangGraph CLI versions 0.4.15 through 0.4.31 disclose the short-lived LangSmith registry push token in verbose output: `
EUVD-2026-112474
GHSA-3fx2-cqw9-xr3c
NVD
CVE.org
Exploit-DB