CVE-2026-56078: Praisonaiagents Path Traversal Vulnerability

MODERATE
Advisory Identifier: GHSA-766v-q9x3-g744
CVSS 6.5
CWE-668 CWE-22
Published
Advisory Summary

CVE-2026-56078 is a MODERATE (CVSS 6.5) path traversal vulnerability (CWE-668: Exposure of Resource to Wrong Sphere) affecting Praisonaiagents libraries in the PyPI ecosystem. The issue involves praisonai has memory state leakage and path traversal in multiagent context handling. Remediation is available by upgrading affected packages to version 1.5.115.

CVE-2026-56078 at a Glance

CVE Identifier CVE-2026-56078
GHSA Identifier GHSA-766v-q9x3-g744
Severity MODERATE
CVSS v3.1 Base Score 6.5
CWE Classification CWE-668: Exposure of Resource to Wrong Sphere
Affected Product Praisonaiagents
Package Ecosystem PyPI
Published Date
Last Updated

Security Impact

CVSS: 6.5

The security impact metrics below are parsed directly from the CVSS v3.1 vector string (CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N).

Attack Vector Network (AV:N)
Attack Complexity Low (AC:L)
Privileges Required Low (PR:L)
User Interaction None (UI:N)
Scope Unchanged (S:U)
Confidentiality High (C:H)
Integrity None (I:N)
Availability None (A:N)

How to Fix CVE-2026-56078

To remediate this vulnerability, upgrade all affected Praisonaiagents dependencies to a patched release. Both direct and transitive dependencies should be checked, as frameworks or security libraries may pull in vulnerable versions transitively.

praisonaiagents fixed: 1.5.115
pip install praisonaiagents>=1.5.115
Verify Direct and Transitive Dependencies

Run the following command in your project directory to verify that all resolved dependencies use the patched release:

pip show praisonaiagents

How to Check if You Are Affected

To determine whether your Python environment is affected by CVE-2026-56078, inspect your installed packages using pip:

pip show praisonaiagents

Analyze the terminal output to locate any version of Praisonaiagents in your dependency tree. If any resolved version matches the vulnerable ranges listed in the table below (for example, versions earlier than 1.5.115), your application is affected.

Note: The pip show praisonaiagents command checks currently installed packages in your active Python environment.

Technical Details

Vulnerability Mechanism & Technical Analysis

This vulnerability is classified under CWE-668: Exposure of Resource to Wrong Sphere, where the product exposes a resource to the wrong control sphere, providing unintended actors with inappropriate access to the resource. In Praisonaiagents, software state validation or input boundaries are circumvented during processing. Review the official source advisory statement below for specific affected components, classes, and reproduction details.

Source Advisory Statement

