T05 · Unauthorized Access and Privilege Escalation
- Location
scripts/authorize.py:34- Finding
Overprivileged Shared Bearer Credential and Unrestricted MCP Tool Dispatch
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill appears to do its advertised classroom image-generation job, but it asks for and can use broader Beatra account authority than that job requires and can silently replace its own files.
Install only if you are comfortable giving this Beatra package a shared, reusable account token with authority beyond still-image generation, including other media and wallet-spend scope. Disable automatic updates with scripts/mcp_client.py update --auto off if you need reviewed code to stay fixed, and avoid approving the device authorization on machines where other local users or processes could read your profile files.
scripts/authorize.py:34Overprivileged Shared Bearer Credential and Unrestricted MCP Tool Dispatch
scripts/mcp_client.py:941Silent Remote Replacement of Executable Package Files Without Independent Release Signatures
scripts/authorize.py:340Unnecessary Collection, Persistence, and Transmission of Host Identification Data
scripts/mcp_client.py:1044Windows Credential File Permissions Are Neither Created Nor Validated
The scope set includes videos:generate, music:generate, speech:generate, voices:read, and voices:write even though the skill is described as producing still mind map pages. These unrelated capabilities expand what the skill can do if compromised or repurposed and are not justified by the advertised use case.
The skill also references uninstall/disconnect workflows that read and modify local application state, access credential files, contact remote APIs to revoke authorization, and delete package state. Embedding system-management behavior in a skill advertised for producing classroom graphics increases the chance of unexpected destructive actions and makes the overall package harder to audit safely.
The skill also references uninstall/disconnect workflows that read and modify local application state, access credential files, contact remote APIs to revoke authorization, and delete package state. Embedding system-management behavior in a skill advertised for producing classroom graphics increases the chance of unexpected destructive actions and makes the overall package harder to audit safely.
The skill also references uninstall/disconnect workflows that read and modify local application state, access credential files, contact remote APIs to revoke authorization, and delete package state. Embedding system-management behavior in a skill advertised for producing classroom graphics increases the chance of unexpected destructive actions and makes the overall package harder to audit safely.
The changelog mentions balance and ledger calls, which are financially sensitive capabilities unrelated to generating classroom unit maps. This strong mismatch suggests hidden account or payment functionality that could be used to inspect billing data or facilitate unauthorized financial actions under the cover of a benign educational tool.
Referencing a local credential file for device-bearer authentication means the skill is configured to operate with reusable account credentials. In the context of a simple map-generation skill, this is unnecessarily powerful and increases the risk of credential misuse, unauthorized API access, and exposure of account-linked data if the remote MCP server is abused or overprivileged.
},
"mcp": {
"authentication": "device-bearer",
"credential_file": "~/.beatra/credentials.json",
"name": "beatra",
"transport": "streamable-http",
"url": "https://mcp.beatra.ai/mcp"
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
They share the one full-scope Device Token stored in
`~/.beatra/credentials.json`. Installing or switching packages must not trigger
another authorization when that credential is already valid. Do not add,
enable, trust, or configure a host Beatra Connector. Never print or move the
token into command arguments, environment variables, logs, chat, or another
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
They share the one full-scope Device Token stored in
`~/.beatra/credentials.json`. Installing or switching packages must not trigger
another authorization when that credential is already valid. Do not add,
enable, trust, or configure a host Beatra Connector. Never print or move the
token into command arguments, environment variables, logs, chat, or another
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
They share the one full-scope Device Token stored in
`~/.beatra/credentials.json`. Installing or switching packages must not trigger
another authorization when that credential is already valid. Do not add,
enable, trust, or configure a host Beatra Connector. Never print or move the
token into command arguments, environment variables, logs, chat, or another
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
They share the one full-scope Device Token stored in
`~/.beatra/credentials.json`. Installing or switching packages must not trigger
another authorization when that credential is already valid. Do not add,
enable, trust, or configure a host Beatra Connector. Never print or move the
token into command arguments, environment variables, logs, chat, or another
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
```
They share the one full-scope Device Token stored in
`~/.beatra/credentials.json`. Installing or switching packages must not trigger
another authorization when that credential is already valid. Do not add,
enable, trust, or configure a host Beatra Connector. Never print or move the
token into command arguments, environment variables, logs, chat, or another
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
```
They share the one full-scope Device Token stored in
`~/.beatra/credentials.json`. Installing or switching packages must not trigger
another authorization when that credential is already valid. Do not add,
enable, trust, or configure a host Beatra Connector. Never print or move the
token into command arguments, environment variables, logs, chat, or another
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
```
They share the one full-scope Device Token stored in
`~/.beatra/credentials.json`. Installing or switching packages must not trigger
another authorization when that credential is already valid. Do not add,
enable, trust, or configure a host Beatra Connector. Never print or move the
token into command arguments, environment variables, logs, chat, or another
The requested OAuth scope set is far broader than the stated function of generating still unit mind map pages. It includes media-generation, task control, artifact access, and wallet-related permissions, so if the credential is issued or later misused, the skill gains authority well beyond its educational purpose, violating least privilege and increasing blast radius.
The scope set includes videos:generate, music:generate, speech:generate, voices:read, and voices:write even though the skill is described as producing still mind map pages. These unrelated capabilities expand what the skill can do if compromised or repurposed and are not justified by the advertised use case.
This client contains broad self-update and installation telemetry functionality that is unrelated to the advertised classroom unit-map purpose. The update path downloads and replaces package files at runtime, materially expanding the trust boundary from local skill logic to remote discovery, manifest, and archive infrastructure; if that supply chain is compromised, arbitrary package code can be deployed locally.
The code fingerprints the host environment and persistently records installation/usage metadata in local files and sends registration telemetry to a remote service. For a classroom mapping skill, this data collection is unnecessary and increases privacy and tracking risk, especially because it is performed automatically and best-effort on normal operations rather than behind explicit user consent.
The skill includes built-in self-modification through an update command and background auto-update logic, allowing it to replace its own installed files. Self-modifying capability is especially risky in a skill whose stated purpose is simple content generation, because it creates a persistent code execution and supply-chain expansion path unrelated to the business function.
)
update = subparsers.add_parser(
"update",
help="Check, install, or configure Beatra package self-updates",
)
update.add_argument(
"--check",
The skill is described as generating unit mind-map pages, but the uninstall script manages a shared device connection, evaluates other installed skills, and may revoke remote authorization. Those actions are security-sensitive and materially exceed what is justified by the skill's stated classroom content purpose, creating a supply-chain style trust boundary violation if users install the skill expecting only local content generation.
The script explicitly targets credentials.json and other shared state files for deletion as part of uninstall. For a unit-map skill, access to shared credential material is unnecessary and dangerous because compromise, misuse, or logic errors in this package can affect authentication state beyond the package itself.
#: these and then removes the directory only if it is empty — the script
#: never recursively deletes a directory it does not fully understand.
_STATE_FILES = (
"credentials.json",
"installation.json",
"host.json",
"skills.json",
This code performs network-capable token revocation and deletes shared local state files under ~/.beatra, including credentials and installation metadata. Even though the code tries to be conservative, bundling credential lifecycle control into a content-oriented skill increases the blast radius of uninstall and enables unintended denial of service or credential interference affecting other skills on the device.
The _device_token function reads an access token from shared credentials.json for use in remote revocation. Reading bearer tokens inside a skill package is highly sensitive and unjustified by the manifest's educational mapping purpose; if abused or extended, it could enable unauthorized API actions or account/device disruption.
def _device_token(state_dir: Path) -> str | None:
path = state_dir / "credentials.json"
try:
value = json.loads(path.read_text(encoding="utf-8"))
except (OSError, ValueError):
The skill declares no explicit tool scope even though its instructions invoke shell, local file access, networked APIs, and package update behavior. Without a restrictive allowlist, a host or agent may grant broader capabilities than users expect, increasing the blast radius for misuse or prompt-injection-driven actions.
The skill includes an automatic self-update mechanism that can download and replace local package files, which is unrelated to generating mind-map images and expands the trust boundary to remote update infrastructure. Even with verification claims, silent code replacement creates a supply-chain risk and can change behavior after review, undermining user expectations and static analysis.
The documentation says newer versions install automatically without separate confirmation, but this material behavior is not disclosed in the top-level summary where users decide whether to invoke the skill. Hidden silent updates reduce informed consent and can expose users to changed code paths, permissions, or network behavior after they approved an earlier version.