Back to skill

Security audit

setlist-fpx

Security checks for vulnerabilities and agentic risk

Overview

The skill is transparent and purpose-aligned for setlist.fm, but it asks users to install a global cookie-capture CLI and replay browser session cookies to change account state.

Install only if you are comfortable granting this workflow access to your signed-in setlist.fm browser session. Prefer a pinned local fpx install, avoid shared machines and shell tracing/logging, do not paste cookies into scripts or logs, unset COOKIE after use, confirm each attendance change, and revoke or sign out the browser session when finished.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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
Findings (2)

T08 · Insecure Dependencies

Warning
Location
SKILL.md:82
Finding
Unpinned Global Installation of a Third-Party CLI## Vulnerability Details **File Location**: `SKILL.md`, line 82 **Vulnerability Type**: Unpinned third-party dependency installed globally **Risk Level**: Medium ```sh npm install -g @fetchproxy/cli # provides `fpx` ``` ### Technical Analysis The setup instructions install the latest available version of `@fetchproxy/cli` globally without an exact version pin, integrity constraint, signature verification, or documented provenance check. An npm installation may execute package lifecycle scripts with the permissions of the user running npm. Although the `fpx` tool is needed for the declared browser-cookie capture workflow, a mutable global installation exceeds the minimum-risk deployment model. A compromised publisher account, malicious future release, or registry compromise could cause different code to execute than the code originally reviewed. Global installation also exposes the package more broadly than a project-local dependency. The audit did not establish that the current package is malicious. The vulnerability is the unsafe supply-chain installation pattern. ### Attack Path 1. An attacker compromises the package publisher, package repository, or release process. 2. The attacker publishes a malicious version under the legitimate package name. 3. A user follows the Skill instructions and runs the unpinned global installation command. 4. npm resolves the mutable latest version and downloads the malicious package. 5. Malicious lifecycle or runtime code executes with the installing user's permissions. 6. The code may access local files, environment credentials, browser-session material, or other resources available to that user. ### Impact Assessment Successful exploitation could provide arbitrary code execution with the privileges of the user running npm. The affected scope may include user-accessible files, shell credentials, environment variables, browser-related data, and network resources ...[truncated 188 chars]
Remediation
## Remediation Suggestions 1. Pin `@fetchproxy/cli` to a reviewed exact version rather than installing the mutable latest release. 2. Document the package's official registry and source repository so users can verify provenance. 3. Record and verify package integrity metadata or a trusted release signature where available. 4. Prefer a project-local installation and invoke the pinned binary from that controlled environment. 5. Disable npm lifecycle scripts during installation when the package can operate without them; otherwise, explicitly review the required scripts. 6. Avoid elevated installation privileges and explain that the command must not be run with `sudo`. 7. Periodically review the pinned dependency before intentionally upgrading it.

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:94
Finding
Authentication Cookies Exposed Through Shell Variables and Process Arguments## Vulnerability Details **File Location**: `SKILL.md`, lines 94-97; sensitive values are subsequently passed to `curl` in `references/attendance-write.md`, including lines 29-30, 108-109, and 119 **Vulnerability Type**: Sensitive authentication data exposed through command-line arguments **Risk Level**: Medium ```sh COOKIE=$(fpx cookies -p setlist --domain www.setlist.fm \ | jq -r '[.JSESSIONID, .RememberMeCookie, .["aws-waf-token"]] | map(select(. != null)) | join("; ")') ``` The captured value is later expanded into commands such as: ```sh HTML=$(curl -s "https://www.setlist.fm$PATH_ONLY" \ -H "Cookie: $COOKIE" -H "User-Agent: $UA") ``` ### Technical Analysis The workflow deliberately extracts an HttpOnly `JSESSIONID`, an optional persistent `RememberMeCookie`, and an AWS WAF token from the browser. It stores them together in a shell variable and expands the result into a `curl` header argument. Sending an authentication cookie to `www.setlist.fm` is necessary for the declared attendance-toggle function. However, exposing the cookie through expanded process arguments is not the least-risk method. Depending on the operating system and local security configuration, process command lines may be observable through process inspection, debugging tools, shell tracing, telemetry, crash diagnostics, or monitoring software. Enabling shell tracing can also disclose the expanded value in logs. The inclusion of `RememberMeCookie` is particularly sensitive because it may remain reusable longer than the immediate Wicket session. The audited instructions do not clear the variable after use or warn users against command tracing and diagnostic capture. The network destination itself is appropriately constrained to HTTPS endpoints under setlist.fm. No transmission to an unrelated host or intentional credential exfiltration was found. ### Attack Path 1. The user pairs `fpx` with a signed-in browser and extracts val ...[truncated 1368 chars]
Remediation
## Remediation Suggestions 1. Avoid placing authentication cookies directly in process arguments. 2. Supply sensitive curl configuration through standard input or use a permission-restricted temporary cookie/configuration file. 3. If a temporary file is unavoidable, create it with mode `0600`, use a securely generated name, install cleanup traps, and delete it immediately after the operation. 4. Capture only the minimum cookie set required. Prefer `JSESSIONID` alone when it is sufficient, and avoid extracting `RememberMeCookie` unless required for the operation. 5. Clear `COOKIE` with `unset COOKIE` immediately after the authenticated requests complete. 6. Warn users not to enable `set -x`, shell command logging, or verbose diagnostics while handling session credentials. 7. Use a dedicated, short-lived setlist.fm session where practical and revoke or sign out the session after sensitive automation. 8. Retain the existing host restriction and ensure every authenticated request is constructed from a fixed `https://www.setlist.fm` origin.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
Findings (20)

