Case · DiggingBeagle record

LangGraph dotted namespace serialization crossed tenant store boundaries

Two LangGraph checkpoint stores serialized namespaces with dot separators but checked dot-containing labels only on some code paths; a crafted tuple could alias another tenant namespace for reads and writes.

Scope

langgraph-checkpoint-postgres earlier than 3.1.3 and langgraph-checkpoint-sqlite earlier than 3.1.2, when untrusted input can supply namespace labels to get/search/delete/batch; in-memory store not affected.

Assessment profile

Assessment method
Setting
research demonstration
Exploitation
demonstrated
Evidence
Grade A
Remediation
patch available
AI role
AGAINST AI
Basis and provenance

CASE-2026-LANGGRAPH-DOTTED-NAMESPACE-ALIAS: GHSA-6hmw-9432-67qq shows that Postgres and SQLite stores map ("tenant", "bob") and ("tenant.bob",) to the same persisted namespace and patched different versions 3.1.3 and 3.1.2 respectively. Evidence comes from SRC-2026-LANGGRAPH-NAMESPACE-GHSA. Published technical statements or controlled results are not verified production-loss counts. No impact band is assigned because the observed outcome and its denominator do not establish a comparable severity measure.

Assessed Oct 24, 2026 using diggingbeagle.assessment/1.

At a glance

Mechanism and trust boundary

  1. 01

    Represent tenant scope as a tuple

    One application models isolation as labels such as (tenant, bob) in its checkpoint or memory store.

    Boundary: Tenant label tuple / logical isolation key

  2. 02

    Flatten the tuple into an ambiguous string

    Postgres and SQLite backends joined labels with dots, so two different tuples produced the same persisted namespace.

    Boundary: Structured namespace identity / dot-delimited key

  3. 03

    Use an unchecked lookup or batch mutation

    A caller controlling a dotted label could access or alter another namespace through reads, deletes or batch operations despite validation on normal writes.

    Boundary: Untrusted namespace selection / persistent agent memory

Timeline

  1. 2026-10 (month precision)
    Event type unspecified

    LangGraph namespace collision advisory

    Upstream developers documented tuple-namespace ambiguity and a fixed scoped-storage implementation.

  2. Oct 21, 2026
    disclosure

    Public disclosure

Claims & evidence

CLM-LANGGRAPH-ENRICH-FIXMaintainers list fixed releases langgraph-checkpoint-postgres 3.1.3 and langgraph-checkpoint-sqlite 3.1.2.supported

Basis: reported finding

Link to claim
CLM-LANGGRAPH-TENANT-ALIASGHSA-6hmw-9432-67qq shows that Postgres and SQLite stores map ("tenant", "bob") and ("tenant.bob",) to the same persisted namespace and patched different versions 3.1.3 and 3.1.2 respectively.supported

Basis: reported finding

Link to claim
CLM-LANGGRAPH-ENRICH-COLLISIONThe advisory demonstrates that ("tenant.bob",) and ("tenant", "bob") collided in Postgres/SQLite serialization, with unchecked get, search, delete and batch routes; InMemoryStore was not affected.supported

Basis: reported finding

Link to claim

Implications

Tenant state isolation must be defined at the canonical storage key, not merely in the convenient tuple representation used by calling code. The in-memory backend kept tuple identity and was not affected; blanket claims about every LangGraph deployment would be incorrect.

Controls and mitigations

  • Upgrade langgraph-checkpoint-postgres to 3.1.3 and sqlite to 3.1.2. Apply namespace validation consistently to get, search, delete, batch and async variants, and bind tenant context at the service boundary.

Unknowns and contradictions

  • The GitHub advisory does not establish production compromise of any specific tenant.

Sources and citation

Material revision history

  1. Oct 24, 2026 · Canonical change recorded · new in release · revision 188