Skip to main content

Boteraser | Website and Server Security Solutions

🛡️ CVE-2026-44339 — praisonai

🟠 CVSS 8.0 — High ⚠️ Exploit Public CWE-470 OSV
8.0
CVSS Score
0 Low4 Medium7 High9 Critical10

Description

PraisonAI has unsafe tool resolution in ToolExecutionMixin.execute_tool: undeclared __main__ callables execute

Summary

praisonaiagents resolves unresolved tool names against module globals and __main__ after it fails to match the declared tool list and the registry. With the default agent configuration, _perm_allow is None, so undeclared non-dangerous tool names are not rejected by the permission gate. An attacker who can influence tool-call names can therefore invoke unintended application callables that were never declared as tools.

Details

The vulnerable resolution path is in [[tool_execution.py](https://github.com/Users/shmulc/Documents/Codex/2026-05-03/please-go-over-tmp-tp-advisories/repos/PraisonAI/src/praisonai-agents/praisonaiagents/agent/tool_execution.py:734)](/Users/shmulc/Documents/Codex/2026-05-03/please-go-over-tmp-tp-advisories/repos/PraisonAI/src/praisonai-agents/praisonaiagents/agent/tool_execution.py:734). After searching declared tools and the registry, execution falls back to globals() and then __main__:

```python

func = None

for tool in self.tools if isinstance(self.tools, (list, tuple)) else []:

...

if func is None:

try:

from ..tools.registry import get_registry

registry = get_registry()

func = registry.get(function_name)

except ImportError:

pass

if func is None:

func = globals().get(function_name)

if not func:

import __main__

func = getattr(__main__, function_name, None)

```

If a callable is found, it is executed directly:

```python

elif callable(func):

casted_arguments = self._cast_arguments(func, arguments)

return func(**casted_arguments)

```

The permission gate does not enforce a declared-tool allowlist by default. In [[tool_execution.py](https://github.com/Users/shmulc/Documents/Codex/2026-05-03/please-go-over-tmp-tp-advisories/repos/PraisonAI/src/praisonai-agents/praisonaiagents/agent/tool_execution.py:550)](/Users/shmulc/Documents/Codex/2026-05-03/please-go-over-tmp-tp-advisories/repos/PraisonAI/src/praisonai-agents/praisonaiagents/agent/tool_execution.py:550), execution is only rejected if _perm_allow is non-None:

```python

if self._perm_deny and function_name in self._perm_deny:

return {"error": f"Tool '{function_name}' blocked by permission policy", "permission_denied": True}

if self._perm_allow is not None and function_name not in self._perm_allow:

return {"error": f"Tool '{function_name}' not in allowed tools list", "permission_denied": True}

```

Default agent initialization sets _perm_allow = None, which means "allow all" rather than "allow only declared tools" in [[agent.py](https://github.com/Users/shmulc/Documents/Codex/2026-05-03/please-go-over-tmp-tp-advisories/repos/PraisonAI/src/praisonai-agents/praisonaiagents/agent/agent.py:1749)](/Users/shmulc/Documents/Codex/2026-05-03/please-go-over-tmp-tp-advisories/repos/PraisonAI/src/praisonai-agents/praisonaiagents/agent/agent.py:1749):

```python

self._perm_deny = frozenset() # Permission tier deny set (empty = no denials)

self._perm_allow = None # Permission tier allow set (None = allow all)

```

The project's own tests confirm that default agents have no allowlist and that undeclared custom tool names pass approval:

  • [[test_permissions.py](https://github.com/Users/shmulc/Documents/Codex/2026-05-03/please-go-over-tmp-tp-advisories/repos/PraisonAI/src/praisonai-agents/tests/unit/test_permissions.py:56)](/Users/shmulc/Documents/Codex/2026-05-03/please-go-over-tmp-tp-advisories/repos/PraisonAI/src/praisonai-agents/tests/unit/[test_permissions.py](https://github.com/Users/shmulc/Documents/Codex/2026-05-03/please-go-over-tmp-tp-advisories/repos/PraisonAI/src/praisonai-agents/tests/unit/test_permissions.py:142):56) asserts that a default Agent has _perm_allow is None.
  • [test_permissions.py](/Users/shmulc/Documents/Codex/2026-05-03/please-go-over-tmp-tp-advisories/repos/PraisonAI/src/praisonai-agents/tests/unit/test_permissions.py:142) explicitly checks that agent._check_tool_approval_sync("my_custom_tool", {}) passes for an undeclared tool name.

Empirical verification:

I verified the bypass locally on commit d8a8a786915dc67a7c3021e24f72458f2eac5d9c (v4.6.35) by defining a callable only in __main__, giving the agent an empty tools list, and invoking execute_tool() with that undeclared name. The tool executor ran the __main__ function anyway.

PoC

Environment

  • Repo: MervinPraison/PraisonAI
  • Commit: d8a8a786915dc67a7c3021e24f72458f2eac5d9c
  • Verified against PyPI package versions available on May 3, 2026:
  • praisonaiagents 1.6.35
  • PraisonAI 4.6.35
  • Python 3

Steps

1. From the repository root, run:

```bash

python3 - <<'PY'

import sys

from unittest.mock import MagicMock, patch

sys.path.insert(0, '/Users/shmulc/Documents/Codex/2026-05-03/please-go-over-tmp-tp-advisories/repos/PraisonAI/src/praisonai-agents')

from praisonaiagents.agen

How this vulnerability can be exploited

This issue can be reached over the network, attack complexity is low, an attacker needs no privileges on the target. No user interaction is required. The scope is unchanged, so the impact stays within the vulnerable component. Rated impact: confidentiality low, integrity high, availability low.

CVSS metrics in full

The score comes from this vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:H/A:L

  • Attack vector: Network — reachable from anywhere that can route to the service.
  • Attack complexity: Low — the attack works reliably, with no preparation.
  • Privileges required: None — an unauthenticated stranger can try it.
  • User interaction: None — nobody has to be tricked into anything.
  • Scope: Unchanged — the damage stays inside the vulnerable component.
  • Confidentiality impact: Low — limited, and the attacker does not choose what is affected.
  • Integrity impact: High — total loss, or loss the attacker controls.
  • Availability impact: Low — limited, and the attacker does not choose what is affected.

Weakness class

CVE-2026-44339 is classified as CWE-470: Unsafe Reflection. Input selects which class or method to invoke, letting an attacker reach code that was never meant to be callable.

Affected software

CVE-2026-44339 is recorded against 2 packages.

  • praisonai (fixed in 4.6.37)
  • praisonaiagents (fixed in 1.6.37)

Timeline and source

Published on 13 July 2026. A public exploit is known to exist, which raises the urgency of patching considerably. Record sourced from OSV.

References

github.com (Web)
nvd.nist.gov (Advisory)
github.com (Package)
pypi.org (Package)
github.com (Advisory)

Other advisories for this package

praisonai has other advisories on record. If you are patching this one, these are worth checking on the same host:

Same weakness in other software

These advisories are the same class of weakness (CWE-470: Unsafe Reflection) in other software:

Details

Severity HIGH
CVSS Score 8.0
CVSS Vector CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:H/A:L
CWE CWE-470
Public Exploit ⚠️ Yes
Source OSV
Published 2026-07-13
Updated 2026-08-20
Modified 2026-07-13
Fix URL N/A

Affected Packages

Software From version Fixed in
praisonai 4.6.37
praisonaiagents 1.6.37

Similar Threats

Exploit Protection

Are you running praisonai?

CVE-2026-44339 carries CVSS 8.0 High rating and a public exploit already exists. BotEraser checks your installation against this and other known CVE records, and blocks IPs associated with exploit activity.

Check My Site For CVE-2026-44339 →

No credit card required  ·  Results in minutes

ⓘ Data Notice: The information presented above has been compiled from publicly available internet sources. Boteraser aggregates this data solely for informational purposes and does not independently classify, evaluate, or endorse any findings about the vulnerabilities listed. The accuracy and completeness of this information is the sole responsibility of the original publishers. Boteraser and its operators accept no liability for any decisions made based on this data.

Browse related advisories

All advisoriesCVECVE 2026