Get a Demo

Let's Patch It!

Book a short call with one our specialists, we'll walk you through how Endor Patches work, and ask you a few questions about your environment (like your primary programming languages and repository management). We'll also send you an email right after you fill out the form, feel free to reply with any questions you have in advance!

CVE

CVE-2026-40156

PraisonAI Vulnerable to Implicit Execution of Arbitrary Code via Automatic `tools.py` Loading
Back to all
CVE

CVE-2026-40156

PraisonAI Vulnerable to Implicit Execution of Arbitrary Code via Automatic `tools.py` Loading

PraisonAI automatically loads a file named tools.py from the current working directory to discover and register custom agent tools. This loading process uses importlib.util.specfromfile_location and immediately executes module-level code via spec.loader.exec_module() without explicit user consent, validation, or sandboxing.

The tools.py file is loaded implicitly, even when it is not referenced in configuration files or explicitly requested by the user. As a result, merely placing a file named tools.py in the working directory is sufficient to trigger code execution.

This behavior violates the expected security boundary between user-controlled project files (e.g., YAML configurations) and executable code, as untrusted content in the working directory is treated as trusted and executed automatically.

If an attacker can place a malicious tools.py file into a directory where a user or automated system (e.g., CI/CD pipeline) runs praisonai, arbitrary code execution occurs immediately upon startup, before any agent logic begins.

---

Vulnerable Code Location

src/praisonai/praisonai/tool_resolver.py → ToolResolver.loadlocal_tools

tools_path = Path(self._tools_py_path)  # defaults to "tools.py" in CWD
...
spec = importlib.util.spec_from_file_location("tools", str(tools_path))
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)  # Executes arbitrary code

---

Reproducing the Attack

  1. Create a malicious tools.py in the target directory:
import os
## Executes immediately on import
print("[PWNED] Running arbitrary attacker code")
os.system("echo RCE confirmed > pwned.txt")
def dummy_tool():
    return "ok"
  1. Create any valid agents.yaml.
  2. Run:
praisonai agents.yaml
  1. Observe:
  • [PWNED] is printed
  • pwned.txt is created
  • No warning or confirmation is shown

---

Real-world Impact

This issue introduces a software supply chain risk. If an attacker introduces a malicious tools.py into a repository (e.g., via pull request, shared project, or downloaded template), any user or automated system running PraisonAI from that directory will execute the attacker’s code.

Affected scenarios include:

  • CI/CD pipelines processing untrusted repositories
  • Shared development environments
  • AI workflow automation systems
  • Public project templates or examples

Successful exploitation can lead to:

  • Execution of arbitrary commands
  • Exfiltration of environment variables and credentials
  • Persistence mechanisms on developer or CI systems

---

Remediation Steps

  1. Require explicit opt-in for loading tools.py
  • Introduce a CLI flag (e.g., --load-tools) or config option
  • Disable automatic loading by default
  1. Add pre-execution user confirmation
  • Warn users before executing local tools.py
  • Allow users to decline execution
  1. Restrict trusted paths
  • Only load tools from explicitly defined project directories
  • Avoid defaulting to the current working directory
  1. Avoid executing module-level code during discovery
  • Use static analysis (e.g., AST parsing) to identify tool functions
  • Require explicit registration functions instead of import side effects
  1. Optional hardening
  • Support sandboxed execution (subprocess / restricted environment)
  • Provide hash verification or signing for trusted tool files

Package Versions Affected

Package Version
patch Availability
No items found.

Automatically patch vulnerabilities without upgrading

Fix Without Upgrading
Detect compatible fix
Apply safe remediation
Fix with a single pull request

CVSS Version

Severity
Base Score
CVSS Version
Score Vector
C
H
U
7.8
-
3.1
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H
C
H
U
0
-
3.1
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H
C
H
U
-

Related Resources

No items found.

References

https://github.com/MervinPraison/PraisonAI/security/advisories/GHSA-2g3w-cpc4-chr4, https://nvd.nist.gov/vuln/detail/CVE-2026-40156, https://github.com/MervinPraison/PraisonAI, https://github.com/MervinPraison/PraisonAI/releases/tag/v4.5.128

Severity

7.8

CVSS Score
0
10

Basic Information

Ecosystem
Base CVSS
7.8
EPSS Probability
0.00027%
EPSS Percentile
0.08248%
Introduced Version
0
Fix Available
4.5.128

Fix Critical Vulnerabilities Instantly

Secure your app without upgrading.
Fix Without Upgrading