Back to skill

Security audit

Elder Checkup Voice Pack

Security checks for vulnerabilities and agentic risk

Overview

The skill does the advertised voice-pack workflow, but it also requests broad Beatra account authority and silently updates executable package files by default.

Review before installing. Only use this skill if you are comfortable granting Beatra broad media-generation, artifact, task, wallet, and voice-management access through a shared local credential. Disable automatic updates if you need reviewed code to stay fixed, and avoid providing health-adjacent schedules, names, or voice samples unless the office has authority to send them to Beatra.

Vulnerability Patterns
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (2)

T05 · Unauthorized Access and Privilege Escalation

Warning
Location
scripts/authorize.py:34
Finding
Device token grants capabilities beyond the Skill's legitimate requirements<![CDATA[ ## Vulnerability Details **File Location**: `scripts/authorize.py:34-37`; related generic tool execution at `scripts/mcp_client.py:1463-1482` **Vulnerability Type**: Excessive authorization scope and missing client-side tool restriction **Risk Level**: Medium ### Complete Code Snippet ```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" ) ``` The bundled client also accepts an arbitrary tool name: ```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 elder-checkup workflow requires speech synthesis, optional voice cloning, voice and model discovery, artifact upload, task inspection, and billing-related operations. The authorization scope additionally grants unrelated image, video, and music generation capabilities, general wallet spending, artifact and task access, and task cancellation. This violates least privilege because compromise or misuse of the shared bearer token would expose capabilities unrelated to producing elder-checkup audio. The risk is amplified by the generic `call` command, which does not enforce a package-specific allowlist and forwards any supplied tool name to ...[truncated 1604 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Replace the shared full-scope credential with a package-specific, least-privilege token. 2. Remove unrelated scopes, particularly: - `images:generate` - `videos:generate` - `music:generate` - Broad cancellation or spending permissions not strictly required by this Skill 3. Separate wallet inspection from wallet spending and request only the minimum billing permission needed for approved speech or clone submissions. 4. Enforce a local allowlist in `scripts/mcp_client.py`. For this Skill, permit only explicitly required tools such as model and voice discovery, speech synthesis, optional voice cloning, artifact upload, task inspection, wallet inspection, and installation registration. 5. Reject every tool name outside that allowlist before any network request. 6. Use server-side audience or package restrictions so the token cannot call unrelated tools even if the local client is modified. 7. Display the exact requested capabilities on the authorization page and require a new approval when capabilities materially expand. 8. Consider issuing short-lived access tokens with securely rotated refresh credentials rather than a broad bearer token with a sliding 15-day lifetime. ]]>

T03 · Remote Payload Retrieval and Execution

