CVE-2026-56833

HIGHPre-NVD 7.57.5
EchelonGraph scoreLOW confidence

This high-severity CVE scores 7.5 under the CNA's CVSS (NVD's own analysis pending). EPSS exploit-prediction score not yet available (the EPSS model rescores nightly; freshly-published CVEs typically appear within 48 hours). GitHub Security Advisory data not yet ingested — confidence will rise once GHSA publishes (typical lag: hours to days for open-source ecosystem CVEs; never for infrastructure-only CVEs).

Triggered by: NVD CVSS baseline
Sources: cna:github_m
7.5EG
EchelonGraph verdictPlan a fixSerious severity, but no confirmed exploitation yet.
  • High severity, but no confirmed exploitation yet
CISA-KEV: Not listedEPSS PROB: CVSS: 7.5Exploit: None knownExposed: 0

No vendor fix yet — apply a workaround or compensating control (WAF / firewall / segmentation) and watch for a patch.

PraisonAI Dynamic Context history and terminal tools read files outside configured storage via path traversal

PraisonAI Dynamic Context history and terminal tools read files outside configured storage via path traversal

Summary

PraisonAI's Dynamic Context module provides filesystem-backed history and terminal-log storage. The SDK reference describes the module as providing:

  • artifact storage for tool outputs, history, and terminal logs;
  • history persistence with search; and
  • terminal session logging.

The module also exports agent-callable tool factories:

  • create_history_tools() returns history_search, history_tail, and
history_get.
  • create_terminal_tools() returns terminal_tail, terminal_grep, and
terminal_commands.

Those tools accept run_id and agent_id arguments from the tool caller. The underlying stores join those values into filesystem paths without rejecting absolute paths or .. traversal:

history_dir = self.base_dir / run_id / "history"
return history_dir / f"{agent_id}.jsonl"

terminal_dir = self.base_dir / run_id / "terminal"
return terminal_dir / f"{agent_id}.log"

Because run_id can be an absolute path and agent_id can contain traversal, a lower-trust prompt/user that can call these tools can read .jsonl and .log files outside the configured Dynamic Context base directory.

Affected Product

  • Repository: MervinPraison/PraisonAI
  • Ecosystem: pip
  • Package: praisonai
  • Component: Dynamic Context history and terminal tools
  • Current source paths:
  • src/praisonai/praisonai/context/history_store.py
  • src/praisonai/praisonai/context/terminal_logger.py
  • Latest PyPI version validated: 4.6.58
  • Current origin/main validated:
1ad58ca02975ff1398efeda694ea2ab78f20cf3e
  • Current origin/main tag validated: v4.6.58

Suggested affected range:

pip:praisonai >= 3.8.1, <= 4.6.58

Representative local sweep:

  • 3.8.1: vulnerable
  • 4.0.0: vulnerable
  • 4.5.113: vulnerable
  • 4.6.33: vulnerable
  • 4.6.34: vulnerable
  • 4.6.40: vulnerable
  • 4.6.50: vulnerable
  • 4.6.58: vulnerable

Root Cause

HistoryStore._get_history_path() and TerminalLogger._get_log_path() treat logical identifiers as path segments, but never validate that the resolved path stays under base_dir.

History path construction:

def _get_history_path(self, run_id: str, agent_id: str) -> Path:
    history_dir = self.base_dir / run_id / "history"
    history_dir.mkdir(parents=True, exist_ok=True)
    return history_dir / f"{agent_id}.jsonl"

Terminal path construction:

def _get_log_path(self, run_id: str, agent_id: str) -> Path:
    terminal_dir = self.base_dir / run_id / "terminal"
    terminal_dir.mkdir(parents=True, exist_ok=True)
    return terminal_dir / f"{agent_id}.log"

The agent tools pass caller-controlled run_id and agent_id directly into these helpers:

def history_tail(agent_id: str = "default", run_id: str = "default", count: int = 10) -> str:
    messages = history_store.get_last_messages(agent_id=agent_id, run_id=run_id, count=count)

