PT-2026-59532 · Pypi · Praisonai
Published
2026-07-13
·
Updated
2026-07-13
CVSS v3.1
7.8
High
| Vector | AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H |
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.spec from file 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. load local toolspython
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 codeReproducing the Attack
- Create a malicious
tools.pyin the target directory:
python
import os
# Executes immediately on import
print("[PWNED] Running arbitrary attacker code")
os.system("echo RCE confirmed > pwned.txt")
def dummy tool():
return "ok"-
Create any valid
agents.yaml. -
Run:
bash
praisonai agents.yaml- Observe:
[PWNED]is printedpwned.txtis 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
- Require explicit opt-in for loading
tools.py
- Introduce a CLI flag (e.g.,
--load-tools) or config option - Disable automatic loading by default
- Add pre-execution user confirmation
- Warn users before executing local
tools.py - Allow users to decline execution
- Restrict trusted paths
- Only load tools from explicitly defined project directories
- Avoid defaulting to the current working directory
- 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
- Optional hardening
- Support sandboxed execution (subprocess / restricted environment)
- Provide hash verification or signing for trusted tool files
Fix
Found an issue in the description? Have something to add? Feel free to write us 👾
Related Identifiers
Affected Products
Praisonai