TavernKeeper Scan Report

SpicyMarinara/SillyTavern-Spotify-Music-Extension

Commit 979cbe3 Reviewed

No material or immediate-danger concern was identified in this review.

This advisory report describes what the named tools and review process found at one exact commit. Unknown or unobserved behavior may still exist.

0 immediate danger 0 material 6 low

What this review found

No material or immediate-danger item was identified.

Contextual expected matches (4)

JavaScript analysis reported javascript.xray.serialize-environment

Expected behavior · high confidence

The server plugin reads Spotify API credentials from environment variables, which is a standard and expected way to configure server-side applications with API keys.

Technical evidence

Scanner reason: JavaScript analysis matched static JavaScript security signal javascript.xray.serialize-environment. The match applies to this repository.

Contextual assessment: The scanner flagged a 'serialize-environment' signal on line 8, where the code reads process.env.SPOTIFY_MUSIC_CLIENT_ID and process.env.SPOTIFY_MUSIC_CLIENT_SECRET. This is a standard Node.js configuration pattern for a server-side SillyTavern plugin to obtain its Spotify API credentials from the environment. The credentials are used solely for authenticating with Spotify's official OAuth and API endpoints. There is no serialization or exfiltration of the full process.env object; only two specific, project-relevant environment variables are read. This matches the project's stated purpose of Spotify integration with server-side credential handling.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1
Rule
javascript.xray.serialize-environment
File role
production
Source
spotify-music/index.mjs:8

JavaScript analysis reported javascript.download-to-execution

Expected behavior · high confidence

This is a SillyTavern extension that plays Spotify music based on AI mood analysis. The flagged code simply makes requests to the local SillyTavern server and uses standard AI generation features to suggest songs — exactly what the extension is designed to do.

Technical evidence

Scanner reason: JavaScript analysis matched static JavaScript security signal javascript.download-to-execution. The match applies to this repository.

Contextual assessment: The scanner correlated network retrieval primitives with a dynamic execution sink in the same file. Examining the actual code, the network primitives are fetch() calls to the local SillyTavern plugin API at '/api/plugins/spotify-music' for credential management, auth status, playback control, and playback polling — all standard extension-to-server communication. The 'execution sink' corresponds to imports of generateQuietPrompt and generateRaw from SillyTavern's script.js, which are the standard AI text-generation APIs used to obtain music suggestions based on chat mood. There is no eval(), Function constructor, or dynamic code execution from retrieved network data. All fetch destinations are the local server plugin. The AI generation calls are invoked with locally constructed prompts for mood analysis, which matches the project's stated purpose. No downloaded content is passed to an execution sink; the correlation is coincidental presence of fetch and AI-generation imports in the same file.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1
Rule
javascript.download-to-execution
File role
production
Source
SillyTavern-Spotify-Music-Extension/index.js:219-495

JavaScript analysis reported javascript.credential-to-network

Expected behavior · high confidence

The server plugin reads Spotify credentials and sends them to Spotify's official API to authenticate — exactly what a Spotify integration is supposed to do. No credentials are sent to any third party.

Technical evidence

Scanner reason: JavaScript analysis matched static JavaScript security signal javascript.credential-to-network. The match applies to this repository.

Contextual assessment: The scanner correlated credential-bearing state with an outbound network sink. The code reads SPOTIFY_CLIENT_ID and SPOTIFY_CLIENT_SECRET from environment variables and a local credentials.json file, then uses axios to POST to Spotify's official token endpoint (accounts.spotify.com/api/token) with a Basic auth header containing those credentials for the OAuth authorization-code and refresh-token flows. Subsequent API calls use the resulting bearer access token against api.spotify.com/v1 for playback control. All outbound network destinations are Spotify's official, hardcoded API URLs. No credentials are sent to any third-party or attacker-controlled endpoint. The credential persistence to credentials.json is local to the plugin directory. This data flow is entirely consistent with the project's stated purpose of OAuth-based Spotify integration with server-side credential storage. A minor weakness exists in that credentials.json stores secrets in plaintext and the GET /config endpoint returns truncated credential prefixes, but in the SillyTavern local-server threat model these do not constitute material exposure.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1
Rule
javascript.credential-to-network
File role
production
Source
spotify-music/index.mjs:9-169

JavaScript analysis reported javascript.xray.shady-link

Expected behavior · high confidence

The flagged text is a standard Spotify resource identifier for the liked songs collection, used in a normal API call to start playback. It is not a suspicious link and does exactly what the extension advertises.

Technical evidence

Scanner reason: JavaScript analysis matched static JavaScript security signal javascript.xray.shady-link. The match applies to this repository.

Contextual assessment: Detailed technical wording was omitted by the public report safety filter.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1
Rule
javascript.xray.shady-link
File role
production
Source
spotify-music/index.mjs:293

Related contextual observations

Reflected query parameter in OAuth callback HTML response

low risk · medium confidence

The login error page inserts a value from the URL directly into the page without sanitizing it, which could allow script injection. Because this is a local callback page only the user visits, the practical risk is low.

Technical assessment

Detailed technical wording was omitted by the public report safety filter.

Impact: low · Exploitability: unlikely

Developer action: Consider HTML-escaping the error query parameter before interpolation, or use a static error message instead of reflecting user-supplied query input.

Sources:

Spotify credentials persisted to local file

low risk · high confidence

The extension stores Spotify client credentials in a local JSON file so they persist across restarts, which is expected for a plugin that needs Spotify API access.

Technical assessment

The credentials.json file stores the Spotify Client ID and Client Secret locally in the plugin directory. This is a common pattern for SillyTavern plugins and matches the extension's stated purpose of maintaining Spotify credentials. The file is read on startup and written when the user submits credentials via the /config endpoint. No credentials are sent to any destination other than the official Spotify token endpoint during OAuth.

Impact: none · Exploitability: unlikely

Developer action: none

Sources:

Coverage and limitations

JavaScript coverage

Tools

Limitations

Technical scan identity