Back to skill

Security audit

wechat-channels-script-studio

Security checks across malware telemetry and agentic risk

Overview

This skill is mostly a disclosed Beatra script-writing workflow, but it asks for broad shared account authority and can silently replace its own package files.

Install only if you are comfortable giving this package a shared Beatra device authorization that can spend credits, read and manage tasks, and use broader media-generation capabilities than this script workflow needs. Consider disabling automatic updates with `python3 scripts/mcp_client.py update --auto off`, review Beatra account activity, and avoid installing in environments where silent package replacement or shared credential revocation is not acceptable.

SkillSpector

By NVIDIA
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • 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
Findings (20)

Lp3

Medium
Category
MCP Least Privilege
Confidence
95% confidence
Finding
The skill documents shell, file, environment, and network-capable operations but does not declare corresponding permissions. That creates a transparency and consent failure: a user expecting a text-only script-writing skill could trigger code paths that read local state, write files, contact remote services, and execute commands through the bundled client.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The documented behavior materially exceeds the stated purpose: beyond writing scripts, it performs authentication, credential storage, generic remote tool invocation, uploads, telemetry/registration, self-update, and uninstall cleanup. This mismatch is dangerous because users may grant trust for harmless content generation while the skill actually introduces persistent local state, network access, billing actions, and code/update supply-chain risk.

Description-Behavior Mismatch

Medium
Confidence
91% confidence
Finding
The manifest presents a script-writing tool, but the file also authorizes paid media generation and package self-updating. That scope drift increases attack surface and user surprise, especially where billing-triggering actions and software modification occur under the umbrella of a seemingly simple content skill.

Context-Inappropriate Capability

Medium
Confidence
97% confidence
Finding
Automatic download-and-install updates are not necessary for the claimed function of drafting scripts, yet they allow the package to replace local files over time. Even with integrity checks described, silent self-update creates a supply-chain and trust-boundary risk because the behavior of the installed skill can change after initial approval without fresh user review.

Description-Behavior Mismatch

High
Confidence
99% confidence
Finding
The authorization flow requests a very broad OAuth scope set, including image/video/music/speech generation, artifact access, task control, and wallet spending, while the skill is described as a WeChat script-writing tool. This violates least-privilege and turns any later compromise, abuse, or hidden functionality into a much more damaging account-level incident than the advertised skill purpose warrants.

Context-Inappropriate Capability

Critical
Confidence
98% confidence
Finding
The scope set also includes task-management permissions such as `tasks:read` and `tasks:cancel`, which are not justified by the skill's declared script-authoring purpose. Unnecessary control over tasks could let the skill inspect or disrupt unrelated user workflows if the token is reused or compromised.

Context-Inappropriate Capability

High
Confidence
98% confidence
Finding
The scope set also includes task-management permissions such as `tasks:read` and `tasks:cancel`, which are not justified by the skill's declared script-authoring purpose. Unnecessary control over tasks could let the skill inspect or disrupt unrelated user workflows if the token is reused or compromised.

Description-Behavior Mismatch

High
Confidence
96% confidence
Finding
The file implements a full remote self-update mechanism that downloads manifests and archives, validates them, and overwrites package files on disk. For a skill described as a WeChat video-script generator, self-modifying installer behavior is outside expected scope and materially increases supply-chain risk: a compromised vendor endpoint or signing/distribution process can silently turn a content tool into arbitrary code delivery on the next invocation.

Description-Behavior Mismatch

Medium
Confidence
90% confidence
Finding
The client records local skill inventory and sends installation-registration telemetry, including package slug, version, platform, and external installation reference, despite the skill being marketed as a script-writing utility. This creates unexpected privacy and tracking behavior unrelated to the core function, expanding data exposure and making the package more suspicious in context.

Context-Inappropriate Capability

Medium
Confidence
88% confidence
Finding
The code fingerprints its execution environment by inspecting environment variables and local host metadata to derive a host platform identifier. In isolation this is mild, but in a script-generation skill it is unnecessary and can be combined with registration telemetry to profile users and tailor downstream behavior without clear user awareness.

