Back to skill

Security audit

Ultimate Music Manager

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly matches its music-library purpose, but it asks users to run unpinned remote code with broad file-changing authority and includes an unsafe helper-script pattern.

Review before installing. Use a backup or copy of the music library first, pin the upstream repository to a specific reviewed commit, inspect requirements before installing, avoid running status.sh until the eval issue is fixed, and enable Spotify only if you are comfortable with playlist changes and local library metadata being used for sync.

Vulnerability Patterns
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • 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)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/status.sh:55
Finding

Arbitrary Shell Command Execution Through Unsafe eval of Configuration Values

Content
View full analysis
/dev/null)" ``` Related unsafe interpolation also occurs in `scripts/status.sh`, lines 81–97 and 105–113: ```bash "$PYTHON" -c " import json, sys try: data = json.load(open('$file', encoding='utf-8')) if isinstance(data, dict): # For catalogs keyed by path or hash if 'files' in data: print(len(data['files'])) else: print(len(data)) elif isinstance(data, list): print(len(data)) else: print('?') except Exception: print('ERR') " 2>/dev/null ``` ```bash "$PYTHON" -c " from pathlib import Path size = Path('$file').stat().st_size for unit in ('B','KB','MB','GB'): if size < 1024 or unit == 'GB': print(f'{size:.1f} {unit}') break size /= 1024 " 2>/dev/null ``` ### Technical Analysis The script imports path values from `config.py`, converts them into shell assignment statements, and sends the generated text to Bash `eval`. `eval` treats its input as executable shell syntax rather than plain data. The generated assignments use double quotes but do not shell-escape the configuration values. If a value contains a double quote, command substitution, shell separator, newline, or similar metacharacter, it can terminate the intended assignment and introduce a new command. These values may ultimately be influenced by `.env` or other configura ...[truncated 1764 chars]
Remediation
View remediation

T03 · Remote Payload Retrieval and Execution

Warning
Location
SKILL.md:57
Finding

Mutable Remote Pipeline Is Downloaded and Executed Without Revision or Integrity Verification

