PraisonAI Vulnerable to RCE via Automatic tools.py ImportGHSA-g985-wjh9-qxxc
HIGHGHSA-g985-wjh9-qxxc is a high-severity (CVSS 8.4) Code Injection vulnerability in praisonaiagents. A fix is available for praisonaiagents — see the affected versions and patch details below.
Exploitation Status
Proof-of-concept exploit code exists
- CISA’s SSVC triage found public proof-of-concept exploit code for this CVE, though no confirmed active exploitation.
- A successful exploit gives an attacker total control of the affected component, not partial access.
Exploitation and automatability from CISA’s SSVC triage for GHSA-g985-wjh9-qxxc.
EPSS Exploitation Probability
Probability of exploitation in the next 30 days, from FIRST.org EPSS.
How urgent is this, really
Where this sits among everything scored
Real-World Exposure
praisonaiagents🐍praisonaiReal-time download stats are indexed for npm and PyPI packages. This vulnerability affects PyPI packages — download data is not available via public APIs for these ecosystems.
Description
PraisonAI automatically imports ./tools.py from the current working directory when launching certain components. This includes call.py, tool_resolver.py, and CLI tool-loading paths.
A malicious tools.py placed in the process working directory is executed immediately, allowing arbitrary Python code execution in the host environment.
Affected Code
- call.py →
import_tools_from_file() - tool_resolver.py →
_load_local_tools() - tools.py → local tool import flow
PoC
Create tools.py in the directory where PraisonAI is launched:
# tools.py
import os
os.system("echo pwned > /tmp/pwned.txt")
Run any PraisonAI component that loads local tools, for example:
praisonai workflow run safe.yaml
Reproduction Steps
- Create a malicious tools.py in the current working directory.
- Start PraisonAI or invoke a CLI command that loads local tools.
- Verify that
/tmp/pwned.txtor the malicious command output exists.
Impact
An attacker who can place or influence tools.py in the working directory can execute arbitrary code in the PraisonAI process, compromising the host and any connected data.
Reporter: Lakshmikanthan K (letchupkt)
Affected Packages
| Ecosystem | Package | Vulnerable range | Fix |
|---|---|---|---|
| 🐍PyPI | praisonaiagents | all versions | 1.5.140pip install --upgrade 'praisonaiagents==1.5.140' |
| 🐍PyPI | praisonai | all versions | 4.5.139pip install --upgrade 'praisonai==4.5.139' |
Affected Products
praisonaipraisonpraisonaiagentspraisonDetection & mitigation playbook
Open-source dependencyDetect
Scan your dependency tree (package-lock.json, pnpm-lock.yaml, requirements.txt, go.sum, etc.) for praisonaiagents, including transitive dependencies — a direct dependency you never call can still pull in a vulnerable version.
Fix
Update praisonaiagents to 1.5.140 or later, then make sure no transitive (indirect) dependency still pins the vulnerable range — O3 confirms GHSA-g985-wjh9-qxxc is resolved across your whole dependency graph.
Workarounds
Stop passing untrusted input into the interpreter or shell: call the affected binary with an argument array rather than a composed command string, reject anything outside a strict allowlist of expected values, and run the component under an account that cannot reach beyond the work it legitimately does.
Frequently Asked Questions
Is GHSA-g985-wjh9-qxxc in your dependencies?
Find it across PyPI, including transitive dependencies.