Advisory Database
  • Advisories
  • Dependency Scanning
  1. npm
  2. ›
  3. mem0ai
  4. ›
  5. CVE-2026-116575

CVE-2026-116575: Mem0: Cross-tenant conversation leak via unescaped delimiter collision in session-scope key (_build_session_scope)

October 28, 2026

Summary

_build_session_scope() in mem0/memory/main.py builds the conversation-history scope key used to fetch/store the last N raw messages by naively joining caller-supplied user_id/agent_id/run_id values with unescaped & and = delimiters:

def _build_session_scope(filters): parts = [] for key in sorted([“user_id”, “agent_id”, “run_id”]): val = filters.get(key) if val: parts.append(f"{key}={val}") return “&".join(parts)

_validate_and_trim_entity_id() (the only validation applied to these values) rejects only empty/whitespace-only strings — it never forbids & or =. This scope string is then used as an exact-match key against a SQLite column (storage.py: WHERE session_scope = ?) to fetch the last 10 raw messages for a given scope (main.py, Phase 0 of _add_to_vector_store, both sync and async).

Impact

Any caller who controls only their own run_id (or agent_id) — a very common integration shape, since apps frequently pass a client-/session-supplied identifier straight through as run_id without namespacing — can craft a value containing &user_id= (or &agent_id=) that produces a scope string byte-for-byte identical to a different tenant’s real scope string.

Concretely: Tenant A calls add(msgs, user_id=“alice”, run_id=“proj-x”) → scope “run_id=proj-x&user_id=alice”. An attacker who can only set run_id calls add(msgs, run_id=“proj-x&user_id=alice”) → identical scope string. The attacker’s next add() call:

  1. Reads Tenant A’s raw prior conversation via get_last_messages(session_scope) and splices it verbatim into the attacker’s own LLM fact-extraction prompt — a direct cross-tenant confidentiality leak (conversation content, potentially including PII, credentials, etc.).
  2. Writes into the same colliding row-set via save_messages(), whose eviction logic (DELETE FROM messages WHERE session_scope = ? AND id NOT IN (…)) can evict/interleave Tenant A’s history — permanent cross-tenant data corruption, not just a read.

Reachable via the public Memory.add() / AsyncMemory.add() API, and by extension the REST server’s POST /memories endpoint (which takes run_id/agent_id straight from the request body).

Reproduction

from mem0.memory.main import _build_session_scope

References

  • github.com/advisories/GHSA-5324-3w58-qpp2
  • github.com/mem0ai/mem0/commit/71f2ebefa3494da21550fb525216818776cde67f
  • github.com/mem0ai/mem0/pull/6892
  • github.com/mem0ai/mem0/releases/tag/ts-v3.1.6
  • github.com/mem0ai/mem0/releases/tag/v2.0.18
  • github.com/mem0ai/mem0/security/advisories/GHSA-5324-3w58-qpp2
  • nvd.nist.gov/vuln/detail/CVE-2026-116575

Code Behaviors & Features

Detect and mitigate CVE-2026-116575 with GitLab Dependency Scanning

Secure your software supply chain by verifying that all open source dependencies used in your projects contain no disclosed vulnerabilities. Dependency Scanning using SBOM also detects vulnerabilities from proprietary advisories that this site does not include. Learn more about Dependency Scanning using SBOM →

Affected versions

All versions before 3.1.6

Fixed versions

  • 3.1.6

Solution

Upgrade to version 3.1.6 or above.

Impact 6.3 MEDIUM

CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:N

Learn more about CVSS

Weakness

  • CWE-200: Exposure of Sensitive Information to an Unauthorized Actor
  • CWE-863: Incorrect Authorization

Source file

npm/mem0ai/CVE-2026-116575.yml

Spotted a mistake? Edit the file on GitLab.

  • Site Repo
  • About GitLab
  • Terms
  • Privacy Statement
  • Contact

Page generated Sun, 08 Nov 2026 00:16:53 +0000.