Back to skill

Security audit

REDnote OOTD Lookbook Maker

Security checks for vulnerabilities and agentic risk

Overview

This skill appears to be a real Beatra image-generation workflow, but it asks users to accept broad shared credentials and silent self-updates that go beyond a simple lookbook maker.

Review this before installing if you are uncomfortable with a shared Beatra device token, broad media-and-wallet scopes, host/platform registration, or automatic silent package updates. Disable auto-updates with the documented command if you proceed, and only approve paid generations after checking the shown charge and request details.

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
92% confidence
Finding
The skill declares no permissions while instructing use of a bundled client that performs shell execution, network access, file reads/writes, and environment-dependent operations. That mismatch removes an important trust boundary for users and reviewers, making powerful local and remote capabilities available without explicit disclosure or consent.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
The documented purpose is fashion-lookbook generation, but the skill also includes credential handling, persistent state under ~/.beatra, remote tool invocation, local file upload, telemetry/registration, uninstall cleanup, and update mechanisms. This broadens the attack surface far beyond user expectations and creates opportunities for data exfiltration, credential abuse, and execution of unintended remote-controlled actions.

Context-Inappropriate Capability

Medium
Confidence
95% confidence
Finding
The skill advertises automatic update, download, verification, and package replacement behavior for installed files, which is unrelated to the core fashion task and materially increases supply-chain risk. Even with integrity-check claims, self-updating code can change behavior after approval, bypass stable review, and expose the environment to compromise if the update channel, signing, or replacement logic fails or is subverted.

Description-Behavior Mismatch

High
Confidence
97% confidence
Finding
The documentation describes a bundled client that silently checks for and installs software updates, behavior that is unrelated to an OOTD lookbook/image-generation skill. Even though the text claims verification and rollback protections, a self-updating component that modifies installed package files expands the attack surface and creates a supply-chain and integrity risk that is unjustified in this skill context.

Context-Inappropriate Capability

High
Confidence
98% confidence
Finding
Including software self-update capabilities in a fashion lookbook maker is a strong context mismatch and indicates unnecessary privileged behavior. A component that can replace its own files and other package-owned files could be abused through supply-chain compromise or implementation flaws to persist code changes on the user's system.

Context-Inappropriate Capability

High
Confidence
98% confidence
Finding
The requested OAuth scope is far broader than the stated purpose of generating outfit lookbooks. In addition to image generation, it requests wallet spending, voice/speech, music/video generation, artifact and task access, which creates unnecessary blast radius if the token is misused or the service is compromised. Because the skill is marketed as a fashion lookbook maker, this scope mismatch is especially suspicious and violates least-privilege expectations.

Context-Inappropriate Capability

Medium
Confidence
88% confidence
Finding
The code fingerprints the host agent platform from environment variables and collects the device hostname, then persists that metadata locally and sends device_name/platform during authorization. While not immediately code-execution dangerous, this is unnecessary host-identifying data for a lookbook-making skill and increases privacy risk and environmental intelligence available to the service. In this context, the collection is more concerning because the skill description gives no indication that host inventorying is needed.

Description-Behavior Mismatch

Medium
Confidence
91% confidence
Finding
The package performs account authorization, persists shared credentials, writes host configuration, and records local skill installation inventory, but these behaviors are not reflected in the skill's user-facing description. Hidden auth and inventory behavior undermines informed consent and can surprise users with persistent local state tied to their account. In a simple fashion-content skill, undisclosed credential and inventory management is materially riskier than in a clearly documented account-integration tool.

Description-Behavior Mismatch

High
Confidence
94% confidence
Finding
The client contains broad capabilities unrelated to the declared fashion-lookbook purpose, including self-update, installation registration, and local inventory/state management. In a skill context, this expands trust boundaries and gives a nominally creative package the ability to modify itself and maintain telemetry/persistence, increasing the risk of covert behavior or future malicious updates.

Context-Inappropriate Capability

Medium
Confidence
91% confidence
Finding
The code fingerprints the host environment using environment variables and host.json, then injects source_platform and package identifiers into tool calls. This data collection is not necessary for outfit-lookbook creation and creates unnecessary telemetry about the user's agent/runtime environment, which can aid tracking or profiling.

Context-Inappropriate Capability

Medium
Confidence
93% confidence
Finding
The skill records a device-local skills inventory and registers installations with a remote service on use, neither of which is related to generating fashion content. This creates persistent local tracking and outbound telemetry that users may not expect from a content-creation skill, increasing privacy and surveillance risk.

Description-Behavior Mismatch

High
Confidence
98% confidence
Finding
This uninstall script manages shared device credentials and can revoke remote authorization for the Beatra account, which is unrelated to the declared fashion lookbook purpose of the skill. Even though the logic is cautious, the capability itself grants the package control over authentication state outside its advertised scope, creating a supply-chain and trust-boundary risk if the skill is installed or modified maliciously.

Context-Inappropriate Capability

High
Confidence
99% confidence
Finding
The code issues a remote POST to revoke device authorization and reads shared credential material from ~/.beatra, giving this fashion-oriented skill the ability to affect authentication for other installed skills. That is dangerous because a non-core package should not have authority over shared secrets or remote auth lifecycle, and compromise of the package could be used to disrupt service or abuse trust in the shared connection.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
Enabling automatic updates by default and installing them without separate confirmation reduces user awareness that the software is modifying installed files. In a skill whose purpose is generating fashion content, this hidden system-impacting behavior is especially inappropriate and increases the chance users accept unexpected code changes without informed consent.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The document states that on first use the bundled client performs a network registration call that transmits package slug, version, platform, and a stable external installation reference, but it does not indicate any explicit user notice or consent mechanism. Silent metadata transmission can create a privacy and transparency issue, especially because the stable installation reference enables cross-session correlation even if the data is described as non-secret and non-billable.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
maybe_auto_update() performs silent best-effort updates before normal commands, modifying local installation files without prompting at the moment of execution. Even with checksum and manifest checks, this is dangerous in a skill because it enables code changes under the guise of a fashion tool, reducing user visibility and increasing supply-chain risk.

Credential Access

High
Category
Privilege Escalation
Content
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,
                {
Confidence
84% confidence
Finding
The helper stores a bearer access token locally in credentials.json for later reuse. Although permissions are restricted, the token appears long-lived enough for reuse and is granted very broad capabilities, so compromise of the local user context, backups, or accidental disclosure would expose much more than needed for a lookbook skill. The danger is amplified by the excessive scope requested elsewhere in the file.

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 part of the state this package manages indicates awareness of and interaction with shared authentication material. In the context of an OOTD lookbook generator, touching credential storage is unjustified and increases the blast radius of a compromised or overly powerful skill.

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
99% confidence
Finding
This function reads ~/.beatra/credentials.json and extracts an access token for later use in remote revocation. Access to bearer tokens is highly sensitive; in a fashion-content skill, this is clearly over-privileged and could enable account/session disruption or broader abuse if the code were altered or reused.

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 exposes self-update functionality that downloads code and replaces local files in its own installation tree. In the context of a fashion-lookbook skill, self-modification is a high-risk capability because it allows the behavior of the installed code to change after review, making supply-chain compromise or scope creep materially more dangerous.

Static analysis

No suspicious patterns detected.