External Script Fetching

High
Category
Supply Chain
Content
AJAX_PATH=$(echo "$FULL_AJAX_URL" | sed -E 's#https?://[^/]+##')
BASE_URL_HEADER=$(echo "$PATH_ONLY" | sed -E 's#^/##')   # Wicket-Ajax-BaseURL wants no leading slash

curl -s "https://www.setlist.fm$AJAX_PATH" \
  -H "Cookie: $COOKIE" -H "User-Agent: $UA" \
  -H 'Wicket-Ajax: true' \
  -H "Wicket-Ajax-BaseURL: $BASE_URL_HEADER" \
Confidence
90% confidence
Finding
This request replays an authenticated browser action using a captured session cookie to change account state on setlist.fm. Even though the intent is legitimate automation, the skill operationalizes cookie-based authenticated writes and instructs the user to inject a live session into curl, which raises account-takeover and unauthorized-action risk if the cookie is mishandled, logged, reused on shared systems, or copied into untrusted scripts.

External Transmission

Medium
Category
Data Exfiltration
Content
# setlist.fm REST API — read endpoints for curl

Base URL: `https://api.setlist.fm/rest` · every call: `-H "x-api-key: $SETLIST_API_KEY" -H 'Accept: application/json'`.
Optional: `-H "Accept-Language: en"` (one of `en es fr de pt tr it pl`) to localize city/country names.

All 15 read endpoints below are exactly what `setlist-mcp`'s tools call — same paths, same params.
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
# setlist.fm REST API — read endpoints for curl

Base URL: `https://api.setlist.fm/rest` · every call: `-H "x-api-key: $SETLIST_API_KEY" -H 'Accept: application/json'`.
Optional: `-H "Accept-Language: en"` (one of `en es fr de pt tr it pl`) to localize city/country names.

All 15 read endpoints below are exactly what `setlist-mcp`'s tools call — same paths, same params.
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
# setlist.fm REST API — read endpoints for curl

Base URL: `https://api.setlist.fm/rest` · every call: `-H "x-api-key: $SETLIST_API_KEY" -H 'Accept: application/json'`.
Optional: `-H "Accept-Language: en"` (one of `en es fr de pt tr it pl`) to localize city/country names.

All 15 read endpoints below are exactly what `setlist-mcp`'s tools call — same paths, same params.
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
# setlist.fm REST API — read endpoints for curl

Base URL: `https://api.setlist.fm/rest` · every call: `-H "x-api-key: $SETLIST_API_KEY" -H 'Accept: application/json'`.
Optional: `-H "Accept-Language: en"` (one of `en es fr de pt tr it pl`) to localize city/country names.

All 15 read endpoints below are exactly what `setlist-mcp`'s tools call — same paths, same params.
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
# setlist.fm REST API — read endpoints for curl

Base URL: `https://api.setlist.fm/rest` · every call: `-H "x-api-key: $SETLIST_API_KEY" -H 'Accept: application/json'`.
Optional: `-H "Accept-Language: en"` (one of `en es fr de pt tr it pl`) to localize city/country names.

All 15 read endpoints below are exactly what `setlist-mcp`'s tools call — same paths, same params.
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
# setlist.fm REST API — read endpoints for curl

Base URL: `https://api.setlist.fm/rest` · every call: `-H "x-api-key: $SETLIST_API_KEY" -H 'Accept: application/json'`.
Optional: `-H "Accept-Language: en"` (one of `en es fr de pt tr it pl`) to localize city/country names.

All 15 read endpoints below are exactly what `setlist-mcp`'s tools call — same paths, same params.
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
# setlist.fm REST API — read endpoints for curl

Base URL: `https://api.setlist.fm/rest` · every call: `-H "x-api-key: $SETLIST_API_KEY" -H 'Accept: application/json'`.
Optional: `-H "Accept-Language: en"` (one of `en es fr de pt tr it pl`) to localize city/country names.

All 15 read endpoints below are exactly what `setlist-mcp`'s tools call — same paths, same params.
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
# setlist.fm REST API — read endpoints for curl

