Skip to main content

PraisonAI CVE-2026-56838

| EUVDEUVD-2026-108879 HIGH
OS Command Injection (CWE-78)
2026-10-23 GitHub_M GHSA-v847-hxxw-3pxg PYSEC-2026-3520
7.8
CVSS 3.1 · Vendor: GitHub_M
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Supply untrusted recipe declaring execute_command
  2. Delivery
    Invoke via recipe.run_stream() / --stream / POST /v1/recipes/stream
  3. Exploit
    Dangerous-tool policy check skipped, tool resolved with approval
  4. Execution
    execute_command runs OS command
  5. Impact
    Code execution as PraisonAI process

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V1 - Encoding and Sanitization OS command sanitization, avoid shell exec
MITRE ATT&CK

2 techniques across 1 tactic: Execution

The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up.

Exploitation Conditions

Exploitation requires the vulnerable streaming entrypoint specifically: either the operator runs an attacker-chosen/untrusted recipe via praisonai recipe run <recipe> --stream, or a lower-trust user can invoke the recipe HTTP sidecar at POST /v1/recipes/stream. The recipe must declare a default-denied dangerous tool (e.g. execute_command) in TEMPLATE.yaml requires.tools; run_stream() then reaches _execute_recipe() with allow_dangerous_tools=False because the policy gate is never applied. LIMITING FACTORS: the standard recipe.run() path is NOT affected (it correctly returns POLICY_DENIED), so the bug only manifests through the streaming path; User Interaction is required (an operator must choose to run the recipe); for the HTTP sidecar path, exploitation additionally depends on the sidecar being exposed and reachable past its optional API-key/JWT authentication - the advisory does not claim default unauthenticated network RCE. The advisory also notes the exact command trigger depends on the workflow and model/tool-call path, though the policy boundary is already bypassed before execution.

Impact

The CVSS 3.1 base score of 7.8 (AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H) rates this High, but the vector itself tempers real-world urgency: the attack vector is Local and User Interaction is Required, meaning an operator must actively choose to run an attacker-supplied recipe through the streaming path. This is not remote-unauthenticated RCE - the advisory explicitly states it does NOT claim default unauthenticated network RCE. No CISA KEV listing is present, so there is no confirmed active exploitation. No EPSS score was supplied, so statistical exploitation probability cannot be weighed. The vuln.today Decision label is 'this_week' (not act_now/emergency), consistent with a serious-but-gated bug. SSVC-style reading: exploitation is 'none/proof-of-concept' (a local PoV is described), technical impact is Total (command execution as the PraisonAI process), but automatability is limited because it requires an operator or a lower-trust user to invoke a specific dangerous recipe through run_stream(). Net: this is a legitimate security-control bypass warranting prompt patching for anyone running untrusted recipes or exposing the recipe streaming sidecar, but the local/UI-gated vector and absence of KEV/EPSS signals mean it is a this-week priority rather than a drop-everything emergency. One caveat to verify: the elevated path (the documented HTTP sidecar at POST /v1/recipes/stream) could present as a network vector in exposed/authenticated deployments, which would raise AV to Network for those configurations.

Exploit ScenarioDerived

An operator runs an untrusted PraisonAI recipe (or exposes the recipe streaming sidecar to lower-trust users) and invokes it via the streaming path - praisonai recipe run <recipe> --stream or POST /v1/recipes/stream. Because run_stream() never calls _check_tool_policy(), a recipe honestly declaring execute_command in TEMPLATE.yaml requires.tools reaches _execute_recipe() even though allow_dangerous_tools remains False, letting OS commands run with the privileges of the PraisonAI process. A local proof-of-vulnerability (a printf canary that crosses the policy boundary) is described in the GHSA advisory.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
Patch available 0.2% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Oct 23, 2026

