Back to skill

Security audit

Holiday Homework Voice Pack

Security checks for vulnerabilities and agentic risk

Overview

This skill does make homework voice clips, but it also asks for broad shared Beatra account powers and can silently update its own package, so it needs Review before installation.

Install only if you are comfortable giving this package a shared Beatra device credential with powers beyond homework voice generation and accepting silent package updates by default. Review the Beatra approval scopes carefully, consider disabling automatic updates with the documented update --auto off command after installation, and avoid using the raw bundled client for any tool outside the documented voice workflow.

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

Warning
Location
scripts/authorize.py:34
Finding
Overprivileged Authorization Scope and Unrestricted MCP Tool Dispatch## Vulnerability Details **File Location**: `scripts/authorize.py:34-36`; `scripts/mcp_client.py:1463-1481` **Vulnerability Type**: Excessive authorization scope and unrestricted remote tool selection **Risk Level**: Medium ### Vulnerable Code ```python SCOPE = ( "mcp:tools artifacts:write images:generate videos:generate music:generate " "speech:generate voices:read voices:write wallet:spend tasks:read artifacts:read tasks:cancel" ) ``` ```python def _run_command(command: str, tool_name: str | None = None) -> 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}, ) ``` ### Technical Analysis The declared function of this Skill is to produce homework voice clips and, when authorized, clone a voice from a supplied sample. Its authorization request nevertheless includes unrelated image, video, and music generation permissions. It also obtains wallet-spending, artifact-writing, and task-cancellation capabilities through one shared bearer credential. The command interface accepts an arbitrary `tool_name` and forwards it directly to the remote MCP server. There is no package-local allowlist restricting calls to the operations documented as necessary for this Skill. Consequently, the client does not enforce a least-privilege boundary between speech-related operations and other tools ...[truncated 1528 chars]
Remediation
## Remediation Suggestions 1. Replace the shared full scope with package-specific least-privilege authorization. Retain only permissions needed for: - Speech synthesis. - Voice listing and authorized voice cloning. - Explicitly selected asset uploads. - Model-card retrieval. - Task polling and user-requested cancellation. - Read-only wallet operations where requested by the user. 2. Remove `images:generate`, `videos:generate`, and `music:generate` from this Skill's authorization request. 3. Separate wallet-read privileges from wallet-spending privileges where the service supports that distinction. 4. Add a fixed allowlist in `_run_command` for the MCP tools required by this package. Reject every unrecognized tool before opening an authenticated session. 5. Apply operation-specific confirmation checks for billable, cloning, upload, cancellation, and other state-changing calls. 6. Prefer server-issued package-bound credentials so that a modified local client cannot use the token for unrelated tool families. 7. Add automated tests confirming that unrelated media tools and unknown tool names are rejected locally.

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/mcp_client.py:1044
Finding
Windows Bearer Credential Privacy Is Assumed Rather Than Enforced## Vulnerability Details **File Location**: `scripts/authorize.py:120-130`; `scripts/mcp_client.py:1044-1052`; `references/installation-and-auth.md:16-20` **Vulnerability Type**: Missing credential ACL creation and validation on Windows **Risk Level**: Medium ### Vulnerable Code ```python def _private_directory(path: Path) -> None: # POSIX gets explicit 700/600. On Windows the state directory lives under # the user profile, whose default ACL is already private to the user — # the same posture as gh/aws/gcloud credential stores. The former custom # DACL ceremony was dropped deliberately: its command patterns read as # hostile to agent safety policies and endpoint security, failing installs # while adding no protection an elevated administrator could not bypass. path.mkdir(mode=0o700, parents=True, exist_ok=True) if os.name == "posix": path.chmod(0o700) ``` ```python def _read_private_credentials(state_dir: Path, path: Path) -> str: if os.name == "nt": # The state directory lives under the user profile, whose default # ACL is already private to the user (the gh/aws/gcloud posture). # The former custom DACL verification was dropped deliberately: its # command patterns read as hostile to agent safety policies and # endpoint security, failing installs while adding nothing an # elevated administrator could not bypass. return path.read_text(encoding="utf-8") ``` The documentation states: ```text On POSIX systems the directory must be mode `0700` and both files mode `0600`. On Windows the current user must be the only principal granted access through the file ACL. ``` ### Technical Analysis The credential file contains a bearer token with broad remote-account capabilities. On POSIX systems, the implementation checks directory ownership, file ownership, regular-file status, and exact restrictive m ...[truncated 2056 chars]
Remediation
## Remediation Suggestions 1. Create `~/.beatra` and `credentials.json` on Windows with an explicit protected DACL that grants access only to the current user and required system principals. 2. Disable inheritance or remove broad inherited access-control entries from the credential file. 3. Before every credential read, verify: - The expected file owner. - That no unexpected user or group has read access. - That the path is a regular file and not a reparse point. - That parent directories do not redirect credential resolution to an attacker-controlled location. 4. Fail closed when ACL inspection is unavailable or the permissions do not meet the documented user-only policy. 5. Perform atomic replacement in a directory whose DACL has already been validated, and explicitly apply the protected ACL to the final file after replacement. 6. Add Windows security tests covering permissive inherited ACLs, redirected home directories, pre-created credential files, and reparse-point attacks. 7. Keep the documentation aligned with the implementation. Do not claim that only the current user has access unless that property is explicitly enforced and verified.
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
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (27)