def terminal_tail(agent_id: str = "default", run_id: str = "default", lines: int = 50) -> str:
    return term_logger.tail_session(agent_id=agent_id, run_id=run_id, lines=lines)

There is no check equivalent to:

resolved = candidate.resolve()
base = self.base_dir.resolve()
resolved.relative_to(base)

There is also no identifier allowlist preventing /, \, or .. in run_id or agent_id.

Local PoV

Run against the latest PyPI package:

uv run --with 'praisonai==4.6.58' \
  python poc/pov_prai_cand_027_history_terminal_tools_path_traversal.py --json

The PoV:

  • Creates a temporary Dynamic Context base directory.
  • Creates a separate outside directory containing secret.jsonl and
secret.log.
  • Creates legitimate in-base history and terminal log controls.
  • Calls history_tail() and history_get() with
run_id= and agent_id=../secret.
  • Calls terminal_tail() and terminal_grep() with the same traversal.
  • Confirms the traversal paths resolve to files outside the configured base.

Observed output summary from evidence/pov-pypi-4.6.58.json:

{
  "package": "praisonai",
  "package_version": "4.6.58",
  "controls": {
    "valid_history_read_works": true,
    "valid_terminal_read_works": true,
    "outside_history_file_outside_base_dir": true,
    "outside_terminal_file_outside_base_dir": true,
    "traversal_history_path_resolves_to_outside_file": true,
    "traversal_terminal_path_resolves_to_outside_file": true
  },
  "outside_history_tail": "Last 1 messages:\\n\\n[system]: PRAI-CAND-027-HISTORY-SECRET",
  "outside_terminal_tail": "PRAI-CAND-027-TERMINAL-SECRET\\nsecond line\\n",
  "outside_terminal_grep": "Found 1 matches:\\n\\n--- Line 1 ---\\n> PRAI-CAND-027-TERMINAL-SECRET\\n  second line",
  "vulnerable": true
}

The PoV is local-only. It does not start a server, contact a third-party target, or use real credentials.

Why This Is Not Intended Behavior

This report does not claim that history and terminal helpers should be unable to read legitimate history or terminal logs. The issue is narrower: logical run_id and agent_id values can escape the configured Dynamic Context base directory.

The controls show the intended boundary:

  • legitimate in-base history remains readable;
  • legitimate in-base terminal logs remain readable;
  • the outside .jsonl and .log files are not under the configured
base_dir; and
  • the tools still disclose those outside files through traversal identifiers.

The official context reference describes history persistence and terminal logging as filesystem-backed Dynamic Context features. The context security documentation also treats absolute paths, path traversal, and sensitive files as privacy/security risks. Reading files outside the configured context store conflicts with that documented boundary.

Impact

If a PraisonAI application exposes these Dynamic Context tools to untrusted or lower-trust prompts, the lower-trust caller can read files outside the configured context storage when the target file can be reached with the tool-imposed suffix:

  • history_* tools can disclose reachable .jsonl files;
  • terminal_* tools can disclose reachable .log files; and
  • cross-run or cross-agent context/history/logs can be disclosed if their path
is known or guessable.

This can expose conversation history, prompts, terminal output, command logs, tokens, API keys, cloud credentials, operational data, or other secrets stored in JSONL/log files readable by the PraisonAI process.

The impact is confidentiality-only in the tested surface. Integrity and availability are not claimed for this report.

Severity

Suggested severity: High.

Rationale:

  • AV: applies when an application exposes an agent with these tools over a
network chat/API surface.
  • AC: the traversal needs only chosen run_id and agent_id values.
  • PR: an unauthenticated or public-facing agent endpoint can be exploited
without an account. Deployments that require authenticated chat/API access may score this as PR:L.
  • UI: the attacker directly supplies the prompt/tool argument to the
exposed agent surface.
  • C: conversation history and terminal logs can contain secrets and private
operational data.
  • I:N/A: this report demonstrates read-only disclosure.

Remediation

Treat run_id and agent_id as logical identifiers, not path components.

Recommended fixes:

  • Reject absolute paths, path separators, and traversal components in
run_id and agent_id.
  • Build candidate paths, call .resolve(), and reject any path that is not
under self.base_dir.resolve().
  • Apply the same containment helper to history append/read/search/clear/export
and terminal log/read/search/clear/export paths.
  • Prefer opaque server-generated run and agent IDs in tool schemas.
  • Add regression tests for absolute run_id, ../ in run_id, and ../ in
agent_id for history and terminal tool factories.

Minimal containment shape:

def _safe_child(self, *parts: str) -> Path:
    candidate = self.base_dir.joinpath(*parts).resolve()
    base = self.base_dir.resolve()
    try:
        candidate.relative_to(base)
    except ValueError as exc:
        raise PermissionError("Context path is outside configured base_dir") from exc
    return candidate

Pair this with an identifier allowlist, because run_id and agent_id should not need filesystem syntax.

CVSS v3
7.5
EG Score
7.5(low)
EG Risk
38(Track)
EG Risk 38/100SSVC: Track

EG Risk is EchelonGraph's 0–100 priority score: it fuses intrinsic severity with real-world exploitation and automatability so you can rank equal-severity CVEs and fix the most dangerous first. Higher = act sooner. Distinct from the 0–10 EG Score (severity).

How it’s computed
Severity75% × 45%
Exploitation0% × 40%
Automatability30% × 15%
Action: Routine — remediate on your standard cadence.
EPSS PROB
EPSS %ILE
KEV
Not listed

Published

June 18, 2026

Last Modified

June 18, 2026

Vendor Advisories for CVE-2026-56833(1)

These vendors published their own advisory mentioning this CVE — often with vendor-specific remediation steps + affected product lists not in NVD.

Affected Packages

(1 across 1 ecosystem)
PyPI(1)
PackageVulnerable rangeFixed inDependents
praisonai3.10.0 ... 4.6.9 (300 versions)4.6.59

Data Freshness Timeline

(refreshed 3× in last 7d / 3× in last 30d)

Each row is a source pipeline that fetched or updated this CVE on that date, with what changed. For example, "NVD update" means NVD published or revised its analysis for this CVE; "MITRE cvelistV5" means we ingested or refreshed it from the CNA feed. Most recent first.

  1. 2026-07-26 18:46 UTCEG score recompute
  2. 2026-07-23 03:20 UTCEG score recompute
  3. 2026-07-20 21:35 UTCEG score recompute

Frequently asked(4)

What is CVE-2026-56833?
CVE-2026-56833 is a high vulnerability published on June 18, 2026. PraisonAI Dynamic Context history and terminal tools read files outside configured storage via path traversal PraisonAI Dynamic Context history and terminal tools read files outside configured storage via path traversal Summary PraisonAI's Dynamic Context module provides filesystem-backed history…
When was CVE-2026-56833 disclosed?
CVE-2026-56833 was first published in the National Vulnerability Database on June 18, 2026. EchelonGraph re-ingests CVE updates from NVD on a 2-hour cycle, so this page reflects the latest published state.
What is the CVSS score of CVE-2026-56833?
CVE-2026-56833 has a CVSS v4.0 base score of 7.5 (CNA self-assessment; NVD's own analysis pending). The EG score is currently aggregating — additional source signals are being incorporated as they become available..
How do I remediate CVE-2026-56833?
Patch to the fixed version published by the affected vendor. Where vendor advisories exist for CVE-2026-56833, EchelonGraph cross-links them in the Vendor Advisories panel below — those typically contain the canonical remediation steps, fixed version numbers, and any vendor-specific mitigations.

Dependency Blast Radius

See which npm, PyPI, Go, and Maven packages are affected by CVE-2026-56833

Explore →

Is Your Infrastructure Affected by CVE-2026-56833?

EchelonGraph automatically scans your cloud infrastructure and maps CVE exposure using blast radius analysis.