T05 · Unauthorized Access and Privilege Escalation
- Location
scripts/authorize.py:34- Finding
Over-Privileged Device Authorization and Unrestricted MCP Tool Dispatch
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill matches its voice-pack purpose, but it also asks for broad Beatra account powers and silently installs package updates, so it needs review before installation.
Install only if you are comfortable giving this Beatra package a shared account token with broad media, artifact, task, and spending capabilities. Disable automatic updates before use if you need reviewed code to stay fixed, and be careful with staff voice samples because uploads depend on destinations returned by the Beatra service.
scripts/authorize.py:34Over-Privileged Device Authorization and Unrestricted MCP Tool Dispatch
scripts/mcp_client.py:969Silent Automatic Retrieval and Installation of Mutable Remote Code
scripts/mcp_client.py:241Local File Upload Grants Permit Arbitrary HTTPS Destination Hosts
scripts/authorize.py:362Collection and Transmission of Hostname and Persistent Environment Telemetry
Granting mcp:tools, tasks:read, tasks:cancel, and broad artifact permissions gives the skill generalized operational control outside its narrow table-to-voice purpose. In context, that makes the package much more dangerous because a user authorizing a simple voice skill would not reasonably expect broad tool and task authority.
The references indicate the package can perform uninstall/disconnect behavior, inspect shared installation state, manipulate files under ~/.beatra, and potentially revoke tokens over the network, none of which is implied by a simple audio-pack skill. Administrative lifecycle operations bundled into the same trust envelope make accidental or malicious misuse more damaging.
The references indicate the package can perform uninstall/disconnect behavior, inspect shared installation state, manipulate files under ~/.beatra, and potentially revoke tokens over the network, none of which is implied by a simple audio-pack skill. Administrative lifecycle operations bundled into the same trust envelope make accidental or malicious misuse more damaging.
The references indicate the package can perform uninstall/disconnect behavior, inspect shared installation state, manipulate files under ~/.beatra, and potentially revoke tokens over the network, none of which is implied by a simple audio-pack skill. Administrative lifecycle operations bundled into the same trust envelope make accidental or malicious misuse more damaging.
Allowing automatic remote update checks, downloads, verification, and installation is not justified by the stated skill purpose and materially increases supply-chain exposure. Even with signature checks, silent code replacement changes what the skill can do after approval and can be abused if the update channel or trust root is compromised.
The explicit use of a credential file containing bearer authentication is a real credential-exposure and over-privilege concern. Bearer tokens grant access to whoever can read or misuse them, and a content-generation skill with a narrow stated function should not need broad reusable account credentials without strong justification.
},
"mcp": {
"authentication": "device-bearer",
"credential_file": "~/.beatra/credentials.json",
"name": "beatra",
"transport": "streamable-http",
"url": "https://mcp.beatra.ai/mcp"
The file documents a self-updating client that checks for releases, downloads packages, and replaces installed files, which is unrelated to the declared credit-rights voice-clip functionality. In a skill whose stated purpose is audio generation, hidden or extraneous update/install behavior materially increases attack surface and suggests the package may perform privileged local state changes beyond user expectations.
The documentation explicitly states that the client silently checks for updates and automatically installs them without separate confirmation. For a voice studio skill, unsolicited downloading and replacement of local package files is an unjustified capability that could enable unexpected code changes, persistence, or compromise if the update channel or implementation is ever abused.
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 OAuth scope bundle grants far more authority than a voice-clip skill needs, including generic MCP tools, artifact access, media generation, task control, and wallet spending. This violates least privilege and means authorizing the skill effectively gives it a broad account token that could be abused if the skill code, package, or downstream service is compromised.
Granting mcp:tools, tasks:read, tasks:cancel, and broad artifact permissions gives the skill generalized operational control outside its narrow table-to-voice purpose. In context, that makes the package much more dangerous because a user authorizing a simple voice skill would not reasonably expect broad tool and task authority.
Granting mcp:tools, tasks:read, tasks:cancel, and broad artifact permissions gives the skill generalized operational control outside its narrow table-to-voice purpose. In context, that makes the package much more dangerous because a user authorizing a simple voice skill would not reasonably expect broad tool and task authority.
This code writes a long-lived bearer access token to credentials.json on disk. Although it uses restrictive permissions, the token embodies the overly broad scopes requested by the skill, so any local compromise of the file yields extensive account capabilities beyond the skill's advertised purpose.
scope = _required_string(polled, "scope")
if set(scope.split()) != set(SCOPE.split()):
raise RuntimeError("Beatra authorization returned an unsupported scope")
credential_path = state_dir / "credentials.json"
_atomic_json(
credential_path,
{
The client contains substantial behavior unrelated to its stated voice-pack purpose: package self-update, installation registration, and local inventory tracking. This violates least functionality and expands the trust boundary, meaning a skill ostensibly for audio generation can modify its own codebase and transmit installation metadata, increasing the blast radius if the vendor endpoint or update channel is compromised.
The skill writes a local inventory of installed skills and sends installation registration telemetry that is unrelated to generating voice clips. This introduces persistent tracking and cross-skill visibility on the host, which can reveal user activity and expand the consequences of compromise beyond this single package.
The exposed self-update capability enables the package to replace its own installed files, which is a self-modifying behavior atypical for the declared voice-clip function. In skill context, this is more dangerous because the package can evolve into materially different code after installation, creating a supply-chain and persistence risk if the update source, manifests, or operator trust are ever compromised.
)
update = subparsers.add_parser(
"update",
help="Check, install, or configure Beatra package self-updates",
)
update.add_argument(
"--check",
The uninstall script is tightly coupled to shared Beatra device credentials and remote revocation logic, which is unrelated to the declared skill purpose of generating credit-rights voice clips. A skill whose advertised function is content generation should not need to inspect shared skill inventory or manage cross-skill authentication state, making this a strong indicator of hidden platform-control behavior.
The script enumerates and later deletes files in a shared ~/.beatra state directory, including credentials, installation metadata, host configuration, and registrations. For a skill described as converting a benefits table into audio clips, access to shared platform state is unnecessary and dangerous because it gives the package influence over other skills’ connectivity and local authorization material.
Referencing credentials.json as part of the set of files the skill may remove indicates awareness of and intended interaction with stored authentication material. In the context of a voice-generation skill, any credential access is highly suspicious because it expands the skill’s scope into privileged account and device control.
#: 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 an authenticated network request to revoke a device token at a central API endpoint. That is a privileged action affecting the device’s shared authorization state, and it is not justified by the skill’s advertised voice-pack workflow; if triggered unexpectedly, it could disrupt all other installed skills using the same connection.