Back to skill

Security audit

Save To Spotify

Security checks across malware telemetry and agentic risk

Overview

The skill is coherent for creating private Spotify audio episodes, but it uses high-impact setup, Spotify account access, raw bearer-token handling, connected personal data, and cloud providers with uneven consent and disclosure.

Install only if you are comfortable with a Spotify-connected tool that can save private episodes, manage timelines, and use local or cloud TTS/image providers. Review the installer before running it, do not expose the printed Spotify bearer token in logs or prompts, require explicit approval before setup and upload, and avoid using sensitive, confidential, or regulated content unless you have checked where the chosen providers will process it.

SkillSpector

By NVIDIA
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
Findings (15)

Context-Inappropriate Capability

Medium
Confidence
89% confidence
Finding
The documentation explicitly advertises a command that prints the current Spotify bearer token for reuse against arbitrary Web API endpoints. In an agent setting, exposing raw access tokens to stdout increases the chance of token leakage through logs, command output capture, prompt injection chains, or reuse outside the tool's intended save/upload scope.

Context-Inappropriate Capability

Medium
Confidence
88% confidence
Finding
The onboarding flow authorizes the agent to install additional system software such as Python in order to satisfy a dependency chain for TTS. That expands the skill's privileges beyond creating Spotify content and can lead to unexpected package installation, system modification, and supply-chain risk, especially if the user does not clearly understand that broader host changes are being made.

Context-Inappropriate Capability

High
Confidence
98% confidence
Finding
The flow instructs use of a remote curl-pipe-to-bash installer, which executes network-fetched code directly in a shell without local review. This is a classic supply-chain and remote code execution risk: compromise of the distribution endpoint, DNS/TLS interception, or a malicious update could lead to arbitrary code execution on the user's machine.

Intent-Code Divergence

Medium
Confidence
91% confidence
Finding
The design principle promises that nothing is uploaded without user approval, but the described flow proceeds from preview into save without a distinct final consent gate for upload. That mismatch can cause the agent to publish content to the user's Spotify library based on implied approval, which is a meaningful integrity and privacy issue even if episodes are private.

Vague Triggers

Medium
Confidence
79% confidence
Finding
The manifest description is very broad and includes generic capabilities like creating polished audio content and saving media, which can cause the skill to be invoked in situations beyond the user's clear intent. Over-broad triggering increases the chance of surprising actions such as installation prompts, authentication setup, file processing, or uploads to a connected account when the user only asked for general audio help.

Vague Triggers

Medium
Confidence
87% confidence
Finding
The onboarding trigger examples include vague phrases like 'get started' and 'help me start', which are common conversational requests and not specific to Spotify publishing. In an agentic environment, ambiguous trigger phrases can route unrelated requests into a workflow that performs account-linked setup, gathers content, and prepares uploads, increasing the risk of unintended side effects.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The guidance actively recommends cloud TTS providers such as OpenAI, ElevenLabs, Google Cloud TTS, and Amazon Polly, but it does not clearly warn that episode text may be transmitted to third-party services for processing. Because this skill is designed to turn user-provided source material into narrated audio, users may paste sensitive, copyrighted, private, or regulated content and unknowingly send it off-device, creating privacy, confidentiality, and compliance risks.

Missing User Warnings

Low
Confidence
90% confidence
Finding
The sample code downloads executable parsing inputs (font files) from remote URLs at runtime and caches them locally without integrity verification or explicit disclosure. If the upstream source, transport path, or referenced repository content is tampered with, the skill could consume malicious or unexpected font data, creating supply-chain risk and unnecessary outbound network behavior on the user’s machine.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The daily briefing recipe instructs the agent to automatically pull from connected services like Google Calendar, GitHub, and Linear with 'zero typing' and no explicit notice or confirmation. That can cause the agent to access and summarize sensitive personal or work data the user did not realize would be used, creating a privacy and consent issue rather than a purely functional default.

Missing User Warnings