## Summary The `MultiAgentLedger` and `MultiAgentMonitor` components in the provided code exhibit vulnerabilities that can lead to context leakage and arbitrary file operations. Specifically: 1. **Memory State Leakage via Agent ID Collision**: The `MultiAgentLedger` uses a dictionary to store ledgers by agent ID without enforcing uniqueness. This allows agents with the same ID to share ledger instances, leading to potential leakage of sensitive context data. 2. **Path Traversal in MultiAgentMonitor**: The `MultiAgentMonitor` constructs file paths by concatenating the `base_path` and agent ID without sanitization. This allows an attacker to escape the intended directory using path traversal sequences (e.g., `../`), potentially leading to arbitrary file read/write. ## Details ### Vulnerability 1: Memory State Leakage - **File**: `examples/context/12_multi_agent_context.py:68` - **Description**: The `MultiAgentLedger` class uses a dictionary (`self.ledgers`) to store ledger instances keyed by agent ID. The `get_agent_ledger` method creates a new ledger only if the agent ID is not present. If two agents are registered with the same ID, they will share the same ledger instance. This violates the isolation policy and can lead to leakage of sensitive context data (system prompts, conversation history) between agents. - **Exploitability**: An attacker can register an agent with the same ID as a victim agent to gain access to their ledger. This is particularly dangerous in multi-tenant systems where agents may handle sensitive user data. ### Vulnerability 2: Path Traversal - **File**: `examples/context/12_multi_agent_context.py:106` - **Description**: The `MultiAgentMonitor` class constructs file paths for agent monitors by directly concatenating the `base_path` and agent ID. Since the agent ID is not sanitized, an attacker can provide an ID containing path traversal sequences (e.g., `../../malicious`). This can result in files being created or read outside the intended directory (`base_path`). - **Exploitability**: An attacker can create an agent with a malicious ID (e.g., `../../etc/passwd`) to write or read arbitrary files on the system, potentially leading to information disclosure or file corruption. ## PoC ### Memory State Leakage ```python multi_ledger = MultiAgentLedger() # Victim agent (user1) registers and tracks sensitive data victim_ledger = multi_ledger.get_agent_ledger('user1_agent') victim_ledger.track_system_prompt("Sensitive system prompt") victim_ledger.track_history([{"role": "user", "content": "Secret data"}]) # Attacker registers with the same ID attacker_ledger = multi_ledger.get_agent_ledger('user1_agent') # Attacker now has access to victim's ledger print(attacker_ledger.get_ledger().system_prompt) # Outputs: "Sensitive system prompt" print(attacker_ledger.get_ledger().history) # Outputs: [{'role': 'user', 'content': 'Secret data'}] ``` ### Path Traversal ```python with tempfile.TemporaryDirectory() as tmpdir: multi_monitor = MultiAgentMonitor(base_path=tmpdir) # Create agent with malicious ID malicious_id = '../../malicious' monitor = multi_monitor.get_agent_monitor(malicious_id) # The monitor file is created outside the intended base_path # Example: if tmpdir is '/tmp/safe_dir', the actual path might be '/tmp/malicious' print(monitor.path) # Outputs: '/tmp/malicious' (or equivalent) ``` ## Impact - **Memory State Leakage**: This vulnerability can lead to unauthorized access to sensitive agent context, including system prompts and conversation history. In a multi-tenant system, this could result in cross-user data leakage. - **Path Traversal**: An attacker can read or write arbitrary files on the system, potentially leading to information disclosure, denial of service (by overwriting critical files), or remote code execution (if executable files are overwritten). ## Recommended Fix ### For Memory State Leakage - Enforce unique agent IDs at the application level. If the application expects unique IDs, add a check during agent registration to prevent duplicates. - Alternatively, modify the `MultiAgentLedger` to throw an exception if an existing agent ID is reused (unless explicitly allowed). ### For Path Traversal - Sanitize agent IDs before using them in file paths. Replace any non-alphanumeric characters (except safe ones like underscores) or remove path traversal sequences. - Use `os.path.join` and `os.path.realpath` to resolve paths, then check that the resolved path starts with the intended base directory. Example fix for `MultiAgentMonitor`: ```python import os def get_agent_monitor(self, agent_id: str): # Sanitize agent_id to remove path traversal safe_id = os.path.basename(agent_id.replace('../', '').replace('..\\', '')) # Alternatively, use a strict allow-list of characters # Construct path and ensure it's within base_path agent_path = os.path.join(self.base_path, safe_id) real_path = os.path.realpath(agent_path) real_base = os.path.realpath(self.base_path) if not real_path.startswith(real_base): raise ValueError(f"Invalid agent ID: {agent_id}") ... ``` Additionally, consider using a dedicated function for sanitizing filenames.

CVE-2026-56078 Affected Praisonaiagents Versions

1 component(s)
Fixed Versions:
1.5.115
Product / Package Ecosystem Affected Versions Fixed Version
praisonaiagents
PyPI
< 1.5.115
1.5.115

References

Frequently Asked Questions

