Advisories
Security vulnerabilities, privacy incidents, safety concerns, and policy updates affecting LLMs and AI agents.
Security vulnerabilities, privacy incidents, safety concerns, and policy updates affecting LLMs and AI agents.
86 items
`langgraph deploy --verbose` in `langgraph-cli` 0.4.15 through 0.4.31 printed the temporary registry push token that the CLI passes to `docker login --password-stdin`. Anyone who could read that output, such as CI logs, could use the token for up to 12 hours, limited to the deployment's image repository, to pull images and push new ones.
Fix: Upgrade to `langgraph-cli` 0.4.32 or later. 0.4.37 also stops `--verbose` from printing the input of any command the CLI runs. Tokens printed more than 12 hours ago have expired.
GitHub Advisory DatabaseLangGraph deployments using JavaScript or TypeScript custom authentication may fail to apply Store authorization changes returned by an authorization handler. An authenticated user may then read, overwrite, search, or delete another user's Store data, provided the handler relies on namespace rewriting and multiple users' data is stored through that path.
Fix: Fixed in langgraph-api version 0.15.0; users should upgrade to langgraph-api>=0.15.0. Deployments that cannot upgrade immediately should change JavaScript or TypeScript Store authorization handlers to reject requests for unauthorized namespaces rather than rewriting them, applied to every Store action the deployment exposes.
The LangGraph Python SDK v3 streaming client, in `langgraph-sdk` versions 0.4.0 through 0.4.5, inserts caller-supplied `thread_id` and `assistant_id` values into request paths without encoding them, in the `get_tree` and `_fetch_state` implementations. Relative path segments in these values can redirect an authenticated GET request to another readable path on the configured server, and the SDK returns that response to the application. `RemoteGraph` v3 streaming in `langgraph` 1.2.3 and later is also affected when it pairs with a vulnerable SDK version.
The Postgres and SQLite stores in LangGraph joined namespace labels with `.`, so a label containing a dot, such as `("tenant.bob",)`, mapped to the same stored namespace as `("tenant", "bob")`. Although `put` rejected such labels, `get`, `search`, `delete`, `list_namespaces`, their async versions, and ops passed to `batch`/`abatch` did not, letting a caller read, overwrite or delete items in another namespace. All releases of `langgraph-checkpoint-postgres` before 3.1.3 and `langgraph-checkpoint-sqlite` before 3.1.2 are affected, while `InMemoryStore` is not.
A vulnerability has been found in BerriAI LiteLLM up to 1.94.0, in the get_secret function of secret_managers/main.py within the Secret Resolution component. Manipulating the api_key argument leads to improper authorization, and the attack can be initiated remotely. The exploit is public and may be used, and the vendor did not respond after early contact.
LangChain versions before 1.3.1 let MongoDBChatMessageHistory accept an untrusted structured session identifier without enforcing the documented string type. When several users' histories share one MongoDB collection, the identifier is interpreted as a MongoDB query condition instead of a literal value. An attacker who can invoke chat-history operations can read, modify, or delete another user's conversation. Applications that use authenticated, server-controlled string identifiers are not affected.
Fixed in version 1.3.1.
`@langchain/redis` versions through 1.1.0 did not properly escape values used to build structured RediSearch TAG and TEXT filters. An attacker who controls values passed into these filters can inject RediSearch syntax, altering or broadening the search query and potentially exposing indexed documents outside their intended scope where the filter serves as a tenant or document-access boundary.
Fix: Upgrade to `@langchain/redis` 1.1.1 or later.
langgraph-sdk applies the actions= argument incorrectly on resource-scoped authorization decorators, including @auth.on.threads, @auth.on.assistants, and @auth.on.crons. A handler meant for selected actions is instead registered for every action on the resource, so broader fallback handlers that carry authorization checks may not run. Only Python deployments using actions= on these decorators are affected.
Fix: Patched in 0.4.4. No workaround is documented.
SitemapLoader.parse_sitemap in langchain_community/document_loaders/sitemap.py applies restrict_to_same_domain only to leaf url entries, not to nested sitemap entries, which are passed directly to self.scrape_all([loc.text], "xml") and fetched with an aiohttp GET. An attacker who controls or influences an ingested sitemap can point a nested entry at an internal address, so the server fetches it even when restrict_to_same_domain is True, and the response is returned in the Documents.
A NoSQL injection flaw in langgraph-checkpoint-mongodb and langgraph-store-mongodb lets a caller who controls the filter argument embed MongoDB query operators, because keys prefixed with $ are not rejected. The affected methods are MongoDBSaver.list(), MongoDBSaver.alist() and MongoDBStore.search(), and the advisory rates the issue High (CVSS 4.0 base 7.1, CVSS 3.1 base 7.7), with cross-tenant read exposure of checkpoint data.
Upgrade langgraph-checkpoint-mongodb to 0.3.0 or later and langgraph-store-mongodb to 0.4.0 or later. If an upgrade is not possible immediately, remove or escape MongoDB query metacharacters such as "$" from user-controlled input before passing it to the filter parameter.
In affected versions of `langgraph-api`, run creation checked assistant authorization with an incomplete `assistants.search` event rather than `assistants.read`. In deployments whose custom handlers register only an `assistants.read` handler, no handler ran on that path and the owner constraint was dropped, so a run could reference another user's private assistant. The response then returned that assistant's `metadata`, `config` and `context`. The source reports no evidence of exploitation in the wild.
Fixed in `langgraph-api` 0.10.0. Run and cron creation now dispatch the `assistants.read` event, and client-supplied metadata is no longer forwarded into it. Deployments with custom handlers should register an `assistants.read` handler (or a global handler) that returns an owner-style filter, confirm parity across the read, search and run/cron creation paths, and move any logic that read or stamped the metadata field on that event into the run/cron create handlers.
In affected versions of langgraph-api (the LangGraph Server runtime), a run or cron created with a relative webhook target was delivered through an in-process loopback transport that the authentication middleware treats as internal and does not authenticate. This let such requests reach thread and run routes without the usual authentication context, so in deployments that scope data by owner, one user could create a run on or modify another user's thread, and limited thread metadata could appear in the created run record.
The Postgres and SQLite stores in LangGraph matched scoped namespace reads with LIKE on a dot-joined string, so a scoped search or list_namespaces could also return items from sibling namespaces that share leading characters, such as foo and foobar. Namespace labels containing _ or % were also interpreted as pattern metacharacters, letting user_1 match userX1, and the list_namespaces suffix condition could match sibling leaves like users.malice. The flaw is a confidentiality issue in read paths only where namespaces serve as a tenant or user boundary, and the source reports no evidence of exploitation in the wild.
CVE-2026-59822 affects LiteLLM versions prior to 1.84.0. An unauthenticated attacker could send a fabricated Authorization header to the MCP Streamable HTTP endpoint, triggering an OAuth2 passthrough fallback that replaces failed key validation with an empty UserAPIKeyAuth() object. This lets requests reach MCP tooling without a valid LiteLLM key. The GitHub-assigned CVSS 4.0 base score is 8.8 (HIGH), and CWE-287 and CWE-306 are listed.
A flaw was found in langchain-ai langgraph up to 1.2.4. The _freeze function in libs/langgraph/langgraph/_internal/_cache.py, part of the Task Result Cache component, uses a weak hash when handling the default_cache_key argument. The attack can be carried out remotely, but its complexity is rather high and exploitability is described as difficult. A public exploit exists.
Fix: The pull request to fix this issue awaits acceptance.
The SQLChatAgent in langroid, versions up to and including 0.63.0, uses a regex blocklist (_DANGEROUS_SQL_PATTERNS in sql_chat_agent.py) that omits PostgreSQL's pg_read_file, pg_stat_file, pg_ls_logdir, pg_ls_waldir and related functions, plus SQL Server OPENDATASOURCE and SQLite ATTACH without the DATABASE keyword. Because these payloads are ordinary SELECT statements, they pass the statement-type allowlist and reach the live engine, letting an attacker who can shape the LLM's generated SQL read arbitrary files from the PostgreSQL host, even under the default configuration.
The langgraph-sdk builds HTTP request paths by interpolating caller-supplied identifier values into URL templates without sanitization. Identifiers containing URL-special characters can address a different resource or resource type than the call site indicates, potentially exposing, modifying or deleting resources beyond the caller's authorization scope.
Fix: The SDK now applies path-segment encoding to identifier values before interpolation into request URL templates. Applications should also validate identifier values (typically as UUIDs) at the boundary where untrusted input enters the application, before passing them to SDK methods.
LangGraph's JsonPlusSerializer can reconstruct Python objects from JSON checkpoint payloads, so an attacker with write access to checkpoint bytes at rest could potentially trigger code execution at checkpoint load time. The issue is classed as defense-in-depth: it is reachable only when an unauthorized party can modify the checkpoint store, and the team reports no evidence of exploitation in the wild. The default serializer in PostgresSaver, SqliteSaver and their async counterparts is JsonPlusSerializer, so applications generally fall in scope without opting in.
LangChain versions prior to 1.3.9 contain several components that resolve filesystem paths or expand search patterns without confining results to the intended root directory. The file-search agent middleware validates only the starting directory, so glob patterns and symlinks can reach files outside the configured root, and prompt and agent configuration loaders accept path fields without confinement or symlink rejection. When these components receive path values or search patterns influenced by an untrusted source, including an LLM acting on untrusted input, they can disclose files outside the intended boundary.
A vulnerability in BerriAI litellm up to version 1.82.2 affects the json.dumps function in litellm/proxy/management_endpoints/ui_sso.py, part of the SSO Debug Flow component. Manipulating this component can lead to missing authentication, and the attack can be executed remotely. The exploit has been publicly disclosed and may be used, and the vendor was contacted early about the disclosure.
Fix: Upgrade `langgraph-sdk` to version 0.4.6 or later. If you use `RemoteGraph`, also upgrade `langgraph` to version 1.2.14 or later, which requires `langgraph-sdk>=0.4.6`.
Fix: Upgrade to `langgraph-checkpoint-postgres` 3.1.3 or `langgraph-checkpoint-sqlite` 3.1.2, which require `langgraph-checkpoint` 4.3.0. Stores outside this repository that turn namespaces into delimited text can call `langgraph.store.base.validate_op_namespace` for each op they run.
Fix: Fixed in langgraph-api 0.10.0, which denies loopback webhook delivery by default via the webhooks.url.disable_loopback policy (defaults to enabled), covering relative targets, localhost-style hostnames, loopback address ranges and hostnames resolving into the loopback range. Deployments needing same-process webhook delivery can set webhooks.url.disable_loopback: false in langgraph.json (or the equivalent LANGGRAPH_WEBHOOKS configuration), only when they control the routes those webhooks reach, since delivery is unauthenticated. Operational guidance: upgrade to a release containing this change, keep loopback delivery disabled unless required, and if enabled, restrict it to routes you control and apply authorization within those routes.
Fix: Upgrade to langgraph-checkpoint-postgres 3.1.1 or langgraph-checkpoint-sqlite 3.1.1. Callers relying on multi-segment * matching in list_namespaces can express it by combining prefix and suffix conditions, for example list_namespaces(prefix=["uid"], suffix=["alice"]). The source also recommends fixed-length namespace labels such as UUIDs and validating user-supplied labels at the boundary.
GitHub Advisory DatabaseFix: Fixed in 1.84.0.
NVD/CVE DatabaseFix: The JSON deserialization path has been narrowed so that revival is restricted to default-constructor reconstruction using the args/kwargs carried in the payload. Freshly written checkpoints are unaffected, and legacy payloads that used the default constructor as their first option still revive. Pre-October-2025 pydantic model checkpoints that relied on a no-validation fallback factory now return None from the revival path and surface as raw dicts. Operational guidance: restrict write access to checkpoint stores, rotate credentials if unauthorized access is suspected, and avoid custom JSON revival hooks that reconstruct arbitrary types unless checkpoint data is fully trusted.
Fix: Fixed in 1.3.9.