Back to skill

Security audit

office-floor-tour

Security checks for vulnerabilities and agentic risk

Overview

The skill can make the advertised office-floor videos, but it also asks for broad account powers, stores a shared token, allows arbitrary Beatra tool calls, and silently self-updates.

Install only if you are comfortable granting this package a broad Beatra account token, automatic package updates, local state under ~/.beatra, and first-use registration telemetry. Disable automatic updates with the documented update --auto off command and avoid authorizing it on accounts where wallet spending or unrelated media-generation capabilities would be sensitive.

Vulnerability Patterns
  • 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
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T05 · Unauthorized Access and Privilege Escalation

Warning
Location
scripts/authorize.py:31
Finding
Overprivileged Device Token Combined with Unrestricted MCP Tool Dispatch## Vulnerability Details **File Location**: `scripts/authorize.py:31-34`; `scripts/mcp_client.py:1463-1482` **Vulnerability Type**: Excessive authorization scope and unrestricted privileged tool selection **Risk Level**: Medium ### Vulnerable Code `scripts/authorize.py:31-34`: ```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" ) ``` `scripts/mcp_client.py:1463-1482`: ```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 office-floor-tour workflow needs a comparatively narrow set of capabilities: uploading source images, listing compatible models, generating videos, reading task results, and optionally reading wallet information. The authorization helper instead requests a shared bearer token that also permits unrelated image, music, speech, and voice generation, voice writes, wallet spending, and task cancellation. The generic `call` command accepts an arbitrary `tool_name` from the command line and forwards it to the remote MCP server without enforcing a package-specific allowlist. JSON arguments are likewise accepte ...[truncated 2356 chars]
Remediation
## Remediation Suggestions 1. Replace the broad shared scope with package-specific least-privilege authorization. Retain only permissions required for image upload, model discovery, video generation, necessary task reads, artifact reads, and explicitly documented read-only wallet queries. 2. Remove unrelated permissions such as music generation, speech generation, voice generation and writes, generic image generation, and task cancellation unless a separately documented workflow requires them. 3. Separate read-only wallet access from spending authority. Do not grant `wallet:spend` merely to display balances or ledger entries. 4. Enforce a local allowlist before issuing `tools/call`. For this Skill, allow only the documented operations, such as: - `beatra.assets.upload` - `beatra.models.list` - `beatra.videos.animate` - `beatra.tasks.get` - `beatra.tasks.list` - `beatra.wallet.get` - `beatra.wallet.ledger` 5. Reject every unrecognized tool name by default, even if it appears in the server's `tools/list` response. 6. If cancellation or another sensitive operation is later required, expose it through a dedicated command that validates arguments and requires explicit user confirmation. 7. Prefer separate package-bound credentials so another Beatra Skill cannot inherit capabilities that this package does not require. 8. Add automated tests asserting that unrelated, billable, and destructive tool names are rejected locally and that the requested authorization scope contains no permissions outside the documented workflow.
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 (19)

Lp3

Medium
Category
MCP Least Privilege
Confidence
97% confidence
Finding
The skill declares itself as a simple office-floor video workflow, but its instructions require shell execution, file access, network calls, environment usage, and local state changes without any declared permissions boundary. This creates a hidden capability surface that can enable credential handling, remote operations, local file interaction, and package modification beyond what a user would reasonably expect from the manifest.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The documented purpose is limited to converting seller-supplied office floor stills into clips, but the skill also introduces OAuth authorization, persistent credential storage, generic remote tool invocation, uploads, telemetry/registration, uninstall behavior, and self-update functionality. This mismatch undermines informed consent and can mask a much broader trust and attack surface than the user intended to grant.

Description-Behavior Mismatch

Medium
Confidence
93% confidence
Finding
The skill expands from media processing into wallet/billing queries and automatic update management, which are unrelated to the core task of generating floor-tour clips. Even if individually legitimate, bundling these behaviors into a narrow content-production skill increases the chance of over-privileged execution and user confusion about what the skill is allowed to do.

Context-Inappropriate Capability

High
Confidence
98% confidence
Finding
The skill includes automatic download and installation of newer package versions, which effectively grants it a self-modifying code path unrelated to the business function of making office-floor tour clips. Any compromise of the update channel, validation logic, packaging process, or trust assumptions could turn this skill into a remote code delivery mechanism on the host system.

Description-Behavior Mismatch