PraisonAI versions 4.5.87 through 4.6.58 apply their default-deny dangerous-tool policy only on the standard recipe path, so a recipe that honestly declares a dangerous tool such as execute_command in TEMPLATE.yaml requires.tools is correctly returned as POLICY_DENIED by recipe.run() but proceeds into _execute_recipe() through recipe.run_stream() with allow_dangerous_tools=False, letting commands run with the privileges of the PraisonAI process. The issue is reachable either when an operator runs an untrusted recipe via 'praisonai recipe run <recipe> --stream' or when a lower-trust user can reach the recipe HTTP sidecar endpoint POST /v1/recipes/stream, though for the HTTP path the advisory does not claim default unauthenticated remote code execution because the sidecar is documented as a localhost REST API with optional API-key/JWT authentication. CVSS 3.1 scores it 7.8 (AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H), reflecting Local access and Required User Interaction rather than a remotely reachable pre-auth flaw; there is no CISA KEV entry for this CVE, and the vendor advisory includes a local proof-of-value script using a harmless printf canary, which is a PoC reference rather than verified working exploit code against a deployed target.

RemediationAI

Upgrade praisonai to 4.6.59 or later, the version in which the vendor fixed the missing policy check on the streaming path; the advisory at https://github.com/MervinPraison/PraisonAI/security/advisories/GHSA-v847-hxxw-3pxg is the authoritative reference. If upgrading cannot happen immediately, compensating controls are to stop using the streaming entrypoint entirely - avoid '--stream' in CLI invocations and remove or block POST /v1/recipes/stream at any proxy in front of the sidecar - accepting that streaming output is lost for recipe runs; to refrain from running untrusted or attacker-supplied recipes through any PraisonAI mode, since the recipe itself must declare the dangerous tool and an operator must choose to run it; and, where the sidecar is deployed, to keep it bound to localhost and ensure its API-key/JWT authentication is enabled rather than left optional, recognizing that this reduces but does not eliminate exposure for authenticated lower-trust users who can still choose recipe names or URIs. The durable fix recommended upstream is to centralize preflight enforcement so run_stream() calls _check_tool_policy() before both dry-run and real execution whenever allow_dangerous_tools is not true, and to have /v1/recipes/stream map a policy denial to a non-success SSE event or HTTP failure.

Affected VersionsENISA

PraisonAI 4.5.87, < 4.6.59

Affected Packages

pypi praisonai fix: 4.6.59

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in pypi

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

PraisonAI is a Python multi-agent framework distributed as the pip package praisonai, with a CLI ('praisonai recipe ...'), a recipe HTTP sidecar offering SSE streaming, and an agents library containing the YAML workflow parser. The affected logic lives in src/praisonai/praisonai/recipe/core.py and serve.py, the CLI feature module src/praisonai/praisonai/cli/features/recipe.py, and src/praisonai-agents/praisonaiagents/workflows/yaml_parser.py and workflows.py. Both entrypoints load the same recipe and check dependencies, but only recipe.run() calls _check_tool_policy(recipe_config) when options['allow_dangerous_tools'] is not true and returns a RecipeResult with status POLICY_DENIED; run_stream() goes straight from _load_recipe() to _execute_recipe() without that guard, including ahead of the dry-run shortcut. The root cause is classified as CWE-78 (OS command injection), with the advisory additionally mapping it to CWE-693 (protection mechanism failure) and CWE-863 (incorrect authorization): the declared-dangerous tool reaches the workflow execution engine and is resolved with approve: [execute_command] even though the caller never opted in, so the operator-facing policy boundary is bypassed before any command actually runs. Exploitation requires that a recipe declare a default-denied tool and that execution flow through the streaming path; the standard recipe.run() path is not affected, and the exact command trigger still depends on the workflow and model/tool-call path, though the policy boundary is already crossed by then.

Know when Praisonai 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

Vendor (GitHub_M) PRIMARY 7.8 HIGH
AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H
vuln.today AI 7.8 HIGH

Local CLI/recipe path with an operator running an attacker-supplied streaming recipe (AV:L, UI:R, PR:N); command execution as the process yields C/I/A:H, scope unchanged.

3.1 AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H
4.0 AV:L/AC:L/AT:N/PR:N/UI:A/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N

Primary rating from Vendor (GitHub_M).

CVSS VectorVendor: GitHub_M

Attack Vector
Local
Attack Complexity
Low
Privileges Required
None
User Interaction
Required
Scope
Unchanged
Confidentiality
High
Integrity
High
Availability
High

DescriptionCVE.org

