T05 · Unauthorized Access and Privilege Escalation
- Location
scripts/authorize.py:34- Finding
Excessive OAuth Scope and Unrestricted MCP Tool Dispatch
- Content
View full analysis
dict[str, Any]: session = _session_with_registration( state_dir=Path.home() / ".beatra", post_json=_default_post_json, ) if command == "tools": return session.request(2, "tools/list", {}) try: arguments = json.load(os.sys.stdin) except json.JSONDecodeError as exc: raise RuntimeError("Tool arguments on stdin must be one JSON object") from exc if not isinstance(arguments, dict): raise RuntimeError("Tool arguments on stdin must be one JSON object") assert tool_name is not None return session.request( 2, "tools/call", {"name": tool_name, "arguments": arguments}, ) ``` ```python call = subparsers.add_parser("call", help="Call one tool with a JSON object on stdin") call.add_argument("tool_name") ``` ### Technical Analysis The declared function is a civil-affairs speech-generation workflow with optional voice cloning. Nevertheless, authorization requests unrelated image, video, and music generation privileges, wallet spending authority, artifact access, and task cancellation. The command interface accepts an arbitrary `tool_name` and forwards it directly to MCP without a local allowlist. Consequently, the client itself does not enforce the narrower set of operations described by the Skill instructions. Source attribution added elsewhere in the client does not constitute access control. This breaks ...[truncated 1249 chars]- Remediation
View remediation
