T05 · Unauthorized Access and Privilege Escalation
- Location
scripts/authorize.py:34- Finding
Image-Only Skill Requests Excessive Full-Service Authorization Scope
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This image-generation skill is not clearly malicious, but it needs Review because it uses a broad reusable Beatra token and silently self-updates executable package files.
Install only if you are comfortable giving this Beatra package a shared, broad device token and allowing default silent updates of its local scripts. Before use, consider disabling auto-update with the documented update --auto off command and review the Beatra authorization page/scopes carefully; revoke the device in the Beatra Console if you no longer trust the package.
scripts/authorize.py:34Image-Only Skill Requests Excessive Full-Service Authorization Scope
scripts/mcp_client.py:1474Bundled MCP Client Allows Arbitrary Tool Invocation with a Privileged Token
scripts/authorize.py:341Authorization Collects and Transmits Hostname and Agent-Environment Telemetry
scripts/mcp_client.py:939Silent Default Self-Update Allows Post-Review Replacement of Executable Skill Files
The skill references uninstall/disconnect behavior that reads and modifies local state, revokes authorization, and deletes credentials, which is unrelated to producing gallery stills. Bundling lifecycle-management actions into a creative-production skill broadens local-system impact and creates risk of unintended state changes or destructive actions under an unexpected trust model.
The skill references uninstall/disconnect behavior that reads and modifies local state, revokes authorization, and deletes credentials, which is unrelated to producing gallery stills. Bundling lifecycle-management actions into a creative-production skill broadens local-system impact and creates risk of unintended state changes or destructive actions under an unexpected trust model.
The skill references uninstall/disconnect behavior that reads and modifies local state, revokes authorization, and deletes credentials, which is unrelated to producing gallery stills. Bundling lifecycle-management actions into a creative-production skill broadens local-system impact and creates risk of unintended state changes or destructive actions under an unexpected trust model.
Referenced artifact was not completely inspected
Submit once through bundled `scripts/mcp_client.py`. Poll
Referenced artifact was not completely inspected
Submit once through bundled `scripts/mcp_client.py`. Poll
Referenced artifact was not completely inspected
Submit once through bundled `scripts/mcp_client.py`. Poll
Referenced artifact was not completely inspected
Submit once through bundled `scripts/mcp_client.py`. Poll
Referenced artifact was not completely inspected
Submit once through bundled `scripts/mcp_client.py`. Poll
Referenced artifact was not completely inspected
Submit once through bundled `scripts/mcp_client.py`. Poll
Referenced artifact was not completely inspected
Submit once through bundled `scripts/mcp_client.py`. Poll
The manifest explicitly references a local credential file (~/.beatra/credentials.json) for device-bearer authentication to a remote MCP endpoint. Even though this is normal integration metadata, exposing or depending on local bearer-token material increases the risk that a skill can cause authenticated actions or access account data if the runtime grants it MCP tool access without strong scoping and consent.
},
"mcp": {
"authentication": "device-bearer",
"credential_file": "~/.beatra/credentials.json",
"name": "beatra",
"transport": "streamable-http",
"url": "https://mcp.beatra.ai/mcp"
The file describes a bundled client that silently checks for, downloads, and installs software updates, which is unrelated to the skill's stated purpose of generating crowdfunding gallery stills. Even with integrity checks and rollback protections, embedding self-updating system-modifying behavior in a content-generation skill expands the attack surface and creates an unnecessary path for code changes on the user's machine.
Silent automatic download and installation is especially risky because it changes local software without a separate user action, which is unjustified for a gallery-still generation skill. A compromised update channel, implementation flaw, or misconfiguration could lead to unauthorized code deployment while the user expects only media-generation assistance.
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 OAuth scope string requests a very broad set of privileges, including artifacts write/read, videos, music, speech, voices read/write, wallet spending, and task cancellation, which are not necessary for a skill described as generating crowdfunding gallery stills. Over-scoped authorization violates least privilege and turns compromise or misuse of this skill into cross-capability account abuse, including possible spending and access to unrelated user assets.
The authorization flow operationalizes the excessive scope request by obtaining and persisting a bearer token with capabilities far beyond the stated gallery-still purpose. Because the code stores and validates this multi-purpose credential as the shared live credential for the skill, any later use of the token can exercise unrelated high-risk functions such as wallet spending or non-image media generation.
This code persists a bearer access token in a JSON file on disk under the user's home directory. Although POSIX permissions are tightened, storing a high-privilege token with broad scopes in plaintext materially increases the blast radius of local compromise, backup leakage, or accidental disclosure, especially because the token authorizes capabilities unrelated to this skill's 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 includes a full self-update and installation-management subsystem that is unrelated to the advertised purpose of generating crowdfunding gallery stills. Even though there are integrity checks, this dramatically expands the trust boundary: a creative skill can download and replace its own local package files, creating a software supply-chain and persistence mechanism that is much more dangerous in this context because users would not expect filesystem-modifying installer behavior from an image-generation skill.
The exposed update command enables the package to replace its own installed code, i.e., self-modification. In the context of a gallery-still skill, self-modifying behavior is especially dangerous because it enables persistence and post-install behavior changes outside the narrow expected feature set, and any compromise of the update channel would directly become arbitrary code deployment.
)
update = subparsers.add_parser(
"update",
help="Check, install, or configure Beatra package self-updates",
)
update.add_argument(
"--check",