Medium
Confidence
86% confidence
Finding
The travel guide recipe lists location data as a data source without any disclosure or permission prompt. Because location information is sensitive, using it implicitly for personalization can expose private travel plans or precise movement-related context beyond what the user expected from a simple content-generation flow.

Natural-Language Policy Violations

Medium
Confidence
84% confidence
Finding
The instruction to apply language from locale by default means the agent may infer and use locale-derived personal settings without user opt-in. Locale can reveal sensitive inferences about nationality, region, or preferred language, and forcing it by default may surprise users or mis-handle multilingual contexts.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
Every episode — regardless of content type — must complete these steps.

0. **Preflight: install, auth, and voice engine** — Run `save-to-spotify --json doctor` before any sourcing. This checks the binary, auth, TTS engines, and ffmpeg in one call. If the binary is missing, ask the user to confirm installation, install it with the command in the Install section after they approve, then run doctor again. If unauthenticated, run `save-to-spotify setup` directly (do not ask the user to run it — just run it). The setup command handles auth + TTS detection in one pass and auto-detects headless environments. **Then confirm a TTS engine is available** via the `tts_engines` field in the doctor output: if one is already set up or the user has a preference, use it; otherwise check for an existing API key (`OPENAI_API_KEY`, `ELEVENLABS_API_KEY`) and suggest that engine first — no install, higher quality. If no key is present, **ask the user** whether to install **Kokoro** (free, local, ~340 MB, [Apache-2.0 licensed](https://raw.githubusercontent.com/hexgrad/kokoro/refs/heads/main/LICENSE)) — put the license link in the question text above the choices, where markdown renders it clickable; never inside option labels, which are plain text. Do not install silently. If they accept, run `save-to-spotify tts setup`. Confirm an engine is *available* before scripting; the interactive voice pick and preview can be deferred until the content is approved — content before audio. Voice previews use the player page in [references/local-preview.md](references/local-preview.md) ("Voice preview page"), never auto-play.
1. **Interview** — Ask the user about preferences, including companion-image source. Present a plan and **wait for confirmation**
2. **Script** — Present a short chapter overview (compact numbered list, bold chapter names, one line each, no blank lines between items) and get it approved first (revising an outline is free; never dump a full transcript on the user), then write the 
...[truncated 25 chars]
Confidence
93% confidence
Finding
do not ask the user

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
## Design principles

1. **Always present choices, never ask for free text** — every decision point must be a list of options the user can pick from. Never ask the user to type something. Open-ended text input breaks the flow and creates friction. If you need input, present smart options and let them pick. And embed whatever the user is judging (chapter list, preview URL, file link) **inside the choice prompt itself** — plain text printed before a choice popup can be hidden by it, leaving the user a question about content they never saw
2. **Content before audio** — chapters are approved and the script written before any voice or audio work. Iterating on text costs nothing; regenerating audio does
3. **Show, don't tell** — script summaries, voice previews, and a local browser preview of the finished episode
4. **Default everything** — language, length, voice, cover, show, and content topic all have smart defaults
Confidence
84% confidence
Finding
Never ask the user

Credential Access

High
Category
Privilege Escalation
Content
## Getting a bearer token

`save-to-spotify token` prints the current access token to stdout. That token has been verified to work as a Spotify Web API `Bearer` token for requests against `api.spotify.com`, so agents do not need a separate app registration for the catalog lookups below.

Guard the call because it exits non-zero when the stored token cannot be refreshed:
Confidence
93% confidence
Finding
access token

External Script Fetching

High
Category
Supply Chain
Content
curl -fsSL https://saveto.spotify.com/install.sh | bash -s -- --version 0.2.0

# Custom directory
curl -fsSL https://saveto.spotify.com/install.sh | bash -s -- --dir ~/.local/bin

# Via environment variables
SAVE_TO_SPOTIFY_VERSION=0.2.0 SAVE_TO_SPOTIFY_INSTALL_DIR=~/.local/bin \
Confidence
97% confidence
Finding
curl -fsSL https://saveto.spotify.com/install.sh | bash

VirusTotal

VirusTotal findings are pending for this skill version.

View on VirusTotal

Static analysis

No suspicious patterns detected.