Back to skill

Security audit

Kannaka Radio

Security checks for vulnerabilities and agentic risk

Overview

The skill describes a radio service, but the packaged launcher points outside the skill to run server code and manage process state, while the advertised server implementation is missing.

Review before installing. Do not run this as root or with elevated privileges. The package should be fixed to include its server code, keep runtime files inside the skill directory, remove any embedded Flux token fallback, and clearly document unauthenticated local network endpoints and optional remote publishing.

Vulnerability Patterns
  • 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
  • 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)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/radio.sh:39
Finding

Path Traversal Outside the Skill Directory Enables Unintended Code Execution and Process Termination

Content
View full analysis
"$PID_FILE" sleep 1.5 ``` ```bash cmd_stop() { if ! is_running; then echo "Kannaka Radio is not running" return 0 fi local pid pid=$(cat "$PID_FILE") kill "$pid" 2>/dev/null && echo "Stopped (PID $pid)" || echo "Already stopped" rm -f "$PID_FILE" } ``` ### Technical Analysis The script assumes that the repository root is three parent directories above the Skill directory. That assumption is incompatible with the supplied package layout. For the audited installation path, traversing three parents from the `artifact` directory resolves to the filesystem root: ```text artifact/.. -> package temporary directory artifact/../.. -> /tmp artifact/../../.. -> / ``` Consequently, the effective paths become: ```text SERVER_JS=/server/index.js PID_FILE=/.radio.pid ``` The wrapper therefore does not execute a server bundled with the Skill. Instead, it attempts to execute an unrelated JavaScript file outside the Skill's trust boundary. It also reads, creates, and deletes a PID file at an external location. No `server/index.js` exists in the audited package, so this behavior is not necessary for the declared radio functionality. It ...[truncated 2217 chars]
Remediation
View remediation
&2 exit 1 fi ``` 4. Validate the PID file before using it: ```bash read_pid() { [[ -f "$PID_FILE" && ! -L "$PID_FILE" ]] || return 1 local pid IFS= read -r pid < "$PID_FILE" [[ "$pid" =~ ^[1-9][0-9]*$ ]] || return 1 printf '%s\n' "$pid" } ``` 5. Before signaling a process, verify that its executable and command line correspond to the expected Node server. On Linux, compare `/proc/$pid/cmdline` and `/proc/$pid/exe` with the expected command. Refuse to signal the process if verification fails. 6. Write the PID file atomically and prevent symbolic-link attacks by creating it in a private runtime directory. Remove it only after confirming that it is the Skill's own PID file. 7. Do not run this wrapper as root or with elevated privileges. 8. Include the advertised `server/index.js` and supporting package files in the Skill package so the implementation can be audited and executed without relying on files outside the package. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (10)

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

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

md
| `GET /api/queue` | GET | Get user queue |
| `POST /api/queue` | POST | Add track to queue `{"filename":"..."}` |
| `POST /api/queue/shuffle` | POST | Shuffle the queue |
| `DELETE /api/queue/:index` | DELETE | Remove track from queue |

### Live Broadcasting

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

Advertising an embedded fallback API token for remote Flux publishing is a strong indicator of a hardcoded credential. Hardcoded API tokens can be extracted from source, reused by unauthorized parties, and enable untracked remote actions or data exfiltration; in this skill's context, that includes publishing now-playing or perception-related data to an external service.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The README explicitly advertises publishing perceptual data to an external service and broadcasting audio to browsers/agents, but it does not warn users that running the skill may expose listening activity, metadata, and network-reachable endpoints. In a skill centered on streaming, WebSocket, WebRTC, NATS, and external publishing, omission of privacy and exposure warnings materially increases the chance that users enable data-sharing features without informed consent.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
70% confidence
Finding

Without declared permissions the skill's intent is opaque and cannot be validated.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The documentation presents env: [] under required environment variables while later stating that FLUX_TOKEN has an embedded fallback. That inconsistency is dangerous because it strongly suggests the skill may contain or rely on a hardcoded credential for remote publishing, which can be unintentionally exposed, reused, or trusted without operator awareness.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The manifest states that FLUX_TOKEN may use an embedded fallback in source while also asserting that API keys are only read from environment variables. A credential fallback embedded in code or distributed skill assets is effectively a hardcoded secret, which can be extracted by anyone with access to the package and reused against the remote Flux service.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The set-dir command sends a POST request that changes the server's active music directory, which can affect user data access and runtime behavior. Although the result is printed afterward, there is no prior warning, confirmation, or explanatory comment indicating that this operation changes live server state.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

The live-start and live-stop commands issue state-changing POST requests that control broadcasting, which can affect privacy or system behavior, but the script provides no advance disclosure beyond a success message after execution. There is no confirmation prompt, cautionary help text, or inline warning describing the impact of toggling live broadcasting.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
89% confidence
Finding

The setup instructions tell users to start the service and browse to localhost without warning that this launches a web server and WebSocket endpoint. While local binding is often acceptable, the broader skill context includes browser access, agent subscriptions, and live broadcast features, so users should be clearly informed that a persistent network service is being opened.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
81% confidence
Finding

The markdown explains how to copy music into the bundled folder and later describes generated music, cached TTS, and saved live broadcast chunks, but it presents these as setup/features rather than explicit user-impact warnings. For a skill that manipulates local media collections and writes generated artifacts, a clearer disclosure would better inform users about data and storage impact.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.