High
Confidence
92% confidence
Finding
The changelog mentions adding read-only balance and ledger calls, which is unrelated to an office floor video generation skill. This kind of scope mismatch is dangerous because it suggests hidden or unjustified financial/account functionality may be exposed through the skill or its backing MCP integration, increasing the chance of unauthorized access to sensitive account data.

Context-Inappropriate Capability

High
Confidence
90% confidence
Finding
Financial/account-oriented capabilities are unjustified in the context of a skill advertised for turning office floor stills into video clips. Even if the calls are described as read-only, unnecessary access to balances or ledgers can leak sensitive financial information and indicates overprivileged design or possible deceptive packaging.

Description-Behavior Mismatch

High
Confidence
99% confidence
Finding
The authorization scope requests a very broad set of capabilities far beyond what an office-floor-tour skill needs, including wallet spending, voice, music, and task controls. This violates least privilege and would let the skill or any compromise of its stored bearer token access unrelated account functions.

Context-Inappropriate Capability

Critical
Confidence
98% confidence
Finding
The inclusion of music:generate is not justified by the advertised office floor tour functionality. Unnecessary media-generation privileges increase the chance of misuse and indicate overbroad authorization design inconsistent with least privilege.

Context-Inappropriate Capability

High
Confidence
98% confidence
Finding
The inclusion of music:generate is not justified by the advertised office floor tour functionality. Unnecessary media-generation privileges increase the chance of misuse and indicate overbroad authorization design inconsistent with least privilege.

Context-Inappropriate Capability

High
Confidence
98% confidence
Finding
The inclusion of music:generate is not justified by the advertised office floor tour functionality. Unnecessary media-generation privileges increase the chance of misuse and indicate overbroad authorization design inconsistent with least privilege.

Description-Behavior Mismatch

High
Confidence
95% confidence
Finding
This client includes broad package self-update, file replacement, rollback, lock, manifest, and installation-state logic unrelated to generating office floor tour clips. In a media skill, that extra capability materially expands attack surface by letting the package modify its own installed codebase and manage persistent local state, creating a path for post-install behavior changes beyond the user-declared purpose.

Description-Behavior Mismatch

Medium
Confidence
93% confidence
Finding
The client records local skill inventory and sends installation registration telemetry that persists beyond the core office-tour workflow. This exceeds the stated media-creation purpose and creates unnecessary privacy and tracking exposure by maintaining device-local records and transmitting package/platform metadata to a remote service.

Context-Inappropriate Capability

Medium
Confidence
90% confidence
Finding
The code fingerprints the host agent platform using environment variables and local host metadata, which is not needed to turn office stills into walkthrough clips. In this skill context, such environment inspection increases privacy risk and enables backend profiling or behavior variation based on the execution environment rather than the declared media task.

Context-Inappropriate Capability

High
Confidence
97% confidence
Finding
The CLI exposes generic 'tools' listing and arbitrary remote 'call' operations instead of constraining behavior to office floor tour generation. That makes the package a general-purpose remote tool runner, which is far more powerful than its declared purpose and could be used to invoke unexpected backend capabilities using the user's stored credentials.

Intent-Code Divergence

Low
Confidence
78% confidence
Finding
The code comments frame the behavior as best-effort telemetry, but the same flow also updates persistent local skill inventory. That mismatch undermines transparency and makes the package's actual data-handling behavior broader than the surrounding documentation suggests.

Missing User Warnings

Medium
Confidence
90% 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 rollback protections, automatic code replacement without explicit opt-in or prominent warning expands the trust boundary and can surprise users, creating supply-chain and change-management risk if the update source, signing process, or release pipeline is ever compromised.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The documentation states that the client automatically performs an external registration call on first use and writes a local cache file, but it does not present an explicit user-facing warning, consent step, or clear disclosure of these side effects. This creates a transparency and privacy risk because package metadata, platform details, and a stable external installation reference are transmitted automatically, and local filesystem state is modified without clearly informing the operator.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
maybe_auto_update() silently checks for and applies package updates during normal command execution, modifying installed files without contemporaneous user confirmation. Even with checksum and manifest validation, silent self-modification is risky in a skill whose declared purpose is media creation, because users may unknowingly run materially different code over time.

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
96% confidence
Finding
The package explicitly supports self-update/self-modification, including downloading and replacing installed files. In the context of an office-floor-tour skill, self-modifying behavior is unrelated to the advertised function and meaningfully increases supply-chain and persistence risk, since future behavior can change after installation without fresh package review at the point of execution.

Static analysis

No suspicious patterns detected.