What is CVE-2026-56078?
CVE-2026-56078 is a security vulnerability in Praisonaiagents involving PraisonAI has Memory State Leakage and Path Traversal in MultiAgent Context Handling under CWE-668: Exposure of Resource to Wrong Sphere.
Which Praisonaiagents versions are affected?
Affected versions include releases prior to 1.5.115 across affected packages: praisonaiagents.
What version fixes CVE-2026-56078?
Upgrading to 1.5.115 (or the latest patched release for your respective branch) resolves the vulnerability.
Is praisonaiagents affected?
Yes, praisonaiagents is affected in releases prior to 1.5.115. Upgrade your dependency to 1.5.115 or later.
What is the CVSS score of CVE-2026-56078?
CVE-2026-56078 has a CVSS v3.1 base score of 6.5 (MODERATE) with vector string CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N.
What CWE is associated with CVE-2026-56078?
CVE-2026-56078 is classified under CWE-668: Exposure of Resource to Wrong Sphere (The product exposes a resource to the wrong control sphere, providing unintended actors with inappropriate access to the resource.).
How can I check PyPI dependencies for CVE-2026-56078?
Run the dependency tree command: 'pip show praisonaiagents'. This command lists direct and transitive dependencies in your build configuration so you can verify if a vulnerable version is resolved.
Machine-readable OSV JSON OSV v1.5 Schema
Normalized schema output
{
  "schema_version" : "1.4.0",
  "id" : "GHSA-766v-q9x3-g744",
  "modified" : "2026-06-19T21:33:34Z",
  "published" : "2026-04-08T19:21:32Z",
  "aliases" : [ "CVE-2026-56078" ],
  "summary" : "PraisonAI has Memory State Leakage and Path Traversal in MultiAgent Context Handling",
  "details" : "## Summary\nThe `MultiAgentLedger` and `MultiAgentMonitor` components in the provided code exhibit vulnerabilities that can lead to context leakage and arbitrary file operations. Specifically:\n1. **Memory State Leakage via Agent ID Collision**: The `MultiAgentLedger` uses a dictionary to store ledgers by agent ID without enforcing uniqueness. This allows agents with the same ID to share ledger instances, leading to potential leakage of sensitive context data.\n2. **Path Traversal in MultiAgentMonitor**: The `MultiAgentMonitor` constructs file paths by concatenating the `base_path` and agent ID without sanitization. This allows an attacker to escape the intended directory using path traversal sequences (e.g., `../`), potentially leading to arbitrary file read/write.\n\n## Details\n### Vulnerability 1: Memory State Leakage\n- **File**: `examples/context/12_multi_agent_context.py:68`\n- **Description**: The `MultiAgentLedger` class uses a dictionary (`self.ledgers`) to store ledger instances keyed by agent ID. The `get_agent_ledger` method creates a new ledger only if the agent ID is not present. If two agents are registered with the same ID, they will share the same ledger instance. This violates the isolation policy and can lead to leakage of sensitive context data (system prompts, conversation history) between agents.\n- **Exploitability**: An attacker can register an agent with the same ID as a victim agent to gain access to their ledger. This is particularly dangerous in multi-tenant systems where agents may handle sensitive user data.\n\n### Vulnerability 2: Path Traversal\n- **File**: `examples/context/12_multi_agent_context.py:106`\n- **Description**: The `MultiAgentMonitor` class constructs file paths for agent monitors by directly concatenating the `base_path` and agent ID. Since the agent ID is not sanitized, an attacker can provide an ID containing path traversal sequences (e.g., `../../malicious`). This can result in files being created or read outside the intended directory (`base_path`).\n- **Exploitability**: An attacker can create an agent with a malicious ID (e.g., `../../etc/passwd`) to write or read arbitrary files on the system, potentially leading to information disclosure or file corruption.\n\n## PoC\n### Memory State Leakage\n```python\nmulti_ledger = MultiAgentLedger()\n\n# Victim agent (user1) registers and tracks sensitive data\nvictim_ledger = multi_ledger.get_agent_ledger('user1_agent')\nvictim_ledger.track_system_prompt(\"Sensitive system prompt\")\nvictim_ledger.track_history([{\"role\": \"user\", \"content\": \"Secret data\"}])\n\n# Attacker registers with the same ID\nattacker_ledger = multi_ledger.get_agent_ledger('user1_agent')\n\n# Attacker now has access to victim's ledger\nprint(attacker_ledger.get_ledger().system_prompt)  # Outputs: \"Sensitive system prompt\"\nprint(attacker_ledger.get_ledger().history)        # Outputs: [{'role': 'user', 'content': 'Secret data'}]\n```\n\n### Path Traversal\n```python\nwith tempfile.TemporaryDirectory() as tmpdir:\n    multi_monitor = MultiAgentMonitor(base_path=tmpdir)\n    \n    # Create agent with malicious ID\n    malicious_id = '../../malicious'\n    monitor = multi_monitor.get_agent_monitor(malicious_id)\n    \n    # The monitor file is created outside the intended base_path\n    # Example: if tmpdir is '/tmp/safe_dir', the actual path might be '/tmp/malicious'\n    print(monitor.path)  # Outputs: '/tmp/malicious' (or equivalent)\n```\n\n## Impact\n- **Memory State Leakage**: This vulnerability can lead to unauthorized access to sensitive agent context, including system prompts and conversation history. In a multi-tenant system, this could result in cross-user data leakage.\n- **Path Traversal**: An attacker can read or write arbitrary files on the system, potentially leading to information disclosure, denial of service (by overwriting critical files), or remote code execution (if executable files are overwritten).\n\n## Recommended Fix\n### For Memory State Leakage\n- Enforce unique agent IDs at the application level. If the application expects unique IDs, add a check during agent registration to prevent duplicates.\n- Alternatively, modify the `MultiAgentLedger` to throw an exception if an existing agent ID is reused (unless explicitly allowed).\n\n### For Path Traversal\n- Sanitize agent IDs before using them in file paths. Replace any non-alphanumeric characters (except safe ones like underscores) or remove path traversal sequences.\n- Use `os.path.join` and `os.path.realpath` to resolve paths, then check that the resolved path starts with the intended base directory.\n\nExample fix for `MultiAgentMonitor`:\n```python\nimport os\n\ndef get_agent_monitor(self, agent_id: str):\n    # Sanitize agent_id to remove path traversal\n    safe_id = os.path.basename(agent_id.replace('../', '').replace('..\\\\', ''))\n    # Alternatively, use a strict allow-list of characters\n    \n    # Construct path and ensure it's within base_path\n    agent_path = os.path.join(self.base_path, safe_id)\n    real_path = os.path.realpath(agent_path)\n    real_base = os.path.realpath(self.base_path)\n    \n    if not real_path.startswith(real_base):\n        raise ValueError(f\"Invalid agent ID: {agent_id}\")\n    \n    ...\n```\nAdditionally, consider using a dedicated function for sanitizing filenames.",
  "severity" : [ {
    "type" : "CVSS_V3",
    "score" : "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N"
  } ],
  "affected" : [ {
    "package" : {
      "ecosystem" : "PyPI",
      "name" : "praisonaiagents"
    },
    "ranges" : [ {
      "type" : "ECOSYSTEM",
      "events" : [ {
        "introduced" : "0"
      }, {
        "fixed" : "1.5.115"
      } ]
    } ],
    "database_specific" : {
      "last_known_affected_version_range" : "<= 1.5.114"
    }
  } ],
  "references" : [ {
    "type" : "WEB",
    "url" : "https://github.com/MervinPraison/PraisonAI/security/advisories/GHSA-766v-q9x3-g744"
  }, {
    "type" : "ADVISORY",
    "url" : "https://nvd.nist.gov/vuln/detail/CVE-2026-56078"
  }, {
    "type" : "PACKAGE",
    "url" : "https://github.com/MervinPraison/PraisonAI"
  }, {
    "type" : "WEB",
    "url" : "https://www.vulncheck.com/advisories/praisonai-arbitrary-file-read-and-write-via-path-traversal-in-multiagentmonitor"
  } ],
  "database_specific" : {
    "cwe_ids" : [ "CWE-22", "CWE-668" ],
    "severity" : "MODERATE",
    "github_reviewed" : true,
    "github_reviewed_at" : "2026-04-08T19:21:32Z",
    "nvd_published_at" : null
  }
}