Lp3

Medium
Category
MCP Least Privilege
Confidence
95% confidence
Finding
The skill declares no permissions while instructing use of shell execution, file access, network calls, environment/credential handling, and package modification behavior through the bundled client. This under-declaration prevents meaningful user review and consent, and it materially increases the risk of unexpected file, network, and account operations.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The advertised purpose is limited to generating homework voice clips, but the skill also encompasses authentication flows, persistent credential storage, arbitrary tool mediation, local uploads, registration/telemetry, self-update, and uninstall/token revocation behavior. This mismatch can mislead users into authorizing a much broader trust boundary than the manifest suggests, enabling sensitive account and system actions under a benign-seeming description.

Description-Behavior Mismatch

Medium
Confidence
96% confidence
Finding
A homework-audio skill includes package-management behavior that can download, replace, rollback, and recover local package files. Even with verification claims, embedding self-updating execution logic into a content-generation skill expands the attack surface substantially and creates opportunities for unintended code changes on the host.

Context-Inappropriate Capability

High
Confidence
97% confidence
Finding
Automatic remote download and in-place replacement are not necessary to transform a written assignment list into voice clips. Because the feature permits network retrieval and local modification of executable package content, compromise of the update channel or logic could lead to supply-chain abuse or silent environmental changes.

Description-Behavior Mismatch

High
Confidence
96% confidence
Finding
The manifest presents the skill as a simple holiday-homework voice generator, but the changelog references wallet-like balance, ledger, and top-up behavior that is unrelated to the advertised function. This mismatch is a strong indicator of hidden financial or account-oriented capabilities and suggests the skill may be disguising a different purpose than what users would reasonably expect.

Context-Inappropriate Capability

Medium
Confidence
89% confidence
Finding
The manifest configures device-bearer authentication with a stored credential file and a remote MCP endpoint, yet the declared purpose is only text-to-voice conversion for homework clips. For such a narrow function, access to persisted bearer credentials and remote service invocation creates unnecessary exposure of secrets and expands the attack surface if the service is abused or compromised.

Description-Behavior Mismatch

Medium
Confidence
95% confidence
Finding
The documentation describes automatic installation registration, package/version reporting, platform identification, and external installation references that are unrelated to the stated purpose of generating holiday homework voice clips. This indicates unnecessary telemetry and host-identification behavior in a skill context where users would not reasonably expect outbound registration, increasing privacy and supply-chain risk.

Context-Inappropriate Capability

Medium
Confidence
96% confidence
Finding
The documented capability includes environment fingerprinting via platform resolution from environment signatures or host metadata, which is not justified by the skill's simple media-generation purpose. Collecting host-environment details creates avoidable fingerprinting and tracking exposure and can facilitate broader profiling of installations across systems.

Description-Behavior Mismatch

High
Confidence
99% confidence
Finding
The authorization flow requests a very broad OAuth scope set, including artifacts, images, videos, music, speech, voice management, wallet spending, and task control, even though the skill is described as a homework voice-clip generator. This violates least privilege and would grant the skill far more account capability than its stated function requires, increasing blast radius if the skill is compromised or behaves unexpectedly.

Context-Inappropriate Capability

Critical
Confidence
98% confidence
Finding
The requested scopes include voice-management (`voices:read`, `voices:write`) and task-management (`tasks:read`, `tasks:cancel`) privileges that exceed a simple homework voice-pack generation workflow. These permissions could expose other account data, interfere with unrelated jobs, or modify reusable voice assets without a clear functional need.

Context-Inappropriate Capability

High
Confidence
98% confidence
Finding
The requested scopes include voice-management (`voices:read`, `voices:write`) and task-management (`tasks:read`, `tasks:cancel`) privileges that exceed a simple homework voice-pack generation workflow. These permissions could expose other account data, interfere with unrelated jobs, or modify reusable voice assets without a clear functional need.

Context-Inappropriate Capability

