Back to skill

Security audit

Bank Desk Board Pack

Security checks for vulnerabilities and agentic risk

Overview

The skill is a disclosed Beatra image-generation workflow, but it grants and retains broader Beatra account authority than its board-image purpose needs and silently self-updates executable package files.

Review this skill before installing if you are not comfortable giving Beatra a persistent shared device token with broad media, wallet, artifact, and task permissions. Disable automatic updates with the documented update command if you require reviewed code to remain unchanged, and only run paid generation after checking the live credit card and approval prompt.

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

Error
Location
scripts/authorize.py:31
Finding

Overprivileged device authorization and unrestricted MCP tool routing

Content
View full analysis
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 purpose of the Skill is to create bank desk board images from user-supplied text. Its legitimate operations require image generation and editing, optional artifact upload, model discovery, task polling, and limited billing information. The authorization request nevertheless includes capabilities unrelated to that purpose: - Video generation - Music generation - Speech generation - Voice-resource reading and writing - General wallet spending - Task cancellation The package does not enforce a local allowlist of tools permitted for this Skill. The command-line interface accepts any `tool_name` and sends it throug ...[truncated 1900 chars]
Remediation
View remediation

T03 · Remote Payload Retrieval and Execution

Warning
Location
scripts/mcp_client.py:969
Finding

Silent automatic retrieval and installation of remotely mutable executable code

Content
View full analysis
dict[str, Any]: path = update_home / "state.json" try: value = json.loads(path.read_text(encoding="utf-8")) except (OSError, json.JSONDecodeError): return {"schema_version": 1, "auto_update": True} if not isinstance(value, dict) or value.get("schema_version") != 1: return {"schema_version": 1, "auto_update": True} return value ``` Ordinary commands silently retrieve and install a newer release: ```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 ): ...[truncated 4481 chars]
Remediation
View remediation
Vulnerability Patterns
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Rogue AgentSelf-Modification, Session Persistence
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (45)

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The documented references indicate uninstall, authorization revocation, and deletion of local credential and installation files, none of which are implied by the public description of a board-graphics skill. This is risky because a seemingly innocuous content skill can modify account state and local files, creating opportunities for destructive or confusing host-side changes if invoked unexpectedly.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The documented references indicate uninstall, authorization revocation, and deletion of local credential and installation files, none of which are implied by the public description of a board-graphics skill. This is risky because a seemingly innocuous content skill can modify account state and local files, creating opportunities for destructive or confusing host-side changes if invoked unexpectedly.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The documented references indicate uninstall, authorization revocation, and deletion of local credential and installation files, none of which are implied by the public description of a board-graphics skill. This is risky because a seemingly innocuous content skill can modify account state and local files, creating opportunities for destructive or confusing host-side changes if invoked unexpectedly.

Content

No source excerpt is available for this finding.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 89)May include surrounding context.

md
Submit once through bundled `scripts/mcp_client.py`. Poll

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 117)May include surrounding context.

md
Submit once through bundled `scripts/mcp_client.py`. Poll

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 121)May include surrounding context.

md
Submit once through bundled `scripts/mcp_client.py`. Poll

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 129)May include surrounding context.

md
Submit once through bundled `scripts/mcp_client.py`. Poll

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 180)May include surrounding context.

md
Submit once through bundled `scripts/mcp_client.py`. Poll

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 181)May include surrounding context.

md
Submit once through bundled `scripts/mcp_client.py`. Poll

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 182)May include surrounding context.

md
Submit once through bundled `scripts/mcp_client.py`. Poll

Intent-Code Divergence

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The changelog references tier pricing, a top-up address, and newly added balance and ledger calls, which strongly contradict the manifest's stated image/board-generation purpose. This kind of capability mismatch is a red flag for hidden financial or account-related functionality that could be invoked under the cover of an unrelated benign skill.

Content

No source excerpt is available for this finding.

Credential Access

High
Category
Privilege Escalation
Confidence
91% confidence
Finding

The manifest explicitly references a local credential file for device-bearer authentication to a remote service. Access to persistent credentials is sensitive, and in the context of a skill advertised as simple board generation, this creates a substantial risk of unjustified token use, privilege abuse, or unauthorized remote operations if the skill or service is compromised.

Content

Scanner excerpt · manifest.json (reported line 53)May include surrounding context.

