Back to skill

Security audit

REDnote Food Note Maker

Security checks for vulnerabilities and agentic risk

Overview

Review before installing: the skill makes food posts, but it also stores a broad Beatra account token and silently updates its own package files.

Install only if you are comfortable granting this package a shared Beatra device token with paid-service spending authority, broad media/tool scopes, local state under ~/.beatra, first-use registration metadata, and default silent package updates. Consider disabling automatic updates with `python3 scripts/mcp_client.py update --auto off` and using a dedicated Beatra account or environment for stronger separation.

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
95% confidence
Finding
The skill declares no permissions while instructing use of a bundled Python client with network, shell, file read/write, and environment access. That creates a transparency and consent failure: users may invoke a seemingly simple content-creation skill without being told it can authenticate, persist local state, upload files, and execute local commands.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The published purpose is food-post generation, but the skill also performs authentication, token persistence, remote tool access, local uploads, registration/telemetry, uninstall cleanup, and self-update behavior. This mismatch is dangerous because it hides security-relevant behaviors behind an innocuous creative workflow, increasing the chance that users approve actions they would not knowingly authorize.

Description-Behavior Mismatch

Medium
Confidence
91% confidence
Finding
The documentation describes an outbound installation-registration call that is unrelated to the skill's stated food-post generation purpose. Even if marked non-billable and limited to metadata, it creates undisclosed telemetry behavior and expands data flow beyond what a user would reasonably expect from a creative image/post skill.

Context-Inappropriate Capability

Medium
Confidence
94% confidence
Finding
This file specifies a telemetry-style capability that sends package slug, version, platform, and installation reference to an external service, but the skill's declared scope is only creative food-post generation. That mismatch is security-relevant because it introduces hidden tracking and external communication not justified by the advertised functionality.

Description-Behavior Mismatch

High
Confidence
98% confidence
Finding
This file implements full device authorization, token acquisition, persistent credential storage, host fingerprinting, and local skill inventory tracking, which is materially unrelated to a food-post generation skill's stated purpose. Even if framed as infrastructure, embedding account provisioning and broad capability enablement in a content-creation skill expands trust boundaries and can grant the package durable access to remote services and local metadata without clear user justification.

Context-Inappropriate Capability

Medium
Confidence
93% confidence
Finding
The code detects host platform, captures a recognizable device hostname, writes host metadata to disk, and records installed skill paths in a local inventory. For a food-note maker, this collection is not obviously necessary and creates unnecessary privacy exposure and environment visibility that could support profiling or later abuse.

Description-Behavior Mismatch

High
Confidence
96% confidence
Finding
The client includes a full self-update mechanism that downloads manifests and archives, then replaces local installation files, behavior unrelated to generating food posts from images. Even with integrity checks, this materially expands the trust boundary and gives the skill persistent code-modification capability, which is especially risky for an end-user creative tool that would not reasonably require self-replacement.

Description-Behavior Mismatch

Medium
Confidence
91% confidence
Finding
The skill records installation telemetry and a local skill inventory, including package slug, platform, install path, timestamps, and registration metadata, which exceeds the stated food-note creation purpose. This creates unnecessary privacy and surveillance surface and can reveal local environment details without being essential to the advertised functionality.

Context-Inappropriate Capability

Medium
Confidence
93% confidence
Finding
The code fingerprints the host environment via environment variables and local host metadata to derive a platform identifier, which is not justified by the food-note maker's function. Such fingerprinting can be used for tracking, selective behavior, or tailoring future payloads, increasing privacy and supply-chain risk in a skill that should only process creative inputs.

Description-Behavior Mismatch

High
Confidence
97% confidence
Finding
The uninstall script contacts the shared Beatra authorization service to revoke a device token and makes decisions about removing shared state under ~/.beatra, which affects all installed skills rather than only this package. That is a sensitive cross-skill capability unrelated to the skill's declared food-post creation purpose, so a user installing this content skill also receives logic that can disrupt platform-wide authentication and other skills.

Context-Inappropriate Capability

High
Confidence
98% confidence
Finding
The _remove_local_state function unlinks shared files including credentials.json, installation.json, host.json, skills.json, and registrations.json from ~/.beatra. Even though the code attempts to do so only when it believes no other skills remain, this still grants a food-image skill the ability to erase global client state and potentially disconnect other functionality if its inventory assumptions are wrong or manipulated.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The skill states that the bundled client can automatically install newer releases without separate confirmation. Even with integrity checks, silent self-update expands the trusted code base after initial approval and can introduce new behavior, bugs, or supply-chain compromise without an explicit fresh user decision.

Missing User Warnings

Medium
Confidence
88% confidence
Finding
The document states that the client silently checks for and automatically installs newer releases by default without separate confirmation. Even though the text describes multiple integrity controls, silent self-updating that modifies installed files can materially affect user systems and trust boundaries, and the documentation does not prominently warn users about the security and operational implications of enabling this behavior by default.

Missing User Warnings

Low
Confidence
88% confidence
Finding
The documentation states that the client makes an outbound registration call on first use, but it does not describe an explicit user warning or consent flow before the network request occurs. Silent transmission of installation metadata reduces transparency and can violate user expectations or organizational policies, even if no secrets are sent.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The client performs silent automatic updates that can modify installed package files without a user-facing warning at command execution time. For a creative skill, silent code changes reduce user control and make post-install behavior unpredictable, increasing the impact of any compromise in the update channel or publisher account.

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
89% confidence
Finding
The script persists a bearer access token to disk in credentials.json, creating durable local access to a remote service with broad scopes including wallet spending and artifact/task operations. While file permissions are tightened, compromise of the local user context, backups, or adjacent tooling could expose the token and enable unauthorized service use.

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
93% confidence
Finding
The script explicitly targets credentials.json as part of the removable shared state set, indicating access to authentication material outside the skill's stated business purpose. In this context, credential handling inside a food-post skill increases attack surface and creates unnecessary exposure of bearer-token state.

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
96% confidence
Finding
The _device_token function reads an access token from ~/.beatra/credentials.json and then uses it for a bearer-authorized revocation request. Direct token access by a skill that is supposed to generate food-note content is unjustified and dangerous because any code path with raw bearer-token access can be repurposed for unauthorized account or device actions.

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 exposed update functionality enables self-modification of the installed client package, which is a high-risk capability for a skill whose stated purpose is food-post generation. Self-modifying behavior increases persistence and supply-chain risk because future code can change independently of the originally reviewed package, undermining user and platform trust.

Static analysis

No suspicious patterns detected.