Description-Behavior Mismatch

High
Confidence
97% confidence
Finding
This uninstall flow can revoke a shared device credential and delete shared state under ~/.beatra, affecting other installed skills if the inventory is wrong, stale, or attacker-manipulated. Even though the code tries to be conservative, this is still security-sensitive functionality that exceeds the advertised purpose of a WeChat script-writing skill and creates a denial-of-service risk against the broader agent environment.

Context-Inappropriate Capability

Medium
Confidence
93% confidence
Finding
The code contains a built-in capability to POST a bearer token to a device revocation endpoint, which gives the skill the power to invalidate a shared authorization outside its stated business purpose. In the context of a content-generation skill, embedding credential-revocation logic is unnecessary and expands the blast radius if the skill is abused or modified.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
The skill states that it silently checks for and installs newer releases, but this is not clearly surfaced in the skill description where users make trust decisions. Silent update behavior reduces informed consent and can expose users to unexpected code changes, new data flows, or altered billing-related logic.

Missing User Warnings

Medium
Confidence
88% confidence
Finding
The document states that update checks are silent, enabled by default, and that newer versions are installed automatically without separate confirmation. Even with integrity checks and pinned sources, this behavior creates security and trust risk because it performs network activity and replaces local files without explicit upfront consent, which can surprise users and expand the impact of any server-side compromise or operational mistake.

Missing User Warnings

Medium
Confidence
87% confidence
Finding
The document states that the client automatically makes an outbound `beatra.installations.register` call on first use and transmits package slug, version, platform, and a stable external installation reference, but it does not present this as a user-facing warning or consent requirement. Even if the data is described as non-secret and non-billable, silent telemetry-like transmission can expose usage metadata and create privacy, compliance, and trust risks, especially in regulated or enterprise environments.

Missing User Warnings

Low
Confidence
67% confidence
Finding
The authorization flow persists multiple local state files, including credentials, installation identifiers, host metadata, and skill inventory, while only partially disclosing this behavior to the user. Although the code does attempt restrictive file permissions, undisclosed persistence of bearer tokens and related metadata increases risk on shared or monitored systems and weakens informed consent around sensitive local storage.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
maybe_auto_update() performs silent best-effort self-updates during normal command execution and suppresses exceptions, so package files may be modified without a clear user-facing warning at invocation time. This is dangerous because it hides integrity-changing behavior inside ordinary use, reducing the chance a user notices unwanted code replacement or a compromised update path.

Credential Access

High
Category
Privilege Escalation
Content
#: 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",
Confidence
84% confidence
Finding
The script explicitly targets credentials.json as part of the shared Beatra state it may remove, indicating direct handling of credential-bearing material. In a skill whose purpose is script generation, touching shared credential storage is unjustified and increases the chance of credential exposure, tampering, or service disruption if the file is deleted or processed by untrusted code.

Credential Access

High
Category
Privilege Escalation
Content
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):
Confidence
95% confidence
Finding
This function reads ~/.beatra/credentials.json, extracts an access token, and uses it to revoke device authorization. That is direct credential access by a non-authentication skill, and if such code is compromised or repurposed it could misuse the token or disable platform access for this device and potentially all dependent skills.

Self-Modification

High
Category
Rogue Agent
Content
)
    update = subparsers.add_parser(
        "update",
        help="Check, install, or configure Beatra package self-updates",
    )
    update.add_argument(
        "--check",
Confidence
97% confidence
Finding
The package exposes self-update functionality that can replace its own installed files, which is a form of self-modification. Even though the code includes several integrity checks, runtime self-modification remains high risk in this context because the skill's advertised purpose does not justify it, and any compromise of the update source can lead to trusted code replacement.

VirusTotal

VirusTotal findings are pending for this skill version.

View on VirusTotal

Static analysis

No suspicious patterns detected.