Content
View full analysis
Remediation
View remediation
``` 3. Verify the retrieved revision against a documented cryptographic checksum or a verified signed commit/tag. 4. Record the exact approved revision in both `SKILL.md` and `_meta.json`. 5. Pin all Python dependencies to exact versions. 6. Generate and verify hashes for every dependency, then install with: ```bash python -m pip install --require-hashes -r requirements.lock ``` 7. Prefer an internal or otherwise controlled package mirror for high-assurance deployments. 8. Review the remotely retrieved `config.py`, pipeline scripts, authentication code, and dependency lock file before granting access to `MUSIC_ROOT` or Spotify credentials. 9. Run the pipeline with a dedicated low-privilege account or in a sandbox with filesystem access restricted to the selected music and data directories. 10. Keep Spotify support disabled unless explicitly requested, and expose Spotify credentials only to the specific Phase 6 process that requires them. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (17)

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description promises end-user functionality for organizing and enriching a local music library. However, this code chunk does not process audio files, inspect metadata, deduplicate content, identify songs, query Spotify, or reorganize folders. Instead, it acts as a safety wrapper around Bash tool usage, watching for certain destructive script names and warning the agent before execution. That is a materially different purpose and an undeclared capability, so the description does not accurately represent this code chunk.

Content

No source excerpt is available for this finding.

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

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

Content

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

md
#   1. Python 3.12 is available
#   2. Virtual environment is active
#   3. Required pip packages are installed
#   4. .env file exists in the repo root
#   5. MUSIC_ROOT is set and points to a real directory
#   6. config.py executes without error
#   7. FFmpeg is available (optional — warns but does not fail)

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

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

Content

Scanner excerpt · scripts/preflight.sh (reported line 16)May include surrounding context.

sh
#   1. Python 3.12 is available
#   2. Virtual environment is active
#   3. Required pip packages are installed
#   4. .env file exists in the repo root
#   5. MUSIC_ROOT is set and points to a real directory
#   6. config.py executes without error
#   7. FFmpeg is available (optional — warns but does not fail)

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

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

Content

Scanner excerpt · scripts/preflight.sh (reported line 104)May include surrounding context.

sh
#   1. Python 3.12 is available
#   2. Virtual environment is active
#   3. Required pip packages are installed
#   4. .env file exists in the repo root
#   5. MUSIC_ROOT is set and points to a real directory
#   6. config.py executes without error
#   7. FFmpeg is available (optional — warns but does not fail)

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

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

Content

Scanner excerpt · scripts/preflight.sh (reported line 108)May include surrounding context.

sh
#   1. Python 3.12 is available
#   2. Virtual environment is active
#   3. Required pip packages are installed
#   4. .env file exists in the repo root
#   5. MUSIC_ROOT is set and points to a real directory
#   6. config.py executes without error
#   7. FFmpeg is available (optional — warns but does not fail)

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

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

Content

Scanner excerpt · scripts/preflight.sh (reported line 113)May include surrounding context.

sh
#   1. Python 3.12 is available
#   2. Virtual environment is active
#   3. Required pip packages are installed
#   4. .env file exists in the repo root
#   5. MUSIC_ROOT is set and points to a real directory
#   6. config.py executes without error
#   7. FFmpeg is available (optional — warns but does not fail)

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

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

Content

Scanner excerpt · scripts/preflight.sh (reported line 119)May include surrounding context.

sh
#   1. Python 3.12 is available
#   2. Virtual environment is active
#   3. Required pip packages are installed
#   4. .env file exists in the repo root
#   5. MUSIC_ROOT is set and points to a real directory
#   6. config.py executes without error
#   7. FFmpeg is available (optional — warns but does not fail)

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

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

Content

Scanner excerpt · scripts/preflight.sh (reported line 129)May include surrounding context.

sh
#   1. Python 3.12 is available
#   2. Virtual environment is active
#   3. Required pip packages are installed
#   4. .env file exists in the repo root
#   5. MUSIC_ROOT is set and points to a real directory
#   6. config.py executes without error
#   7. FFmpeg is available (optional — warns but does not fail)

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

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

Content

Scanner excerpt · scripts/preflight.sh (reported line 106)May include surrounding context.

sh
# ---------------------------------------------------------------------------
# 4. .env file
# ---------------------------------------------------------------------------
ENV_FILE="$REPO_ROOT/.env"
if [ ! -f "$ENV_FILE" ]; then
    warn ".env file not found at $ENV_FILE"
    info "Copy the example and fill in MUSIC_ROOT:"

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

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

Content

Scanner excerpt · scripts/preflight.sh (reported line 110)May include surrounding context.

sh
# ---------------------------------------------------------------------------
# 4. .env file
# ---------------------------------------------------------------------------
ENV_FILE="$REPO_ROOT/.env"
if [ ! -f "$ENV_FILE" ]; then
    warn ".env file not found at $ENV_FILE"
    info "Copy the example and fill in MUSIC_ROOT:"

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
89% confidence
Finding

The skill documents use of environment variables, networked APIs, and shell scripts, but it does not declare an explicit tool scope such as permissions or allowed-tools. In an agent environment, that omission weakens containment and makes it easier for the skill to access secrets, local files, or external services more broadly than users may expect.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
84% confidence
Finding

The Spotify sync feature transmits library-derived metadata and listening correlations to a third party, but the skill does not present an explicit privacy warning or data-sharing notice. Users may unknowingly expose artist, track, language, and playlist-structure information tied to their local collection.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The skill claims 'No writes into the music hierarchy,' yet elsewhere it explicitly sorts and moves files into a new hierarchy under MUSIC_ROOT. This kind of contradictory safety claim can mislead users and agents into approving operations they believe are non-invasive, increasing risk of unintended file modification or relocation.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

This is a real issue because the document broadly claims the entire DATA_DIR is safe to delete, yet later documents that the same directory contains Spotify OAuth token cache, sync state, and backup artifacts. A user or downstream agent following the instruction could unintentionally delete credentials, rollback data, and resumability state, causing account re-authentication, loss of recovery information, and possible unsafe re-sync behavior.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The script uses eval on shell assignments generated from Python values loaded from config.py. If any config value contains shell metacharacters, quotes, command substitutions, or crafted payloads, eval will execute them in the current shell, turning a configuration file into a code execution vector. In this skill context, config paths are central to local library management, so a tampered repo or malicious config can achieve arbitrary local command execution whenever the user runs the status dashboard.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
78% confidence
Finding

Line L190 describes Phase 5 as producing a read-only master snapshot, but L192 immediately lists residue purge and empty-folder vacuum utilities as supporting scripts in that phase. That pairing blurs a claimed read-only phase with documented mutating cleanup operations, creating intent ambiguity in the documentation.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
84% confidence
Finding

The document states that the pipeline classifies tracks by language using NLP and then reinforces that behavior through manual overrides, but it does not mention any user choice, opt-in, or way to disable language-based sorting. Because locale/language handling is being imposed as a default organizational behavior, this may conflict with a policy requiring user choice for language or locale decisions.

Content

No source excerpt is available for this finding.