CVE-2026-47391: PraisonAI: Unauth RCE via A2A eval injection
GHSA-vg22-4gmj-prxw CRITICAL CISA: ATTENDPraisonAI's official A2A server example exposes a critical remote code execution chain requiring zero credentials: an unauthenticated attacker sends a crafted JSON-RPC POST to the /a2a endpoint, the LLM processes the prompt and invokes the registered calculate() tool, and Python eval() executes arbitrary attacker-controlled code in the server process. This has been confirmed with a real Gemini LLM — not a theoretical proof — writing arbitrary files from a single unauthenticated HTTP request against CVSS 9.8 (AV:N/AC:L/PR:N/UI:N). While only one downstream dependent is currently tracked and this CVE is not in CISA KEV, any organization that deployed the official example verbatim is fully exposed with trivially reproducible exploitation requiring nothing beyond network reach to port 8000. Patch to praisonai >= 4.6.40 immediately, audit all A2A deployments for auth_token configuration and eval()-based tools, and block port 8000 at the network perimeter pending remediation.
What is the risk?
Critical. CVSS 9.8 with no authentication, no user interaction, and network-level access is all that is required. The exploit chain is trivially reproducible: a single JSON-RPC POST to /a2a delivers arbitrary code execution via the LLM acting as a relay to an unsafe eval() sink. The framework's default auth_token=None combined with 0.0.0.0 binding creates a permissive-by-default exposure surface. The real-LLM confirmation with Gemini eliminates any theoretical uncertainty — the LLM autonomously decided to invoke the calculate tool when prompted, confirming that no special jailbreak or adversarial prompt engineering is required. Organizations that deployed AI agent services following this first-party example without security review are fully compromised upon network exposure.
How does the attack unfold?
What systems are affected?
| Package | Ecosystem | Vulnerable Range | Patched |
|---|---|---|---|
| PraisonAI | pip | <= 4.6.39 | 4.6.40 |
| PraisonAI Agents | pip | — | No patch |
How severe is it?
What is the attack surface?
What should I do?
6 steps-
Patch immediately: upgrade to praisonai >= 4.6.40 and praisonaiagents to the corresponding patched release.
-
Audit all A2A deployments: confirm auth_token is explicitly configured before any 0.0.0.0 binding; treat auth_token=None plus public bind as a deployment blocker.
-
Eliminate unsafe tools: remove or replace eval()-based tools with safe arithmetic parsers (ast.literal_eval for literals or a sandboxed expression evaluator such as simpleeval); treat any tool wrapping eval(), exec(), subprocess, os.system, or file-write operations as high-risk.
-
Restrict network exposure: rebind A2A services to 127.0.0.1 for local-only use; apply firewall rules blocking port 8000 from untrusted networks if external access is required.
-
Detection: scan running PraisonAI processes for A2A services bound to 0.0.0.0 without an auth_token; grep deployed tool definitions for eval(, exec(, subprocess, and os.system; review A2A task history for anomalous payloads.
-
Post-patch verification: confirm /a2a returns 401 for unauthenticated requests and that no deployed tool retains eval() logic.
What does CISA's SSVC say?
Source: CISA Vulnrichment (SSVC v2.0). Decision based on the CISA Coordinator decision tree.
How is it classified?
Which compliance frameworks are affected?
This CVE is relevant to:
Frequently Asked Questions
What is CVE-2026-47391?
PraisonAI's official A2A server example exposes a critical remote code execution chain requiring zero credentials: an unauthenticated attacker sends a crafted JSON-RPC POST to the /a2a endpoint, the LLM processes the prompt and invokes the registered calculate() tool, and Python eval() executes arbitrary attacker-controlled code in the server process. This has been confirmed with a real Gemini LLM — not a theoretical proof — writing arbitrary files from a single unauthenticated HTTP request against CVSS 9.8 (AV:N/AC:L/PR:N/UI:N). While only one downstream dependent is currently tracked and this CVE is not in CISA KEV, any organization that deployed the official example verbatim is fully exposed with trivially reproducible exploitation requiring nothing beyond network reach to port 8000. Patch to praisonai >= 4.6.40 immediately, audit all A2A deployments for auth_token configuration and eval()-based tools, and block port 8000 at the network perimeter pending remediation.
Is CVE-2026-47391 actively exploited?
No confirmed active exploitation of CVE-2026-47391 has been reported, but organizations should still patch proactively.
How to fix CVE-2026-47391?
1. Patch immediately: upgrade to praisonai >= 4.6.40 and praisonaiagents to the corresponding patched release. 2. Audit all A2A deployments: confirm auth_token is explicitly configured before any 0.0.0.0 binding; treat auth_token=None plus public bind as a deployment blocker. 3. Eliminate unsafe tools: remove or replace eval()-based tools with safe arithmetic parsers (ast.literal_eval for literals or a sandboxed expression evaluator such as simpleeval); treat any tool wrapping eval(), exec(), subprocess, os.system, or file-write operations as high-risk. 4. Restrict network exposure: rebind A2A services to 127.0.0.1 for local-only use; apply firewall rules blocking port 8000 from untrusted networks if external access is required. 5. Detection: scan running PraisonAI processes for A2A services bound to 0.0.0.0 without an auth_token; grep deployed tool definitions for eval(, exec(, subprocess, and os.system; review A2A task history for anomalous payloads. 6. Post-patch verification: confirm /a2a returns 401 for unauthenticated requests and that no deployed tool retains eval() logic.
What systems are affected by CVE-2026-47391?
This vulnerability affects the following AI/ML architecture patterns: agent frameworks, multi-agent systems, agentic AI services, AI agent tool integrations.
What is the CVSS score for CVE-2026-47391?
CVE-2026-47391 has a CVSS v3.1 base score of 9.8 (CRITICAL). The EPSS exploitation probability is 1.17%.
What is the AI security impact?
Affected AI Architectures
MITRE ATLAS Techniques
AML.T0049 Exploit Public-Facing Application AML.T0050 Command and Scripting Interpreter AML.T0051.000 Direct AML.T0053 AI Agent Tool Invocation AML.T0055 Unsecured Credentials AML.T0086 Exfiltration via AI Agent Tool Invocation Compliance Controls Affected
What are the technical details?
Original Advisory
PraisonAI is a multi-agent teams system. Prior to version 4.6.40, PraisonAI's first-party A2A server example exposes an unauthenticated A2A JSON-RPC endpoint and registers a `calculate(expression)` tool implemented with Python `eval()`. The example also binds to `0.0.0.0`. A remote unauthenticated attacker can send `message/send` to `/a2a`; the request reaches `agent.chat()`, and a real LLM can invoke the registered `calculate` tool. In testing with `gemini/gemini-2.5-flash-lite`, this resulted in arbitrary Python execution in the server process, confirmed by creation of a marker file from an unauthenticated HTTP request. The issue affects deployments following the official A2A example or similar unauthenticated public A2A deployments with unsafe tools. The default unauthenticated A2A surface also exposes task history and task cancellation APIs, increasing confidentiality and integrity impact. Version 4.6.40 patches the issue.
Exploitation Scenario
An adversary performs automated scanning for open port 8000 services and probes for PraisonAI A2A JSON-RPC responses. Upon identifying a target, they send a single unauthenticated POST to /a2a with a message/send payload containing a prompt instructing the LLM to invoke the calculate tool with a Python expression that reads /proc/self/environ and POSTs the contents — including GEMINI_API_KEY, OPENAI_API_KEY, and database credentials — to an attacker-controlled server via urllib. The real LLM, following the prompt's instruction, invokes the calculate tool; eval() executes the payload. In under one HTTP round trip and with no authentication, the adversary harvests all API credentials from the server's environment, then optionally writes a reverse shell to a cron path or injects a backdoor into a loaded Python module for persistence — all from an unauthenticated network position.
Weaknesses (CWE)
CWE-306 Missing Authentication for Critical Function
Primary
CWE-306 Missing Authentication for Critical Function
Primary
CWE-95 Improper Neutralization of Directives in Dynamically Evaluated Code ('Eval Injection')
Primary
CWE-95 Improper Neutralization of Directives in Dynamically Evaluated Code ('Eval Injection')
Primary
CWE-306 Missing Authentication for Critical Function CWE-95 Improper Neutralization of Directives in Dynamically Evaluated Code ('Eval Injection') CWE-306 — Missing Authentication for Critical Function: The product does not perform any authentication for functionality that requires a provable user identity or consumes a significant amount of resources.
- [Architecture and Design] Divide the software into anonymous, normal, privileged, and administrative areas. Identify which of these areas require a proven user identity, and use a centralized authentication capability. Identify all potential communication channels, or other means of interaction with the software, to ensure that all channels are appropriately protected, including those channels that are assumed to be accessible only by authorized parties. Developers sometimes perform authentication at the primary channel, but open up a secondary channel that is assumed to be private. For example, a login mechanism may be listening on one network port, but after successful authentication, it may open up a second port where it waits for the connection, but avoids authentication because it assumes that only the authenticated party will connect to the port. In general, if the software or protocol allows a single session or user state to persist across multiple connections or channels, authentication and appropriate
- [Architecture and Design] For any security checks that are performed on the client side, ensure that these checks are duplicated on the server side, in order to avoid CWE-602. Attackers can bypass the client-side checks by modifying values after the checks have been performed, or by changing the client to remove the client-side checks entirely. Then, these modified values would be submitted to the server.
Source: MITRE CWE corpus.
CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H References
Timeline
Related Vulnerabilities
CVE-2026-48168 10.0 PraisonAI: shell injection in Claude Action enables RCE
Same package: praisonai CVE-2026-61447 10.0 PraisonAI: RCE via unsandboxed LLM code execution
Same package: praisonai CVE-2026-61445 9.9 PraisonAI: AICoder root RCE via unsanitized tool calls
Same package: praisonai GHSA-vmmj-pfw7-fjwp 9.9 praisonai: sandbox escape gives RCE via codeMode tool
Same package: praisonai CVE-2026-47392 9.9 praisonaiagents: RCE via Python sandbox bypass
Same package: praisonai