Back to skill

Security audit

douyin-cover-maker

Security checks for vulnerabilities and agentic risk

Overview

The skill can make Douyin covers, but it also requests broad Beatra account powers, stores a shared token, and silently updates local code, so it should be reviewed before installation.

Install only if you are comfortable granting Beatra a broad shared device authorization that can cover paid media operations beyond still-image covers. Consider disabling automatic updates with the documented update command, review Beatra account billing controls, and avoid uploading private or unreleased images unless you trust the Beatra service and storage path.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
Findings (2)

T05 · Unauthorized Access and Privilege Escalation

Error
Location
scripts/authorize.py:33
Finding

Overprivileged OAuth Scope Combined with 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 purpose of this Skill is to generate, transform, and edit Douyin cover images. Its minimum legitimate permissions therefore concern image operations, selected artifact uploads, and associated task management. The requested token additionally grants: - Video generation - Music generation - Speech generation - Voice read and write access - Wallet spending - Gene ...[truncated 1742 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/mcp_client.py:231
Finding

Server-Controlled Upload URL Is Not Restricted to Approved Storage Hosts

Content
View full analysis
dict[str, str]: structured = result.get("structuredContent") instruction = structured.get("upload") if isinstance(structured, dict) else None if not isinstance(instruction, dict) or instruction.get("method") != "PUT": raise RuntimeError("Beatra upload instructions are invalid") url = instruction.get("url") headers = instruction.get("headers") if not isinstance(url, str) or not isinstance(headers, dict): raise RuntimeError("Beatra upload instructions are invalid") parsed = urllib.parse.urlsplit(url) if ( parsed.scheme != "https" or not parsed.hostname or parsed.username is not None or parsed.password is not None or parsed.fragment ): raise RuntimeError("Beatra upload instructions are invalid") if not all(isinstance(key, str) and isinstance(value, str) for key, value in headers.items()): raise RuntimeError("Beatra upload instructions are invalid") content_type = _header_value(headers, "Content-Type") content_length = _header_value(headers, "Content-Length") if content_type != mime_type or content_length != str(len(content)): raise RuntimeError("Beatra upload instructions are invalid") response = put_bytes(url, dict(headers), content) artifact_id = response.get("artifact_id") if not isinstance(artifact_id, str) or not artifact_id: raise RuntimeError("Beatra upload returned an invalid response") return {"type": "artifact", "artifact_id": artifact_id} ``` ### Technical Analysis The function verifies that the upload URL uses HTTPS and does not include embedded credentials ...[truncated 2027 chars]
Remediation
View remediation
Vulnerability Patterns
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Rogue AgentSelf-Modification, Session Persistence
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (34)

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The skill references uninstall/disconnect behavior that reads local Beatra state, revokes authorization over the network, and deletes local credentials/configuration, which is far outside a user's likely expectation for an image-cover skill. Packaging destructive local-management actions alongside ordinary creative tasks creates unnecessary risk of account disruption or local data loss if invoked mistakenly or abused.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The skill references uninstall/disconnect behavior that reads local Beatra state, revokes authorization over the network, and deletes local credentials/configuration, which is far outside a user's likely expectation for an image-cover skill. Packaging destructive local-management actions alongside ordinary creative tasks creates unnecessary risk of account disruption or local data loss if invoked mistakenly or abused.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The skill references uninstall/disconnect behavior that reads local Beatra state, revokes authorization over the network, and deletes local credentials/configuration, which is far outside a user's likely expectation for an image-cover skill. Packaging destructive local-management actions alongside ordinary creative tasks creates unnecessary risk of account disruption or local data loss if invoked mistakenly or abused.

Content

No source excerpt is available for this finding.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 49)May include surrounding context.

md
Use only this Skill's bundled `scripts/mcp_client.py` for every remote Beatra

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 107)May include surrounding context.

md
Use only this Skill's bundled `scripts/mcp_client.py` for every remote Beatra

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 108)May include surrounding context.

md
Use only this Skill's bundled `scripts/mcp_client.py` for every remote Beatra

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 109)May include surrounding context.

md
Use only this Skill's bundled `scripts/mcp_client.py` for every remote Beatra

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · manifest.json (reported line 62)May include surrounding context.

json
```

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

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · references/installation-and-auth.md (reported line 14)May include surrounding context.

text

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

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · references/installation-and-auth.md (reported line 21)May include surrounding context.

text

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

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · references/installation-and-auth.md (reported line 49)May include surrounding context.

text

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

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · references/mcp-connection.md (reported line 10)May include surrounding context.

text

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

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/authorize.py (reported line 207)May include surrounding context.

python
```

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

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The skill requests a very broad OAuth scope set, including wallet spending, artifact/task access, voice management, and media generation capabilities far beyond what is needed for a Douyin cover maker. Over-privileged authorization increases blast radius: if the skill, its backend, or stored token is abused, an attacker could perform unrelated account actions and consume paid resources.

Content

No source excerpt is available for this finding.

Credential Access

High
Category
Privilege Escalation
Confidence
86% confidence
Finding

The code stores a long-lived bearer access token in a local JSON file under ~/.beatra/credentials.json. Even with restrictive POSIX permissions, file-based bearer-token storage materially increases compromise impact on shared, backed-up, synced, or endpoint-monitored systems, and the token is especially dangerous here because it carries broad account scopes unrelated to the skill’s purpose.

Content

Scanner excerpt · scripts/authorize.py (reported line 514)May include surrounding context.

python
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,
                {

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill client contains a full remote self-update mechanism that downloads manifests and archives, validates them, and replaces local package files, which is unrelated to a Douyin cover-generation skill's declared purpose. Even though there are integrity checks, this materially expands the trust boundary: compromise of the vendor update infrastructure, signing/checksum source, or distribution pipeline would grant code modification capability on the local system.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

This uninstall script performs shared credential lifecycle management and remote device revocation, which is materially unrelated to a Douyin cover-generation skill’s advertised purpose. Even if framed as cleanup logic, it gives the package authority over cross-skill authentication state, creating the ability to disrupt other installed skills or remove shared access unexpectedly.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The script enumerates and later deletes files under ~/.beatra, including shared inventory and registration state, despite the skill being unrelated to account/session administration. Access to and deletion of shared state from within a single skill package is dangerous because it enables cross-package interference and credential/state destruction beyond the skill’s own scope.

Content

No source excerpt is available for this finding.

Credential Access

High
Category
Privilege Escalation
Confidence
96% confidence
Finding

The presence of credentials.json in the managed state set indicates this skill is designed to handle shared credential material during uninstall. For a media-cover creation skill, credential access is out of scope and increases the risk of token exposure, misuse, or destructive cross-skill side effects if the package is tampered with or behaves incorrectly.

Content

Scanner excerpt · scripts/uninstall.py (reported line 40)May include surrounding context.

python
#: 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",

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The code sends a bearer token to a remote revocation endpoint and can invalidate the device authorization for the shared Beatra connection. In the context of a cover-maker skill, this network capability is unnecessary and dangerous because it can terminate access used by other skills and creates a sensitive credential-handling path inside an unrelated package.

Content

No source excerpt is available for this finding.

Credential Access

High
Category
Privilege Escalation
Confidence
97% confidence
Finding

This function reads access_token from ~/.beatra/credentials.json, directly exposing shared authentication material to the skill package. In a cover-generation skill this is unjustified and dangerous because it grants an unrelated component the ability to use or revoke shared credentials, broadening the attack surface around sensitive tokens.

Content

Scanner excerpt · scripts/uninstall.py (reported line 109)May include surrounding context.

python
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):

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
93% confidence
Finding

The skill declares no explicit tool scope even though its documented behavior requires shell, network, file read/write, and environment access via the bundled client. Without a restrictive permission boundary, the runtime may grant broader capabilities than users expect, increasing the blast radius if the bundled client is compromised or behaves unexpectedly.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The skill states that the bundled client can automatically install newer versions during normal commands without separate confirmation. Even with signature and manifest verification, silent self-update is system-modifying behavior that changes executable code and trust boundaries at runtime, creating supply-chain and user-consent risk disproportionate to a cover-generation skill.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
60% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · manifest.json (reported line 9)May include surrounding context.

json
"icon": "https://beatra.ai/textures/icons/douyin-cover-maker-0.1.1.png",
  "localized": {
    "en": {
      "description": "Create a Douyin cover or vertical short-video cover from a video topic, hook, script, portrait, product photo, or reference image. This AI cover maker builds a clear focal visual and headline-safe composition for Douyin short-video covers, creator series, product demos, tutorials, food, lifestyle, and knowledge content, then refines an accepted draft into a consistent account-cover direction.",
      "display_name": "Douyin Video Cover Maker",
      "summary": "Turn a short-video topic, hook, portrait, product photo, or reference image into a clear vertical Douyin cover with a bold focal visual and a headline-safe composition.",
      "tags": [

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The document states that update checks are silent, enabled by default, and that higher versions are installed automatically without separate confirmation. Even with integrity checks and rollback protections, silently modifying a local installation changes executable code without an explicit contemporaneous user prompt, which creates supply-chain and user-consent risk if the update channel is ever compromised or misconfigured.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.