High
Confidence
98% confidence
Finding
The requested scopes include voice-management (`voices:read`, `voices:write`) and task-management (`tasks:read`, `tasks:cancel`) privileges that exceed a simple homework voice-pack generation workflow. These permissions could expose other account data, interfere with unrelated jobs, or modify reusable voice assets without a clear functional need.

Description-Behavior Mismatch

High
Confidence
97% confidence
Finding
The file contains broad capabilities unrelated to the advertised homework-to-voice functionality, including self-update, installation registration, credential handling, and local inventory tracking. Hidden or unjustified side-effecting behaviors increase the attack surface and make it easier for a compromised backend or package channel to mutate the installation or exfiltrate environment metadata under the guise of a simple media skill.

Context-Inappropriate Capability

High
Confidence
98% confidence
Finding
The client downloads manifests and archives from remote infrastructure and overwrites installed package files on disk, including silent automatic updates during normal command execution. Even with checksum and path validation, this is self-modifying behavior unrelated to the stated skill purpose and creates a high-impact supply-chain risk if the update channel, CDN, signing process, or upstream account is compromised.

Context-Inappropriate Capability

Medium
Confidence
95% confidence
Finding
The code fingerprints the host environment, records local skill inventory, reads installation identifiers, and sends installation registration telemetry to a remote service. This data collection is unnecessary for converting homework lists to voice clips and increases privacy and tracking risk, especially because it occurs automatically and is best-effort rather than clearly consent-driven.

Intent-Code Divergence

Medium
Confidence
90% confidence
Finding
The module presents itself as a minimal credential-backed HTTP client, but actually includes package mutation, update orchestration, telemetry, and local inventory logic. This mismatch is dangerous because it obscures security-relevant behavior from reviewers and users, reducing the chance that risky functionality will receive appropriate scrutiny.

Description-Behavior Mismatch

Medium
Confidence
93% confidence
Finding
The uninstall script revokes a shared device credential and deletes global Beatra state in ~/.beatra, which is functionality unrelated to a holiday-homework voice generation skill's declared purpose. Even though this occurs during uninstall, it still grants the package access to cross-skill authentication state and can disrupt other installed skills if the inventory logic is wrong, stale, or manipulated.

Context-Inappropriate Capability

Medium
Confidence
96% confidence
Finding
The code explicitly enumerates and removes files in a shared cross-skill state directory, including credentials and inventory for all Beatra skills. For a content-generation skill, this is excessive capability and creates a trust-boundary violation: a single package can affect platform-wide authentication and other skills' operation.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The skill states that newer versions install automatically without separate confirmation, while also modifying package-owned files locally. Silent updates reduce user control and review, and if the update process or trust chain is compromised, the host may execute altered functionality without an informed approval step.

Missing User Warnings

Medium
Confidence
87% confidence
Finding
The manifest does not disclose that user-supplied homework content may be transmitted to a remote HTTP MCP service. This omission undermines informed consent and can expose potentially sensitive student or teacher content to third-party processing without clear notice.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
The document states that the client silently checks for updates and installs newer versions automatically without separate confirmation. Even with integrity checks, redirects refusal, rollback, and package/path validation, unattended code replacement increases supply-chain risk because a compromised update origin, signing/checksum process, or release pipeline could push new executable content to users without an approval step.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
The documentation states that the client automatically performs a registration call and writes a local cache file, but it does not provide an explicit user warning or consent flow for network transmission and filesystem changes. Silent outbound communication and local artifact creation are risky because they undermine informed user consent and can expose metadata or leave persistent traces on the host.

Missing User Warnings

Medium
Confidence
98% confidence
Finding
maybe_auto_update() can silently check for, download, and apply package updates before ordinary commands run, without a user-facing warning at execution time. Silent code replacement is especially dangerous in a skill whose declared purpose is simple media generation, because users would not reasonably expect command execution to modify installed code.

Credential Access

High
Category
Privilege Escalation
Content
},
  "mcp": {
    "authentication": "device-bearer",
    "credential_file": "~/.beatra/credentials.json",
    "name": "beatra",
    "transport": "streamable-http",
    "url": "https://mcp.beatra.ai/mcp"
Confidence
91% confidence
Finding
Referencing a local credential file for bearer authentication gives the skill a path to sensitive tokens that can authorize actions against a remote service. In the context of a seemingly simple homework voice skill, this level of credential access is disproportionate and dangerous because compromise of the skill or service could lead to unauthorized account use or data access.

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
95% confidence
Finding
Referencing credentials.json as removable shared state indicates the package is designed to handle authentication material outside its own scope. Access to shared credentials is highly sensitive because compromise, misuse, or logic errors can revoke or invalidate authentication used by multiple skills, causing denial of service and exposing secrets to package code that does not need them.

Static analysis

No suspicious patterns detected.