GCVE Workshop - 22 September 2026 (14:00-18:00), Luxembourg Before The Vulnopticon Conference - Registration

PYSEC-2026-3858

Vulnerability from pysec - Published: 2026-09-10 09:44 - Updated: 2026-09-10 11:02
VLAI
Details

Summary

In affected versions of langgraph-api (the LangGraph Server runtime), the run-creation path authorized the assistant attached to a run using a different authorization event than the rest of the assistant-handling code paths. Direct assistant reads and cron creation dispatch the assistants.read authorization event; run creation dispatched assistants.search with an incomplete value. In deployments whose custom authorization handlers register only an assistants.read handler (without an assistants.search handler and without a global fallback handler), no handler was consulted on the run-creation path, the returned filter set was empty, and the owner constraint was omitted from the resulting query.

As a result, in those deployments a request to create a run could reference a private assistant owned by another user, even where direct assistant reads, assistant search, and cron creation against that assistant were correctly denied. The run-creation response merged the referenced assistant's metadata, config, and context into fields returned to the requesting user. These fields can carry sensitive configuration; the runtime encrypts them at rest for that reason.

We have no evidence of this behavior occurring in the wild.

Affected users / systems

You may be affected if you:

  • run langgraph-api (the LangGraph Server / Agent Server runtime, including via the LangGraph Platform Helm chart), and
  • use custom authorization handlers that gate assistant access through an assistants.read or assistants.search handler rather than a global handler covering all assistant events.

Deployments without custom authorization handlers, or whose handlers apply an equivalent owner filter across all assistant events (for example through a global handler), are not affected.

Impact

  • Confidentiality: exposure of another user's private assistant metadata, config, and context through the run-creation response. These fields can contain sensitive configuration.
  • Integrity: creation of a run associated with another user's private assistant, beyond the requesting user's authorization scope; the run is then carried out using that assistant's configuration.

Patches / mitigation

Run creation, and the parallel cron-creation path, now dispatch the assistants.read authorization event in both the in-memory and gRPC/Postgres runtimes, matching direct assistant reads. Client-supplied run and cron metadata is no longer forwarded into that authorization event, so handlers receive a consistent value shape and determine access by returning an owner filter that is applied server-side. Fixed in langgraph-api 0.10.0.

This is a behavioral change for deployments with custom authorization handlers:

  • Handlers that gated assistant access only through assistants.search during run creation are no longer consulted on that path; provide an equivalent assistants.read handler that returns the same owner filter.
  • The metadata field on the assistants.read event during run and cron creation is no longer populated; handlers that read or stamped it should move that logic into the run/cron create handlers.

Operational guidance

  • Register an assistants.read handler (or a global handler covering it) that returns an owner-style filter, and confirm parity across the assistant read, search, and run/cron creation paths.
  • Upgrade to a release containing this change.
Impacted products
Name purl
langgraph-api pkg:pypi/langgraph-api

