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…

Related by attack behaviour

Vulnerabilities whose description is nearest to this one in the vector space of the CIRCL/vulnerability-attack-technique-biencoder model. This is a similarity search over the bi-encoder space (plain cosine), not a classification, and it has no measured accuracy.


Loading…