The fix for GHSA-9mqq-jqxf-grvw / CVE-2026-44336 is incomplete. The original advisory description named four vulnerable handlers in mcp_server/adapters/cli_tools.py:
"registers four file-handling tools by default,
praisonai.rules.create,praisonai.rules.show,praisonai.rules.delete, andpraisonai.workflow.show. Each accepts a path or filename string from MCPtools/callarguments… with no containment check."
Commit 68cc9427 ("fix(security): harden MCP rules path handling…") added a _resolve_rule_path() helper and applied it to rules.create, rules.show, and rules.delete. workflow.show was left unchanged. Two adjacent handlers in the same file have the same pattern, workflow.validate and deploy.validate. Neither was mentioned in the original advisory. Both remain unchanged.
The original advisory also identified the dispatcher (server.py:281-298) as a root cause. It accepts unvalidated **kwargs from params["arguments"] with no enforcement against the tool's declared input_schema. That code is unchanged in HEAD as of commit 42221210.
Result: A single unauthenticated MCP tools/call to praisonai.workflow.show returns the contents of any file the host user can read: /etc/passwd, ~/.ssh/id_rsa, ~/.aws/credentials, or any project .env.
src/praisonai/praisonai/mcp_server/adapters/cli_tools.py:
| Lines | Tool | Bug |
|-------|------|-----|
| 63-73 | praisonai.workflow.show | Returns the full contents of any file the host user can read |
| 42-61 | praisonai.workflow.validate | Reads any path; YAML parser error messages leak file existence + content fragments |
| 415-432 | praisonai.deploy.validate | Same pattern as workflow.validate. The config_path="deploy.yaml" default does not constrain the input. |
src/praisonai/praisonai/mcp_server/server.py:281-298, _handle_tools_call:
async def _handle_tools_call(self, params: Dict[str, Any]) ->...
4.6.40Exploitability
AV:NAC:LAT:NPR:NUI:NVulnerable System
VC:HVI:NVA:NSubsequent System
SC:NSI:NSA:N8.7/CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N