Back to skill

Security audit

Bootleg Link Mcp

Security checks for vulnerabilities and agentic risk

Overview

This music-downloader skill needs review because it starts background services, handles account cookies and tokens, and bundles an unauthenticated token service that can execute remote JavaScript if reached.

Review carefully before installing. Run it only in an isolated user account or container with a dedicated download directory, do not expose port 4416, avoid passing valuable account credentials or cookies unless necessary, and expect background processes plus persistent local database/cookie state. The bundled token provider should be patched or constrained to localhost with authentication before use.

Vulnerability Patterns
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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
Findings (4)

T03 · Remote Payload Retrieval and Execution

Error
Location
bgutil-ytdlp-pot-provider/server/src/session_manager.ts:271
Finding

Unauthenticated Remote JavaScript Retrieval and Execution

Content
View full analysis
{ if (err) { console.error( `Could not listen on [::]:${PORT_NUMBER}, falling back to 0.0.0.0 (Caused by ${strerror(err)})`, ); } else { console.log( `Started POT server (v${VERSION}) on on address [::]:${PORT_NUMBER}`, ); } }, ) .on("error", () => { httpServer.listen( { host: "0.0.0.0", port: PORT_NUMBER, }, // ... ); }); ``` ```ts // server/src/main.ts:74-96 httpServer.post("/get_pot", async (request, response) => { const body = request.body || {}; const contentBinding: string | undefined = body.content_binding; const proxy: string = body.proxy; const bypassCache: boolean = body.bypass_cache || false; const sourceAddress: string | undefined = body.source_address; const disableTlsVerification: boolean = body.disable_tls_verification || false; try { const sessionData = await sessionManager.generatePoToken( contentBinding, proxy, bypassCache, sourceAddress, disableTlsVerification, body.challenge, body.innertube_context, ); response.send(sessionData); } catch (e) { // ... } }); ``` ```ts // server/src/session_manager.ts:271-312 const { program, globalName, interpreterHash } = challenge; const { privateDoNo ...[truncated 2982 chars]
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Error
Location
bgutil-ytdlp-pot-provider/server/src/main.ts:16
Finding

Globally Exposed Token-Provider API Lacks Authentication and Authorization

Content
View full analysis
{ httpServer.listen( { host: "0.0.0.0", port: PORT_NUMBER, }, // ... ); }); ``` ```ts httpServer.post("/get_pot", async (request, response) => { const body = request.body || {}; const contentBinding: string | undefined = body.content_binding; const proxy: string = body.proxy; const bypassCache: boolean = body.bypass_cache || false; const sourceAddress: string | undefined = body.source_address; const disableTlsVerification: boolean = body.disable_tls_verification || false; const sessionData = await sessionManager.generatePoToken( contentBinding, proxy, bypassCache, sourceAddress, disableTlsVerification, body.challenge, body.innertube_context, ); response.send(sessionData); }); ``` ```ts httpServer.post("/invalidate_caches", async (request, response) => { sessionManager.invalidateCaches(); response.status(204).send(); }); httpServer.post("/invalidate_it", async (request, response) => { sessionManager.invalidateIT(); response.status(204).send(); }); httpServer.get("/minter_cache", async (request, response) => { console.debug(sessionManager.minterCache); response.send(Array.from(sessionManager.minterCache.keys())); }); ``` ### Technical Analysis The service listens on every available network interface and exposes token generation, cache invalidation, and cache inspection endpoints without any authentication or caller authorization. Any client able to reac ...[truncated 1720 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
daemon.py:130
Finding

Caller-Controlled Output Directory Enables Destructive Cleanup of Unrelated Files

Content
View full analysis
|]', '', sub).strip() output_dir = os.path.join(DEF_OUT, sub) norm_dir = os.path.normpath(output_dir) if output_dir else "" ``` ```python # daemon.py:130-181 def _cleanup_orphans(output_dir): """Remove orphaned temp/thumbnail files and deduplicate MP3s.""" if not os.path.isdir(output_dir): return for f in os.listdir(output_dir): path = os.path.join(output_dir, f) # ... if f.endswith('.part') or f.endswith('.ytdl'): try: os.remove(path); cleaned += 1 except: pass elif f.endswith('.temp.mp3'): final = os.path.join(output_dir, f[:-9] + '.mp3') if not os.path.exists(final): try: os.re ...[truncated 2540 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
requirements.txt:1
Finding

Python Dependencies Are Unpinned and Not Integrity Locked

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • 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
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (118)

Natural-Language Policy Violations

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The documented 'Try Before Buy' workflow explicitly encourages downloading and retaining YouTube copies when the user decides not to purchase, which normalizes unauthorized retention of copyrighted content. In the context of a music-download MCP server with automation for YouTube, Qobuz, and Beatport, this materially increases legal/compliance risk and indicates the skill is designed to facilitate piracy-adjacent behavior rather than incidental misuse.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

Undocumented direct HTTP token-generation and cache invalidation endpoints represent a different trust and deployment model from a simple downloader MCP server. In context, the skill already handles auth-adjacent operations, so hidden service behavior makes accidental exposure and misuse more likely.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

Undocumented direct HTTP token-generation and cache invalidation endpoints represent a different trust and deployment model from a simple downloader MCP server. In context, the skill already handles auth-adjacent operations, so hidden service behavior makes accidental exposure and misuse more likely.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

Undocumented direct HTTP token-generation and cache invalidation endpoints represent a different trust and deployment model from a simple downloader MCP server. In context, the skill already handles auth-adjacent operations, so hidden service behavior makes accidental exposure and misuse more likely.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

Undocumented direct HTTP token-generation and cache invalidation endpoints represent a different trust and deployment model from a simple downloader MCP server. In context, the skill already handles auth-adjacent operations, so hidden service behavior makes accidental exposure and misuse more likely.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

Undocumented direct HTTP token-generation and cache invalidation endpoints represent a different trust and deployment model from a simple downloader MCP server. In context, the skill already handles auth-adjacent operations, so hidden service behavior makes accidental exposure and misuse more likely.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

Undocumented direct HTTP token-generation and cache invalidation endpoints represent a different trust and deployment model from a simple downloader MCP server. In context, the skill already handles auth-adjacent operations, so hidden service behavior makes accidental exposure and misuse more likely.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

Undocumented direct HTTP token-generation and cache invalidation endpoints represent a different trust and deployment model from a simple downloader MCP server. In context, the skill already handles auth-adjacent operations, so hidden service behavior makes accidental exposure and misuse more likely.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
89% confidence
Finding

Undocumented direct HTTP token-generation and cache invalidation endpoints represent a different trust and deployment model from a simple downloader MCP server. In context, the skill already handles auth-adjacent operations, so hidden service behavior makes accidental exposure and misuse more likely.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

Undocumented direct HTTP token-generation and cache invalidation endpoints represent a different trust and deployment model from a simple downloader MCP server. In context, the skill already handles auth-adjacent operations, so hidden service behavior makes accidental exposure and misuse more likely.

Content

No source excerpt is available for this finding.

Privileged Container / Container Escape

High
Category
Privilege Escalation
Confidence
91% confidence
Finding

The README recommends --net=host to access a local proxy from inside the container, which removes Docker network isolation and exposes the container directly to the host network stack. If the containerized service is compromised, host networking increases lateral movement, local service exposure, and interception risk; this is more concerning in a tool that interacts with network services and anti-bot evasion workflows.

Content

Scanner excerpt · bgutil-ytdlp-pot-provider/README.md (reported line 64)May include surrounding context.

md
Our Docker image comes in two flavors: Node.js or Deno. The `:latest` tag defaults to Node.js, but you can specify an alternate version/flavor like so: `brainicism/bgutil-ytdlp-pot-provider:1.3.1-deno`. The `:node` tag also points to the latest Node.js image, and `:deno` points to the latest Deno image.

> [!IMPORTANT]
> Note that the docker container's network is isolated from your local network by default. If you are using a local proxy server, it will not be accessible from within the container unless you pass `--net=host` as well.

**Native:**

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The /invalidate_caches, /invalidate_it, and /minter_cache endpoints allow any unauthenticated client to clear internal caches or enumerate cache keys. An attacker on the network can repeatedly invalidate caches to degrade service or inspect internal state that may reveal sensitive operational details, and the risk is amplified because the server listens on :: and falls back to 0.0.0.0, exposing it beyond the local host.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The code fetches JavaScript from a remote YouTube-controlled URL and immediately executes it with new Function(interpreterJavascript)(). Even if this is intended to support BotGuard/PO token generation, it creates a remote code execution path inside the server process: any compromise of the upstream response, proxy path, or local TLS settings could lead to arbitrary code running in the MCP server context. In a download-focused MCP skill, this is especially risky because it grants the remote service influence over the host executing the skill.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The code logs both integrity-token data and the minted poToken value to console output. These values are security-sensitive session artifacts; exposing them in logs can enable replay, abuse of authenticated flows, or leakage through centralized logging systems, support bundles, or shared hosting environments.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: brace-expansion==1.1.12 — 4 advisory(ies): CVE-2026-13149 (brace-expansion: DoS via exponential-time expansion of consecutive non-expanding); CVE-2026-33750 (brace-expansion: Zero-step sequence causes process hang and memory exhaustion); CVE-2026-14257 (brace-expansion: DoS via unbounded expansion length causing an out-of-memory pro) +1 more

High
Category
Supply Chain
Confidence
95% confidence
Finding

brace-expansion 1.1.12 is a development/transitive dependency present under ESLint-related tooling, and the cited issues are denial-of-service style parser/expansion bugs. In a lockfile this is a real vulnerable component, but because it appears only in dev tooling rather than the runtime server path, exploitability in deployed use is limited unless untrusted patterns are processed during build or CI.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: axios==1.13.5 — 16 advisory(ies): CVE-2026-44494 (axios Vulnerable to Full Man-in-the-Middle via Prototype Pollution Gadget in `co); CVE-2026-44495 (axios Vulnerable to Credential Theft and Response Hijacking via Prototype Pollut); CVE-2025-62718 (Axios has a NO_PROXY Hostname Normalization Bypass that Leads to SSRF) +13 more

High
Category
Supply Chain
Confidence
97% confidence
Finding

axios 1.13.5 is a runtime dependency of this server and the advisory set includes SSRF/proxy-bypass and header/redirect-related issues that are especially relevant for a downloader/MCP service making outbound network requests. Because this skill processes remote media sources and likely fetches user-supplied URLs or metadata, a vulnerable HTTP client materially increases the risk of SSRF, credential leakage, or response hijacking in realistic deployments.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: basic-ftp==5.2.0 — 4 advisory(ies): GHSA-6v7q-wjvx-w8wg (basic-ftp: Incomplete CRLF Injection Protection Allows Arbitrary FTP Command Exe); CVE-2026-39983 (basic-ftp has FTP Command Injection via CRLF); CVE-2026-41324 (basic-ftp vulnerable to denial of service via unbounded memory consumption in Cl) +1 more

High
Category
Supply Chain
Confidence
90% confidence
Finding

basic-ftp 5.2.0 is a real vulnerable transitive dependency with command injection and DoS concerns. In this lockfile it is not a top-level dependency; it is brought in through proxy/PAC resolution support, so exploitability depends on whether the application permits attacker-influenced FTP/PAC/proxy URLs, but the presence is still risky in a network-facing tool.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: brace-expansion==2.0.2 — 4 advisory(ies): CVE-2026-13149 (brace-expansion: DoS via exponential-time expansion of consecutive non-expanding); CVE-2026-33750 (brace-expansion: Zero-step sequence causes process hang and memory exhaustion); CVE-2026-14257 (brace-expansion: DoS via unbounded expansion length causing an out-of-memory pro) +1 more

High
Category
Supply Chain
Confidence
93% confidence
Finding

brace-expansion 2.0.2 is also a real vulnerable dependency, but here it is associated with dev tooling paths such as newer minimatch usage. The risk remains primarily denial-of-service during tooling execution rather than compromise of the running MCP server.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: flatted==3.3.3 — 2 advisory(ies): CVE-2026-32141 (flatted vulnerable to unbounded recursion DoS in parse() revive phase); CVE-2026-33228 (Prototype Pollution via parse() in NodeJS flatted)

High
Category
Supply Chain
Confidence
87% confidence
Finding

flatted 3.3.3 has real DoS and prototype-pollution advisories, but in this lockfile it appears only under dev tooling cache support rather than as an application runtime library. Without a runtime code path deserializing attacker-controlled flatted payloads, the main risk is to local tooling or CI processing untrusted cache/content.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: form-data==4.0.5 — 1 advisory(ies): CVE-2026-12143 (form-data: CRLF injection in form-data via unescaped multipart field names and f)

High
Category
Supply Chain
Confidence
91% confidence
Finding

form-data 4.0.5 is a real transitive runtime dependency under axios with CRLF injection risk in multipart field names/filenames. If this MCP server ever constructs multipart requests using untrusted user-supplied metadata, an attacker may be able to manipulate downstream requests or smuggle malformed parts.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The generatePoToken API accepts disableTlsVerification and propagates it into agent configuration, allowing certificate validation to be turned off. This enables man-in-the-middle interception or tampering of token-generation traffic, which is especially risky because the code exchanges integrity tokens, POTs, and challenge material with remote services.

Content

No source excerpt is available for this finding.

Env Variable Harvesting

High
Category
Data Exfiltration
Confidence
60% confidence
Finding

Code enumerates, copies, or searches environment variables for secrets. Bulk environment access can collect credentials unrelated to the skill's stated purpose.

Content

Scanner excerpt · bgutil-ytdlp-pot-provider/plugin/yt_dlp_plugins/extractor/getpot_bgutil_script.py (reported line 109)May include surrounding context.

python
capture_output=True, timeout=5)
        if r.returncode != 0:
            # Merge PATH with nvm/bun to ensure JS runtimes for yt-dlp
            env = os.environ.copy()
            extra_paths = [
                os.path.expanduser("~/.bun/bin"),
                os.path.expanduser("~/.nvm/versions/node/v24.16.0/bin"),

Env Variable Harvesting

High
Category
Data Exfiltration
Confidence
60% confidence
Finding

Code enumerates, copies, or searches environment variables for secrets. Bulk environment access can collect credentials unrelated to the skill's stated purpose.

Content

Scanner excerpt · bgutil-ytdlp-pot-provider/plugin/yt_dlp_plugins/extractor/getpot_bgutil_script.py (reported line 317)May include surrounding context.

python
capture_output=True, timeout=5)
        if r.returncode != 0:
            # Merge PATH with nvm/bun to ensure JS runtimes for yt-dlp
            env = os.environ.copy()
            extra_paths = [
                os.path.expanduser("~/.bun/bin"),
                os.path.expanduser("~/.nvm/versions/node/v24.16.0/bin"),

Env Variable Harvesting

High
Category
Data Exfiltration
Confidence
60% confidence
Finding

Code enumerates, copies, or searches environment variables for secrets. Bulk environment access can collect credentials unrelated to the skill's stated purpose.

Content

Scanner excerpt · server.py (reported line 34)May include surrounding context.

python
capture_output=True, timeout=5)
        if r.returncode != 0:
            # Merge PATH with nvm/bun to ensure JS runtimes for yt-dlp
            env = os.environ.copy()
            extra_paths = [
                os.path.expanduser("~/.bun/bin"),
                os.path.expanduser("~/.nvm/versions/node/v24.16.0/bin"),

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The README advertises clear_database as a tool that can "清空数据库" but provides no warning that this action is destructive and may permanently erase task history or state. For markdown files, safety-relevant behaviors affecting user data should be explicitly disclosed.

Content

No source excerpt is available for this finding.

Static analysis

Detected: suspicious.dynamic_code_execution, suspicious.env_credential_access, suspicious.exposed_resource_identifier

Dynamic code execution detected.

Critical
Code
suspicious.dynamic_code_execution
Location
bgutil-ytdlp-pot-provider/server/build/session_manager.js:228

Dynamic code execution detected.

Critical
Code
suspicious.dynamic_code_execution
Location
bgutil-ytdlp-pot-provider/server/src/session_manager.ts:311

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
bgutil-ytdlp-pot-provider/server/build/session_manager.js:124

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
bgutil-ytdlp-pot-provider/server/src/session_manager.ts:172

Plaintext HTTP endpoint targets a CGNAT/Tailscale-range address.

Critical
Code
suspicious.exposed_resource_identifier
Location
README.md:63