CVE-2026-40156: PraisonAI Affected by Implicit Execution of Arbitrary Code via Automatic `tools.py` Loading

Published Apr 10, 2026
·
Updated

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.specfromfilelocation and immediately executes module-level code via spec.loader.execmodule() 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/toolresolver.py → ToolResolver.loadlocaltools

python toolspath = Path(self.toolspypath) # defaults to "tools.py" in CWD ... spec = importlib.util.specfromfilelocation("tools", str(toolspath)) module = importlib.util.modulefromspec(spec) spec.loader.execmodule(module) # Executes arbitrary code

---

Reproducing the Attack

1. Create a malicious tools.py in the target directory:

python import os

Executes immediately on import print("[PWNED] Running arbitrary attacker code") os.system("echo RCE confirmed > pwned.txt")

def dummytool(): return "ok"

2. Create any valid agents.yaml.

3. Run:

bash praisonai agents.yaml

4. 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

2. Add pre-execution user confirmation

Warn users before executing local tools.py Allow users to decline execution

3. Restrict trusted paths

Only load tools from explicitly defined project directories Avoid defaulting to the current working directory

4. 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

5. Optional hardening

Support sandboxed execution (subprocess / restricted environment) Provide hash verification or signing for trusted tool files

Other sources

PraisonAI is a multi-agent teams system. Prior to 4.5.128, 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.specfromfilelocation and immediately executes module-level code via spec.loader.execmodule() 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. This vulnerability is fixed in 4.5.128.

MITRE

Affected Software

2 affected componentsFixes available
pip/praisonai<4.5.128
4.5.128
Praison PraisonAI<4.5.128

Event History

Apr 10, 2026
CVE Published
via MITRE·04:46 PM
Data Sourced
via MITRE·04:46 PM
DescriptionSeverityWeakness
Data Sourced
via NVD·05:17 PM
DescriptionSeverityWeakness
Data Sourced
via NVD·05:17 PM
Affected Software
Advisory Published
via GitHub·07:26 PM
Data Sourced
via GitHub·07:26 PM
DescriptionSeverityWeaknessAffected Software
Free Weekly Intel

Don't miss critical vulnerabilities

Join thousands of security professionals who receive our weekly digest of trending CVEs, zero-days, and exploited vulnerabilities.

No spam. Unsubscribe anytime.

Frequently Asked Questions

1

What is the severity of CVE-2026-40156?

CVE-2026-40156 has a high severity due to the potential for arbitrary code execution.

2

How do I fix CVE-2026-40156?

To mitigate CVE-2026-40156, upgrade PraisonAI to version 4.5.128 or later.

3

What causes CVE-2026-40156?

CVE-2026-40156 is caused by the automatic loading of `tools.py` from the current working directory, which can lead to the execution of malicious code.

4

Who is affected by CVE-2026-40156?

Users of PraisonAI versions prior to 4.5.128 are affected by CVE-2026-40156.

5

What is the impact of CVE-2026-40156?

The impact of CVE-2026-40156 includes the risk of unauthorized execution of code leading to potential data compromise.

Contact

SecAlerts Pty Ltd.
132 Wickham Terrace
Fortitude Valley,
QLD 4006, Australia
info@secalerts.co
By using SecAlerts services, you agree to our services end-user license agreement. This website is safeguarded by reCAPTCHA and governed by the Google Privacy Policy and Terms of Service. All names, logos, and brands of products are owned by their respective owners, and any usage of these names, logos, and brands for identification purposes only does not imply endorsement. If you possess any content that requires removal, please get in touch with us.
© 2026 SecAlerts Pty Ltd.
ABN: 70 645 966 203, ACN: 645 966 203