{
  "affected": [
    {
      "package": {
        "ecosystem": "PyPI",
        "name": "langgraph-api",
        "purl": "pkg:pypi/langgraph-api"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "0"
            },
            {
              "fixed": "0.10.0"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ],
      "versions": [
        "0.0.1",
        "0.0.10",
        "0.0.11",
        "0.0.12",
        "0.0.13",
        "0.0.14",
        "0.0.15",
        "0.0.16",
        "0.0.17",
        "0.0.18",
        "0.0.19",
        "0.0.2",
        "0.0.20",
        "0.0.21",
        "0.0.22",
        "0.0.23",
        "0.0.24",
        "0.0.25",
        "0.0.26",
        "0.0.27",
        "0.0.28",
        "0.0.28rc1",
        "0.0.3",
        "0.0.30",
        "0.0.31",
        "0.0.32",
        "0.0.33",
        "0.0.34",
        "0.0.36",
        "0.0.37",
        "0.0.38",
        "0.0.39",
        "0.0.4",
        "0.0.40",
        "0.0.41",
        "0.0.42",
        "0.0.43",
        "0.0.44",
        "0.0.45",
        "0.0.46",
        "0.0.47",
        "0.0.48",
        "0.0.5",
        "0.0.6",
        "0.0.7",
        "0.0.8",
        "0.0.9",
        "0.1.0",
        "0.1.12",
        "0.1.13",
        "0.1.14",
        "0.1.15",
        "0.1.16",
        "0.1.17",
        "0.1.18",
        "0.1.2",
        "0.1.20",
        "0.1.21",
        "0.1.22",
        "0.1.23",
        "0.1.3",
        "0.1.4",
        "0.1.5",
        "0.1.6",
        "0.1.7",
        "0.1.8",
        "0.1.9",
        "0.10.0rc1",
        "0.10.0rc2",
        "0.10.0rc3",
        "0.2.0",
        "0.2.1",
        "0.2.10",
        "0.2.100",
        "0.2.102",
        "0.2.108",
        "0.2.109",
        "0.2.11",
        "0.2.110",
        "0.2.111",
        "0.2.113",
        "0.2.114",
        "0.2.115",
        "0.2.117",
        "0.2.12",
        "0.2.120",
        "0.2.123",
        "0.2.124",
        "0.2.125",
        "0.2.126",
        "0.2.128",
        "0.2.129",
        "0.2.13",
        "0.2.130",
        "0.2.132",
        "0.2.134",
        "0.2.135",
        "0.2.137",
        "0.2.14",
        "0.2.15",
        "0.2.16",
        "0.2.17",
        "0.2.18",
        "0.2.19",
        "0.2.2",
        "0.2.20",
        "0.2.21",
        "0.2.23",
        "0.2.24",
        "0.2.25",
        "0.2.26",
        "0.2.27",
        "0.2.28",
        "0.2.29",
        "0.2.3",
        "0.2.30",
        "0.2.32",
        "0.2.34",
        "0.2.35",
        "0.2.36",
        "0.2.37",
        "0.2.38",
        "0.2.39",
        "0.2.4",
        "0.2.40",
        "0.2.42",
        "0.2.43",
        "0.2.44",
        "0.2.45",
        "0.2.46",
        "0.2.48",
        "0.2.5",
        "0.2.51",
        "0.2.54",
        "0.2.56",
        "0.2.6",
        "0.2.60",
        "0.2.61",
        "0.2.63",
        "0.2.64",
        "0.2.66",
        "0.2.67",
        "0.2.68",
        "0.2.69",
        "0.2.7",
        "0.2.70",
        "0.2.71",
        "0.2.72",
        "0.2.75",
        "0.2.76",
        "0.2.77",
        "0.2.78",
        "0.2.8",
        "0.2.83",
        "0.2.85",
        "0.2.86",
        "0.2.88",
        "0.2.89",
        "0.2.9",
        "0.2.92",
        "0.2.94",
        "0.2.95",
        "0.2.96",
        "0.2.97",
        "0.2.98",
        "0.2.99",
        "0.3.0",
        "0.3.1",
        "0.3.4",
        "0.4.0",
        "0.4.1",
        "0.4.11",
        "0.4.14",
        "0.4.15",
        "0.4.16",
        "0.4.17",
        "0.4.18",
        "0.4.19",
        "0.4.20",
        "0.4.21",
        "0.4.22",
        "0.4.23",
        "0.4.24",
        "0.4.25",
        "0.4.26",
        "0.4.27",
        "0.4.28",
        "0.4.29",
        "0.4.30",
        "0.4.31",
        "0.4.32",
        "0.4.33",
        "0.4.34",
        "0.4.35",
        "0.4.36",
        "0.4.37",
        "0.4.38",
        "0.4.39",
        "0.4.40",
        "0.4.41",
        "0.4.42",
        "0.4.43",
        "0.4.44",
        "0.4.45",
        "0.4.46",
        "0.4.47",
        "0.4.48",
        "0.4.7",
        "0.4.9",
        "0.5.0",
        "0.5.1",
        "0.5.10",
        "0.5.11",
        "0.5.12",
        "0.5.13",
        "0.5.14",
        "0.5.15",
        "0.5.16",
        "0.5.17",
        "0.5.18",
        "0.5.19",
        "0.5.2",
        "0.5.20",
        "0.5.21",
        "0.5.22",
        "0.5.23",
        "0.5.24",
        "0.5.25",
        "0.5.26",
        "0.5.27",
        "0.5.28",
        "0.5.29",
        "0.5.3",
        "0.5.30",
        "0.5.31",
        "0.5.32",
        "0.5.33",
        "0.5.34",
        "0.5.35",
        "0.5.36",
        "0.5.37",
        "0.5.38",
        "0.5.39",
        "0.5.4",
        "0.5.40",
        "0.5.41",
        "0.5.42",
        "0.5.5",
        "0.5.6",
        "0.5.7",
        "0.5.8",
        "0.5.9",
        "0.6.0",
        "0.6.1",
        "0.6.10",
        "0.6.11",
        "0.6.12",
        "0.6.13",
        "0.6.14",
        "0.6.15",
        "0.6.16",
        "0.6.17",
        "0.6.18",
        "0.6.19",
        "0.6.2",
        "0.6.20",
        "0.6.21",
        "0.6.22",
        "0.6.23",
        "0.6.24",
        "0.6.25",
        "0.6.26",
        "0.6.27",
        "0.6.28",
        "0.6.29",
        "0.6.3",
        "0.6.30",
        "0.6.31",
        "0.6.32",
        "0.6.33",
        "0.6.34",
        "0.6.35",
        "0.6.36",
        "0.6.37",
        "0.6.38",
        "0.6.39",
        "0.6.4",
        "0.6.5",
        "0.6.6",
        "0.6.7",
        "0.6.8",
        "0.6.9",
        "0.7.0",
        "0.7.1",
        "0.7.100",
        "0.7.101",
        "0.7.102",
        "0.7.103",
        "0.7.12",
        "0.7.13",
        "0.7.14",
        "0.7.15",
        "0.7.16",
        "0.7.17",
        "0.7.18",
        "0.7.19",
        "0.7.2",
        "0.7.21",
        "0.7.22",
        "0.7.23",
        "0.7.24",
        "0.7.25",
        "0.7.26",
        "0.7.27",
        "0.7.28",
        "0.7.29",
        "0.7.3",
        "0.7.30",
        "0.7.31",
        "0.7.32",
        "0.7.33",
        "0.7.34",
        "0.7.35",
        "0.7.36",
        "0.7.37",
        "0.7.38",
        "0.7.39",
        "0.7.4",
        "0.7.40",
        "0.7.41",
        "0.7.42",
        "0.7.43",
        "0.7.44",
        "0.7.45",
        "0.7.46",
        "0.7.47",
        "0.7.48",
        "0.7.49",
        "0.7.5",
        "0.7.50",
        "0.7.51",
        "0.7.52",
        "0.7.53",
        "0.7.54",
        "0.7.55",
        "0.7.56",
        "0.7.57",
        "0.7.58",
        "0.7.59",
        "0.7.6",
        "0.7.60",
        "0.7.61",
        "0.7.62",
        "0.7.63",
        "0.7.64",
        "0.7.65",
        "0.7.66",
        "0.7.67",
        "0.7.68",
        "0.7.69",
        "0.7.7",
        "0.7.70",
        "0.7.71",
        "0.7.72",
        "0.7.73",
        "0.7.74",
        "0.7.75",
        "0.7.76",
        "0.7.77",
        "0.7.78",
        "0.7.79",
        "0.7.8",
        "0.7.80",
        "0.7.81",
        "0.7.82",
        "0.7.83",
        "0.7.84",
        "0.7.85",
        "0.7.86",
        "0.7.87",
        "0.7.88",
        "0.7.89",
        "0.7.9",
        "0.7.90",
        "0.7.91",
        "0.7.92",
        "0.7.93",
        "0.7.94",
        "0.7.95",
        "0.7.96",
        "0.7.97",
        "0.7.98",
        "0.7.99",
        "0.8.0",
        "0.8.1",
        "0.8.2",
        "0.8.3",
        "0.8.4",
        "0.8.5",
        "0.8.6",
        "0.8.7",
        "0.9.0",
        "0.9.0.dev1",
        "0.9.0.dev2",
        "0.9.0.dev3",
        "0.9.0.dev4",
        "0.9.0.dev5",
        "0.9.0.dev6",
        "0.9.0rc1",
        "0.9.1"
      ]
    }
  ],
  "aliases": [
    "CVE-2026-55236",
    "GHSA-jfj5-wrj9-63x4"
  ],
  "details": "## Summary\n\nIn affected versions of `langgraph-api` (the LangGraph Server runtime), the run-creation path authorized the assistant attached to a run using a different authorization event than the rest of the assistant-handling code paths. Direct assistant reads and cron creation dispatch the `assistants.read` authorization event; run creation dispatched `assistants.search` with an incomplete value. In deployments whose custom authorization handlers register only an `assistants.read` handler (without an `assistants.search` handler and without a global fallback handler), no handler was consulted on the run-creation path, the returned filter set was empty, and the owner constraint was omitted from the resulting query.\n\nAs a result, in those deployments a request to create a run could reference a private assistant owned by another user, even where direct assistant reads, assistant search, and cron creation against that assistant were correctly denied. The run-creation response merged the referenced assistant\u0027s `metadata`, `config`, and `context` into fields returned to the requesting user. These fields can carry sensitive configuration; the runtime encrypts them at rest for that reason.\n\nWe have no evidence of this behavior occurring in the wild.\n\n## Affected users / systems\n\nYou may be affected if you:\n\n- run `langgraph-api` (the LangGraph Server / Agent Server runtime, including via the LangGraph Platform Helm chart), and\n- use custom authorization handlers that gate assistant access through an `assistants.read` or `assistants.search` handler rather than a global handler covering all assistant events.\n\nDeployments without custom authorization handlers, or whose handlers apply an equivalent owner filter across all assistant events (for example through a global handler), are not affected.\n\n## Impact\n\n- Confidentiality: exposure of another user\u0027s private assistant `metadata`, `config`, and `context` through the run-creation response. These fields can contain sensitive configuration.\n- Integrity: creation of a run associated with another user\u0027s private assistant, beyond the requesting user\u0027s authorization scope; the run is then carried out using that assistant\u0027s configuration.\n\n## Patches / mitigation\n\nRun creation, and the parallel cron-creation path, now dispatch the `assistants.read` authorization event in both the in-memory and gRPC/Postgres runtimes, matching direct assistant reads. Client-supplied run and cron metadata is no longer forwarded into that authorization event, so handlers receive a consistent value shape and determine access by returning an owner filter that is applied server-side. Fixed in `langgraph-api` 0.10.0.\n\nThis is a behavioral change for deployments with custom authorization handlers:\n\n- Handlers that gated assistant access only through `assistants.search` during run creation are no longer consulted on that path; provide an equivalent `assistants.read` handler that returns the same owner filter.\n- The metadata field on the `assistants.read` event during run and cron creation is no longer populated; handlers that read or stamped it should move that logic into the run/cron create handlers.\n\n## Operational guidance\n\n- Register an `assistants.read` handler (or a global handler covering it) that returns an owner-style filter, and confirm parity across the assistant read, search, and run/cron creation paths.\n- Upgrade to a release containing this change.",
  "id": "PYSEC-2026-3858",
  "modified": "2026-09-10T11:02:12.014480Z",
  "published": "2026-09-10T09:44:51.663830Z",
  "references": [
    {
      "type": "WEB",
      "url": "https://github.com/langchain-ai/helm/security/advisories/GHSA-jfj5-wrj9-63x4"
    },
    {
      "type": "PACKAGE",
      "url": "https://github.com/langchain-ai/helm"
    },
    {
      "type": "PACKAGE",
      "url": "https://pypi.org/project/langgraph-api"
    },
    {
      "type": "ADVISORY",
      "url": "https://github.com/advisories/GHSA-jfj5-wrj9-63x4"
    },
    {
      "type": "ADVISORY",
      "url": "https://nvd.nist.gov/vuln/detail/CVE-2026-55236"
    }
  ],
  "severity": [
    {
      "score": "CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:L/A:N",
      "type": "CVSS_V3"
    }
  ],
  "summary": "langgraph-api: Incomplete assistant authorization in LangGraph Server run creation"
}



Log in or create an account to share your comment.




Tags
Taxonomy of the tags.


Loading…

Loading…

Loading…

Forecast uses a logistic model when the trend is rising, or an exponential decay model when the trend is falling. Fitted via linearized least squares.

Sightings

Author Source Type Date Other

Nomenclature

  • Seen: The vulnerability was mentioned, discussed, or observed by the user.
  • Confirmed: The vulnerability has been validated from an analyst's perspective.
  • Published Proof of Concept: A public proof of concept is available for this vulnerability.
  • Exploited: The vulnerability was observed as exploited by the user who reported the sighting.
  • Patched: The vulnerability was observed as successfully patched by the user who reported the sighting.
  • Not exploited: The vulnerability was not observed as exploited by the user who reported the sighting.
  • Not confirmed: The user expressed doubt about the validity of the vulnerability.
  • Not patched: The vulnerability was not observed as successfully patched by the user who reported the sighting.

Loading…

Detection rules are retrieved from Rulezet.

Loading…

Loading…

Loading…