Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessSupply untrusted recipe declaring execute_command
-
DeliveryInvoke via recipe.run_stream() / --stream / POST /v1/recipes/stream
-
ExploitDangerous-tool policy check skipped, tool resolved with approval
-
Executionexecute_command runs OS command
-
ImpactCode 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 |
| 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 - |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – 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
Affected Packages
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
AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H
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.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
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
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.
Apply vendor patch.
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
OS command injection occurs when an application passes unsanitized user input directly into system shell commands.
Remote code execution in PraisonAI before 1.6.78 allows attackers to run arbitrary Python on the host by manipulating th
PraisonAI's TypeScript MCP server (npm package `praisonai`, versions 1.5.0 through 1.7.1) exposes an HTTP JSON-RPC trans
WebSocket origin-validation bypass in PraisonAI's Browser Server (praisonai/browser/server.py) before 4.6.58 lets an att
PraisonAI's `praisonai serve` subsystem (agents and unified modes) accepts an `--api-key` CLI flag that is parsed but ne
System prompt extraction and unauthorized tool invocation in PraisonAI before 4.6.78 arise because the prompt-injection
Unauthenticated remote agent invocation in PraisonAI versions 4.6.34 through 4.6.57 allows any network-reachable caller
SSRF protection bypass in PraisonAI's praisonaiagents library (all versions before 1.6.58) lets low-privileged users rou
Server-side request forgery in PraisonAI's Crawl4AI/Chromium crawling backend (all versions before 1.6.78) lets low-priv
Authentication fail-open in PraisonAI's Recipe HTTP server allows unauthenticated remote attackers to invoke recipe exec
Authentication bypass in PraisonAI's AgentServer component exposes all routes - /publish, /events, /info, /health - to u
Arbitrary Python code execution in PraisonAI's workflow include feature allows an attacker who controls a local recipe d
Server-side request forgery in PraisonAI's web_crawl() function (versions 1.5.128-1.6.57) allows an attacker who can inf
EUVD-2026-108879
GHSA-v847-hxxw-3pxg
NVD
CVE.org
EPSS
Exploit-DB