PraisonAI is a multi-agent teams system. From version 4.5.87 to before version 4.6.59, PraisonAI recipe execution blocks default-denied dangerous tools unless the caller explicitly passes allow_dangerous_tools=True. The normal recipe.run() path enforces this with _check_tool_policy(). The streaming path, recipe.run_stream(), loads the same recipe, checks dependencies, and then calls _execute_recipe() without running the dangerous-tool policy check. As a result, a recipe that honestly declares execute_command in TEMPLATE.yaml requires.tools is denied by recipe.run(), but reaches the execution engine through recipe.run_stream() with allow_dangerous_tools=False. This issue has been patched in version 4.6.59.

Technical POC Analysis

CWE-78 command injection is the CVE-assigned class, but the mechanism is an authorization/protection-mechanism failure also mapped by the advisory to CWE-863 and CWE-693.

Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.

Executive ViewAI

Why It Matters

PraisonAI, an AI agent and recipe automation framework used to orchestrate tool-enabled workflows, contains a policy-enforcement gap in versions 4.5.87 through 4.6.58 that lets dangerous tools such as execute_command run when a recipe is invoked through the streaming path (CLI --stream or the sidecar streaming endpoint), even though the same recipe is correctly blocked on the standard path. Because commands execute with the privileges of the PraisonAI process, any team running untrusted or third-party recipes could face arbitrary code execution on the host, exposing data and systems the service account can reach. Leadership should care because the flaw undermines the framework's own default-deny guardrail at exactly the point where operators are most likely to trust it, and the affected versions are recent and likely to be in active internal use.

Business Impact: High
Compensating Controls

Apply vendor patch.

Threat Intelligence Overview

EPSS Score
0.2%
Top 91% exploitable
Prevalence
Low
emerging niche open-source multi-agent framework, no broad enterprise footprint
Data Quality
3 sources
Confidence: Low

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.

SignalValue
Severity HIGH
CISA KEV No
Public POC No
EPSS 0.2%
Patch available Yes
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation· derived
None
System Exposure· derived
Small
Automatable· derived
No
Human Impact
High

Priority Score

39
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +39
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

OS command injection occurs when an application passes unsanitized user input directly into system shell commands.

CVE-2026-61447 CRITICAL POC
10.0 Jul 11

Remote code execution in PraisonAI before 1.6.78 allows attackers to run arbitrary Python on the host by manipulating th

CVE-2026-57139 CRITICAL POC
9.8 Sep 15

PraisonAI's TypeScript MCP server (npm package `praisonai`, versions 1.5.0 through 1.7.1) exposes an HTTP JSON-RPC trans

CVE-2026-55536 CRITICAL POC
9.1 Aug 25

WebSocket origin-validation bypass in PraisonAI's Browser Server (praisonai/browser/server.py) before 4.6.58 lets an att

CVE-2026-55541 HIGH POC
8.8 Aug 25

PraisonAI's `praisonai serve` subsystem (agents and unified modes) accepts an `--api-key` CLI flag that is parsed but ne

CVE-2026-61439 HIGH POC
8.7 Jul 11

System prompt extraction and unauthorized tool invocation in PraisonAI before 4.6.78 arise because the prompt-injection

CVE-2026-55534 HIGH POC
8.6 Aug 25

Unauthenticated remote agent invocation in PraisonAI versions 4.6.34 through 4.6.57 allows any network-reachable caller

CVE-2026-55526 HIGH POC
8.5 Aug 25

SSRF protection bypass in PraisonAI's praisonaiagents library (all versions before 1.6.58) lets low-privileged users rou

CVE-2026-61429 HIGH POC
8.4 Jul 11

Server-side request forgery in PraisonAI's Crawl4AI/Chromium crawling backend (all versions before 1.6.78) lets low-priv

CVE-2026-55533 HIGH POC
8.2 Aug 25

Authentication fail-open in PraisonAI's Recipe HTTP server allows unauthenticated remote attackers to invoke recipe exec

CVE-2026-55528 HIGH POC
8.2 Aug 25

Authentication bypass in PraisonAI's AgentServer component exposes all routes - /publish, /events, /info, /health - to u

CVE-2026-55522 HIGH POC
7.8 Aug 05

Arbitrary Python code execution in PraisonAI's workflow include feature allows an attacker who controls a local recipe d

CVE-2026-55523 HIGH POC
7.7 Aug 05

Server-side request forgery in PraisonAI's web_crawl() function (versions 1.5.128-1.6.57) allows an attacker who can inf

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy