Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAuthenticate as low-privileged tenant
-
DeliveryDiscover victim user_id/run_id values
-
ExploitForge run_id embedding '&user_id=<victim>'
-
ExecutionCall add() to collide session_scope key
-
ImpactRead and evict victim conversation history
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V14 - Data Protection Data exposure prevention
MITRE ATT&CK
2 techniques across 2 tactics: Collection, Discovery The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Requires a multi-tenant Mem0 deployment that uses the recent-conversation buffer and passes a caller-/client-supplied identifier straight through as run_id (or agent_id) without server-side namespacing - the common integration shape called out in the advisory. The attacker must be a legitimate caller of Memory.add()/AsyncMemory.add() or the REST 'POST /memories' endpoint, and must know the victim tenant's exact user_id and run_id/agent_id values in order to craft an identifier embedding '&user_id=<victim>' that collides on the session_scope key. Limiting factors: no exploitation is possible against single-tenant usage or where ids are server-assigned/namespaced; the attack needs prior knowledge of victim identifiers (reflected as high attack complexity) and low-privileged caller access; only the last-N raw-message conversation buffer is exposed, while stored memories are unaffected. |
| Impact | Signals point consistently to a real but non-emergency, conditionally-exploitable issue rather than a top priority. The CVSS vector (AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:N, base 6.3) describes a privileged, high-complexity attack with serious confidentiality and integrity impact - consistent with the mechanism, where a low-privileged tenant must already be a legitimate caller and must know the victim's exact identifier values to forge a colliding session_scope key. EPSS is very low (0.11%, 1st percentile) and the vulnerability is NOT in CISA KEV, so there is no evidence of active or widespread exploitation; the low EPSS is consistent with an abuse that requires multi-tenant deployment plus knowledge of victim identifiers rather than spray-and-pray scanning. The vuln.today decision label is 'this_month', indicating prioritized but not urgent remediation. No SSVC decision tuple (exploitation/automatable/technical impact) was supplied, so that framework cannot be cross-referenced. One notable tension: the vendor vector uses AV:L, but the advisory explicitly lists the REST 'POST /memories' endpoint (which reads run_id/agent_id straight from the request body) as a reachable path, which would be network-reachable - verify the intended attack vector against your deployment (library-embedded vs. exposed REST server). Overall this is a genuine cross-tenant isolation flaw worth patching, but the required preconditions and absent exploitation evidence keep real-world risk moderate rather than critical. |
| Exploit ScenarioDerived | In a multi-tenant app that passes a client-supplied session identifier straight through as run_id, an attacker who controls only their own run_id sets it to a value such as 'proj-x&user_id=alice', producing a session_scope string byte-for-byte identical to victim 'alice'. The attacker's next add() call then reads alice's prior raw conversation (potentially PII/credentials) into the attacker's own fact-extraction prompt and can evict or interleave alice's stored history. A collision reproduction snippet is published in the GHSA advisory, and the reporter states a full end-to-end proof exists (offered on request) but is not published, so this is not verified as working public exploit code; high attack complexity reflects the need to know the victim's exact identifier values. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 28, 2026
A delimiter-injection flaw in Mem0's session-scope key construction lets a legitimate caller of the Python or TypeScript SDK (or the REST POST /memories endpoint) collapse two different tenant identifiers onto the same recent-conversation buffer key, disclosing another tenant's last-N raw messages and allowing that history to be evicted or interleaved. Affected are Python SDK releases before 2.0.18 and TypeScript SDK releases before 3.1.6 when _build_session_scope()/buildSessionScope() joins caller-controlled user_id, agent_id, and run_id with unescaped & and = characters. Exploitation requires a multi-tenant deployment that passes a client-supplied identifier straight through as run_id or agent_id and prior knowledge of the victim's exact identifiers, so risk is conditional rather than immediate; EPSS is 0.11% (1st percentile), there is no CISA KEV entry, and no public exploit code is confirmed - the advisory's reproduction script and a public PoC reference exist, but they are not verified as working exploit code. Vendor-released patches are available in Python SDK 2.0.18 and TypeScript SDK 3.1.6.
RemediationAI
Upgrade to the vendor-released patches: Python SDK 2.0.18 (pip install --upgrade mem0ai>=2.0.18) and TypeScript SDK 3.1.6 (npm install mem0ai@3.1.6), which percent-escape %, & and = when building the session scope key per PR #6892 and commit 71f2ebefa3494da21550fb525216818776cde67f. Be aware of the documented side effect: identifiers that already contain %, & or = now hash to a new scope key, so their recent-conversation buffer starts empty once and refills on the next add(); stored memories are unaffected. Until upgrading, the specific compensating control is to stop caller-controlled values from reaching the scope key: server-assign or namespace user_id/agent_id/run_id (e.g. prefix with a tenant id and reject any input containing & or =) before calling Memory.add()/AsyncMemory.add(), and enforce the same filtering at the REST layer for run_id and agent_id in POST /memories - the trade-off is that legitimate identifiers containing those characters must be remapped, and client-supplied session ids must be validated or replaced. A further option is to disable or bypass the recent-conversation buffer so getLastMessages()/saveMessages() are not consulted, at the cost of reduced context for LLM fact extraction. Restricting network access to the REST server does not address the SDK-level path and does not substitute for patching. If any exposed identifiers or conversations may have been cross-tenant, review logs for scope-collision patterns and rotate or purge affected conversation history.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 2 packages in npm, pypi, euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
Mem0 persists conversational memory for AI agents; before extracting facts, Memory.add()/AsyncMemory.add() fetch the last 10 raw messages for a conversation scope so the extraction prompt has recent context. That scope is a synthetic string assembled by _build_session_scope() (Python, mem0/memory/main.py) and Memory.buildSessionScope() (TypeScript, mem0-ts/src/oss/src/memory/index.ts), which sort the keys user_id, agent_id and run_id and join each present value as key=value with & as separator. The only validation on these values, _validate_and_trim_entity_id(), rejects empty/whitespace-only strings and never forbids & or =, so a value such as "proj-x&user_id=alice" produces a byte-for-byte identical key to the two-filter combination user_id=alice plus run_id=proj-x. The key is used as an exact-match lookup in SQLite (WHERE session_scope = ?), both for reading via getLastMessages() and for writing/evicting via saveMessages(), whose eviction deletes rows outside the retained id set - which is why the consequence is not only a cross-tenant read but also corruption of the victim's buffer. Root cause maps to CWE-200 (exposure of sensitive information) and CWE-863 (incorrect authorization), i.e. a canonicalization/partitioning failure rather than a memory-safety defect. The upstream fix in PR #6892 percent-escapes %, & and = in each component before joining, so ordinary identifiers keep their existing keys while identifiers containing delimiters map to a new key whose buffer starts empty and refills on the next add(); stored memories are unaffected. The CPE cpe:2.3:a:mem0ai:mem0:* reflects the advisory's unversioned wildcard; EUVD lists the affected Python range as mem0 < 2.0.18 and the advisory names npm mem0ai fixed in 3.1.6. Note the input CVSS vector is AV:L/AC:H/PR:L while the independent assessment uses AV:N/AC:H/PR:L; the assessed vector is the authoritative one, and the practical exposure is over the REST API.
Know when Mem0 gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:N
REST POST /memories makes it network-reachable (AV:N); the attacker must know the victim's exact identifiers to forge a collision (AC:H) and be an authenticated tenant (PR:L); no availability impact (A:N).
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
1DescriptionCVE.org
Mem0 provides persistent memory infrastructure for AI agents and applications. Prior to Python SDK 2.0.18 and TypeScript SDK 3.1.6, _build_session_scope() in mem0/memory/main.py and Memory.buildSessionScope() in the TypeScript SDK join caller-controlled user_id, agent_id, and run_id values using unescaped & and = delimiters. A caller can embed another scope component in a controlled identifier so that distinct tenant tuples produce the same session_scope key. Memory.add(), AsyncMemory.add(), and the REST POST /memories flow use that key to read and save recent raw messages, allowing cross-tenant conversation disclosure and eviction or interleaving of another tenant's history. This issue is fixed in Python SDK 2.0.18 and TypeScript SDK 3.1.6.
Blast Radius
ecosystem impact- 1 pypi packages depend on mem0ai (1 direct, 0 indirect)
Ecosystem-wide dependent count for version 2.0.18.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.
Authorization bypass in Mem0 self-hosted server versions through 0.2.8 allows any authenticated holder of a distributed
Unauthenticated data theft, tampering, and denial-of-service affects mem0's OpenMemory API server (openmemory/api compon
Sensitive information disclosure and server-side request forgery in mem0's self-hosted server let unauthenticated remote
SQL injection in mem0's Databricks vector store backend (mem0/vector_stores/databricks.py) affects versions 0.1.117 up t
Unauthenticated deletion of arbitrary memory records in mem0 1.0.0 allows remote attackers to remove any database entry
mem0 1.0.0 server allows unauthenticated remote attackers to trigger memory reset and table re-creation via unprotected
Unsafe pickle deserialization in mem0 up to version 1.0.11 allows authenticated remote attackers to execute arbitrary co
mem0 1.0.0 server accepts unauthenticated POST requests to the /memories endpoint, allowing remote attackers to inject a
EUVD-2026-110315
GHSA-5324-3w58-qpp2
NVD
CVE.org
EPSS
Exploit-DB