Base URL: `https://api.setlist.fm/rest` · every call: `-H "x-api-key: $SETLIST_API_KEY" -H 'Accept: application/json'`.
Optional: `-H "Accept-Language: en"` (one of `en es fr de pt tr it pl`) to localize city/country names.

All 15 read endpoints below are exactly what `setlist-mcp`'s tools call — same paths, same params.
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
# setlist.fm REST API — read endpoints for curl

Base URL: `https://api.setlist.fm/rest` · every call: `-H "x-api-key: $SETLIST_API_KEY" -H 'Accept: application/json'`.
Optional: `-H "Accept-Language: en"` (one of `en es fr de pt tr it pl`) to localize city/country names.

All 15 read endpoints below are exactly what `setlist-mcp`'s tools call — same paths, same params.
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
# setlist.fm REST API — read endpoints for curl

Base URL: `https://api.setlist.fm/rest` · every call: `-H "x-api-key: $SETLIST_API_KEY" -H 'Accept: application/json'`.
Optional: `-H "Accept-Language: en"` (one of `en es fr de pt tr it pl`) to localize city/country names.

All 15 read endpoints below are exactly what `setlist-mcp`'s tools call — same paths, same params.
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
# setlist.fm REST API — read endpoints for curl

Base URL: `https://api.setlist.fm/rest` · every call: `-H "x-api-key: $SETLIST_API_KEY" -H 'Accept: application/json'`.
Optional: `-H "Accept-Language: en"` (one of `en es fr de pt tr it pl`) to localize city/country names.

All 15 read endpoints below are exactly what `setlist-mcp`'s tools call — same paths, same params.
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
# setlist.fm REST API — read endpoints for curl

Base URL: `https://api.setlist.fm/rest` · every call: `-H "x-api-key: $SETLIST_API_KEY" -H 'Accept: application/json'`.
Optional: `-H "Accept-Language: en"` (one of `en es fr de pt tr it pl`) to localize city/country names.

All 15 read endpoints below are exactly what `setlist-mcp`'s tools call — same paths, same params.
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
# setlist.fm REST API — read endpoints for curl

Base URL: `https://api.setlist.fm/rest` · every call: `-H "x-api-key: $SETLIST_API_KEY" -H 'Accept: application/json'`.
Optional: `-H "Accept-Language: en"` (one of `en es fr de pt tr it pl`) to localize city/country names.

All 15 read endpoints below are exactly what `setlist-mcp`'s tools call — same paths, same params.
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
# setlist.fm REST API — read endpoints for curl

Base URL: `https://api.setlist.fm/rest` · every call: `-H "x-api-key: $SETLIST_API_KEY" -H 'Accept: application/json'`.
Optional: `-H "Accept-Language: en"` (one of `en es fr de pt tr it pl`) to localize city/country names.

All 15 read endpoints below are exactly what `setlist-mcp`'s tools call — same paths, same params.
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
# setlist.fm REST API — read endpoints for curl

Base URL: `https://api.setlist.fm/rest` · every call: `-H "x-api-key: $SETLIST_API_KEY" -H 'Accept: application/json'`.
Optional: `-H "Accept-Language: en"` (one of `en es fr de pt tr it pl`) to localize city/country names.

All 15 read endpoints below are exactly what `setlist-mcp`'s tools call — same paths, same params.
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
# setlist.fm REST API — read endpoints for curl

Base URL: `https://api.setlist.fm/rest` · every call: `-H "x-api-key: $SETLIST_API_KEY" -H 'Accept: application/json'`.
Optional: `-H "Accept-Language: en"` (one of `en es fr de pt tr it pl`) to localize city/country names.

All 15 read endpoints below are exactly what `setlist-mcp`'s tools call — same paths, same params.
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
# setlist.fm REST API — read endpoints for curl

Base URL: `https://api.setlist.fm/rest` · every call: `-H "x-api-key: $SETLIST_API_KEY" -H 'Accept: application/json'`.
Optional: `-H "Accept-Language: en"` (one of `en es fr de pt tr it pl`) to localize city/country names.

All 15 read endpoints below are exactly what `setlist-mcp`'s tools call — same paths, same params.
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
# setlist.fm REST API — read endpoints for curl

Base URL: `https://api.setlist.fm/rest` · every call: `-H "x-api-key: $SETLIST_API_KEY" -H 'Accept: application/json'`.
Optional: `-H "Accept-Language: en"` (one of `en es fr de pt tr it pl`) to localize city/country names.

All 15 read endpoints below are exactly what `setlist-mcp`'s tools call — same paths, same params.
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Missing User Warnings

Medium
Confidence
89% confidence
Finding
The document instructs users to send an API key in request headers and access user-profile-related endpoints, but it provides no warning about credential storage, shell history leakage, logging, rate limits, or privacy implications of querying user attendance/activity data. In a shell-oriented skill, this omission increases the chance that users will mishandle secrets or expose personal data during automation.

Static analysis

Detected: suspicious.exposed_secret_literal

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
SKILL.md:37