Warning
Location
scripts/mcp_client.py:969
Finding
Default-on silent updater can replace executable package files without independent signature verification<![CDATA[ ## Vulnerability Details **File Location**: `scripts/mcp_client.py:969-1017`; automatic invocation at `scripts/mcp_client.py:1542-1544` **Vulnerability Type**: Mutable remote code delivery through an automatic update channel **Risk Level**: Medium ### Complete Code Snippet ```python def maybe_auto_update( *, state_dir: Path | None = None, install_root: Path | None = None, get_bytes: GetBytes = _default_get_bytes, now: float | None = None, ) -> bool: """Best-effort silent update. Never block the requested MCP command.""" resolved_state = state_dir or Path.home() / ".beatra" try: resolved_root = (install_root or _current_install_root()).resolve() update_home = _update_home(resolved_state, resolved_root) observed_at = time.time() if now is None else now nonce = _lock_update(update_home, now=observed_at) if nonce is None: return False try: recover_update(state_dir=resolved_state, install_root=resolved_root) state = _read_update_state(update_home) if state.get("auto_update", True) is False: return False last_checked = state.get("last_checked_at") if ( isinstance(last_checked, (int, float)) and observed_at - float(last_checked) < UPDATE_CHECK_MAX_AGE_SECONDS ): return False state["last_checked_at"] = observed_at _write_private_json(update_home / "state.json", state) checked = check_update(get_bytes=get_bytes) if not checked["update_available"]: return False _ensure_owned_baseline( install_root=resolved_root, update_home=update_home, get_bytes=get_bytes, ) discovery = checked["discovery"] manifest, new_files = download_update(discovery, get_bytes=get_bytes) _apply ...[truncated 4061 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Disable automatic installation by default. Update checks may remain automatic, but installation should require explicit user approval. 2. Cryptographically sign release metadata with an offline or otherwise separately protected publisher key. 3. Pin the corresponding public verification key in the audited client and verify the signature before trusting version numbers, URLs, manifests, or hashes. 4. Use a signed metadata framework that supports: - Metadata expiration. - Key rotation. - Threshold signing. - Rollback protection. - Release and target delegation. 5. Keep HTTPS, hash validation, path validation, file-size limits, transactional replacement, and rollback as defense-in-depth controls. 6. Display the target version and affected executable files before installation. 7. Provide a check-only default and require a distinct command for installation. 8. Consider relying on the host Skill/package manager for updates so package review, provenance, and user policy are enforced centrally. 9. Record update provenance and verified signer identity in local state for later incident investigation. ]]>
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
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (28)

Lp3

Medium
Category
MCP Least Privilege
Confidence
94% confidence
Finding
The skill advertises a simple voice-pack workflow but embeds instructions that require shell execution, filesystem access, network calls, environment use, and local file handling without declaring those capabilities. This reduces transparency and weakens permission boundaries, increasing the chance that an operator or agent executes sensitive actions they did not expect from the skill.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
The documented behavior goes well beyond generating voice clips: it includes authentication, credential storage, arbitrary MCP tool invocation, remote uploads, telemetry/registration, uninstall state changes, and self-updating code. That mismatch is dangerous because users and orchestrators may grant trust based on the benign description while the skill can perform substantially broader and more sensitive actions.

Description-Behavior Mismatch

Medium
Confidence
95% confidence
Finding
The skill includes self-updating installation and file replacement behavior even though its manifest describes only producing elder-checkup audio clips. Hidden or weakly-justified modification of installed files expands the trust boundary and creates a supply-chain risk if the update path, signing, or distribution controls ever fail.

Context-Inappropriate Capability

High
Confidence
98% confidence
Finding
Automatic remote download and installation are not necessary to fulfill the stated voice-clip task, so they materially broaden attack surface without strong contextual justification. Any mechanism that fetches and replaces code during routine operation can become a high-impact supply-chain vector, especially when updates occur without separate confirmation.

Description-Behavior Mismatch

Medium
Confidence
90% confidence
Finding
The manifest markets the skill as a simple schedule-to-voice conversion utility, but it actually declares an authenticated remote MCP connection to Beatra services. That mismatch is security-relevant because users and reviewers may not expect schedule contents and related metadata to be transmitted to a third-party service, creating a transparency and trust-boundary violation.

Context-Inappropriate Capability

Medium
Confidence
88% confidence
Finding
The described purpose—turning written schedules into voice clips—does not by itself justify authenticated remote MCP access. In the elder-checkup context, schedules may contain sensitive health-adjacent or personally identifying information, so unnecessary remote access expands exposure without clear functional need.

Description-Behavior Mismatch

Medium
Confidence
90% confidence
Finding
The documentation describes automatic outbound installation registration and writes to a persistent local cache, behavior that is unrelated to the stated elder-checkup voice-clip generation purpose. Unrelated telemetry or registration capabilities increase attack surface, create privacy concerns, and can normalize hidden network activity that users would not expect from an offline content-generation skill.

Context-Inappropriate Capability

Medium
Confidence
88% confidence
Finding
The documented capability is not justified by the skill's declared purpose, so it represents a suspicious mismatch between advertised functionality and actual behavior. Such hidden or unnecessary registration features can enable tracking, data collection, or future abuse channels without providing user benefit related to voice-pack creation.

Description-Behavior Mismatch

High
Confidence
99% confidence
Finding
The OAuth scope string grants far broader capabilities than the skill's stated purpose of turning written elder-checkup schedules into voice clips. It includes unrelated powers such as artifacts read/write, image/video/music generation, voice management, task control, and other privileged actions, violating least privilege and increasing blast radius if the skill, host, or token is compromised.

Context-Inappropriate Capability

Critical
Confidence
98% confidence
Finding
The inclusion of voices:read and voices:write exceeds what is normally required for basic text-to-speech clip generation. These permissions could expose or modify a user's voice catalog or custom voices, creating privacy and integrity risks unrelated to the declared skill behavior.

Context-Inappropriate Capability

High
Confidence
98% confidence
Finding
The inclusion of voices:read and voices:write exceeds what is normally required for basic text-to-speech clip generation. These permissions could expose or modify a user's voice catalog or custom voices, creating privacy and integrity risks unrelated to the declared skill behavior.

Context-Inappropriate Capability

High
Confidence
98% confidence
Finding
The inclusion of voices:read and voices:write exceeds what is normally required for basic text-to-speech clip generation. These permissions could expose or modify a user's voice catalog or custom voices, creating privacy and integrity risks unrelated to the declared skill behavior.

Description-Behavior Mismatch

High
Confidence
95% confidence
Finding
The file implements a full networked package-management and self-update subsystem that is unrelated to the declared elder-checkup voice-pack purpose. Even though it includes integrity checks, it still gives the skill the ability to fetch remote metadata, download archives, and overwrite local installation files, materially expanding attack surface and enabling unexpected code replacement behavior.

Description-Behavior Mismatch

Medium
Confidence
89% confidence
Finding
The skill performs installation registration, local inventory maintenance, and telemetry-style reporting that do not align with simple voice clip generation. In a mismatched-scope skill, undisclosed metadata collection is risky because users and reviewers may not expect network-side tracking or persistent local install records.

Context-Inappropriate Capability

Medium
Confidence
86% confidence
Finding
The code fingerprints the host environment by inspecting environment variables and local host metadata to classify the agent platform. For an elder-checkup voice skill, this exceeds expected functionality and can support user/environment profiling, targeted behavior, or data correlation across installations.

Context-Inappropriate Capability

Medium
Confidence
88% confidence
Finding
The skill writes and maintains a local inventory of installed skills and install paths, which is unrelated to generating elder-checkup audio clips. This creates unnecessary local surveillance data and can aid broader profiling of the user's toolchain or environment if accessed by other components.

Description-Behavior Mismatch

High
Confidence
92% confidence
Finding
The uninstall script handles shared Beatra device credentials and makes revocation decisions against a remote service, which is materially broader than the skill's declared elder-checkup voice generation purpose. Even if framed as cleanup logic, it gives the package authority over shared authentication state used by other skills, creating a risky mismatch between stated function and actual capability.

Context-Inappropriate Capability

High
Confidence
95% confidence
Finding
This code sends a bearer token to an external revocation endpoint and can invalidate a shared device authorization. For a skill advertised as voice-pack generation, that capability is unnecessary and dangerous because compromise, misuse, or packaging deception could disrupt all other installed skills that depend on the same shared connection.

Context-Inappropriate Capability

Medium
Confidence
90% confidence
Finding
The script enumerates and later deletes files in ~/.beatra including credentials, installation metadata, host state, and registrations. Accessing and removing shared local state unrelated to voice synthesis expands the package's reach beyond its declared purpose and risks denial of service or unintended state corruption for other skills if platform assumptions fail.

Missing User Warnings

Low
Confidence
88% confidence
Finding
The file discloses self-update behavior, but the warning is not prominent near the execution path and does not strongly communicate that installed files may change without separate confirmation. This can undermine informed consent and increase the chance that operators invoke the client assuming it is static when it may update itself.

Missing User Warnings

Medium
Confidence
88% confidence
Finding
The document states that the client silently checks for updates and automatically installs newer releases by default without separate confirmation. Even though the text describes strong integrity protections, silent default modification of local files can violate user expectations, create change-management risk, and enable unwanted code changes in sensitive environments if the update channel is ever compromised or misconfigured.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
Although the file mentions registration and a cache, it does not clearly warn users in a prominent way that first use automatically triggers a network call and creates or updates files under ~/.beatra. Lack of explicit disclosure undermines informed consent and can conceal privacy-relevant behavior, especially in a skill whose expected function does not imply telemetry or local tracking artifacts.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The code performs silent automatic self-updates that can download content from the network and replace package files without a user-facing prompt when ordinary commands run. In the context of a simple voice-pack skill, this is dangerous because it introduces covert code-change capability during normal use and reduces user control over execution trust.

Missing User Warnings

Low
Confidence
83% confidence
Finding
Telemetry registration and local inventory recording occur automatically during normal session setup without a user-facing notice in this code path. While not inherently exploit code, undisclosed persistence and reporting are inappropriate for the stated skill scope and erode informed consent.

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
95% confidence
Finding
The manifest references a local bearer credential file for authenticating to a remote MCP endpoint, which means the skill is designed to operate with reusable credentials from the user's environment. In combination with the undeclared remote service dependency and the health-related scheduling context, this raises the risk of credential misuse, unauthorized API actions, and unexpected exfiltration of sensitive schedule data.

Static analysis

No suspicious patterns detected.