json
},
  "mcp": {
    "authentication": "device-bearer",
    "credential_file": "~/.beatra/credentials.json",
    "name": "beatra",
    "transport": "streamable-http",
    "url": "https://mcp.beatra.ai/mcp"

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · references/installation-and-auth.md (reported line 14)May include surrounding context.

text

They share the one full-scope Device Token stored in
`~/.beatra/credentials.json`. Installing or switching packages must not trigger
another authorization when that credential is already valid. Do not add,
enable, trust, or configure a host Beatra Connector. Never print or move the
token into command arguments, environment variables, logs, chat, or another

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · references/installation-and-auth.md (reported line 21)May include surrounding context.

text

They share the one full-scope Device Token stored in
`~/.beatra/credentials.json`. Installing or switching packages must not trigger
another authorization when that credential is already valid. Do not add,
enable, trust, or configure a host Beatra Connector. Never print or move the
token into command arguments, environment variables, logs, chat, or another

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · references/installation-and-auth.md (reported line 49)May include surrounding context.

text

They share the one full-scope Device Token stored in
`~/.beatra/credentials.json`. Installing or switching packages must not trigger
another authorization when that credential is already valid. Do not add,
enable, trust, or configure a host Beatra Connector. Never print or move the
token into command arguments, environment variables, logs, chat, or another

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · references/mcp-connection.md (reported line 10)May include surrounding context.

text

They share the one full-scope Device Token stored in
`~/.beatra/credentials.json`. Installing or switching packages must not trigger
another authorization when that credential is already valid. Do not add,
enable, trust, or configure a host Beatra Connector. Never print or move the
token into command arguments, environment variables, logs, chat, or another

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/mcp_client.py (reported line 1025)May include surrounding context.

python
```

They share the one full-scope Device Token stored in
`~/.beatra/credentials.json`. Installing or switching packages must not trigger
another authorization when that credential is already valid. Do not add,
enable, trust, or configure a host Beatra Connector. Never print or move the
token into command arguments, environment variables, logs, chat, or another

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/uninstall.py (reported line 40)May include surrounding context.

python
```

They share the one full-scope Device Token stored in
`~/.beatra/credentials.json`. Installing or switching packages must not trigger
another authorization when that credential is already valid. Do not add,
enable, trust, or configure a host Beatra Connector. Never print or move the
token into command arguments, environment variables, logs, chat, or another

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The file implements a full OAuth device-authorization flow, launches a browser, performs network requests, and persists bearer credentials with broad scopes such as wallet:spend and multiple generation capabilities. That is far outside the stated purpose of a bank desk board/still generator, so it materially expands the skill's privilege surface and creates a path for unnecessary credential capture and remote account access if the package is installed or abused.

Content

No source excerpt is available for this finding.

Credential Access

High
Category
Privilege Escalation
Confidence
95% confidence
Finding

The script accesses and validates a persistent credentials.json file containing bearer-token material for a remote service. In context, this is dangerous because the skill's declared purpose does not justify handling long-lived credentials, and the requested scopes include sensitive capabilities that could be abused if the token is stolen or the auth flow is subverted.

Content

Scanner excerpt · scripts/authorize.py (reported line 207)May include surrounding context.

python
def _existing_credential(state_dir: Path) -> Path | None:
    path = state_dir / "credentials.json"
    try:
        path_stat = os.lstat(path)
        if not stat.S_ISREG(path_stat.st_mode):

Credential Access

High
Category
Privilege Escalation
Confidence
97% confidence
Finding

The code writes a new credentials.json file containing an access token, credential identifiers, installation identifiers, and broad scope grants after OAuth completion. Persisting bearer credentials in a skill package with unrelated functionality increases the blast radius of compromise and creates a clear target for token theft or misuse.

Content

Scanner excerpt · scripts/authorize.py (reported line 514)May include surrounding context.

python
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,
                {

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The file implements a general networked MCP client with credential handling, remote tool calls, uploads, telemetry, and package update capabilities, which is materially broader than a bank desk board graphics skill's declared purpose. This unnecessary capability expansion increases attack surface and creates a remote-control channel that could be abused to exfiltrate data, invoke unrelated tools, or change local package state.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
96% confidence
Finding

The code can download manifests and archives from remote infrastructure and replace files in its own installation directory. Even with several integrity checks, self-modifying code is high risk in a content-generation skill because compromise of the update channel, signing pipeline, or package hosting would let new behavior be introduced after installation.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
96% confidence
Finding

The CLI supports listing arbitrary tools and calling any remote tool name with JSON from stdin, far beyond the stated board-graphics function. In the skill context this is dangerous because it turns a narrow creative package into a general remote action proxy that can be repurposed for unrelated or sensitive operations.

Content

No source excerpt is available for this finding.

Self-Modification

High
Category
Rogue Agent
Confidence
95% confidence
Finding

The exposed self-update command enables runtime-triggered modification of the installed package, which is inconsistent with a simple bank desk board generation skill. Self-modification materially raises risk because post-installation behavior can change via network-delivered content, complicating review, containment, and trust.

Content

Scanner excerpt · scripts/mcp_client.py (reported line 1503)May include surrounding context.

python
)
    update = subparsers.add_parser(
        "update",
        help="Check, install, or configure Beatra package self-updates",
    )
    update.add_argument(
        "--check",