Back to skill

Security audit

YouTube Channel Videos API

Security checks for vulnerabilities and agentic risk

Overview

The skill does what it says, but it handles the API token in ways that can expose it through command arguments and URL query strings.

Review before installing. Use only a narrowly scoped JustOneAPI token if possible, avoid running this where command arguments or full URLs are logged, and rotate the token if it may have appeared in logs. No malicious behavior was found, but the credential transport design is risky.

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

Warning
Location
bin/run.mjs:183
Finding

API Token Exposed Through Process Arguments and URL Query Parameters

Content
View full analysis
"}' ``` The operation metadata classifies the token as a query parameter: ```js { "defaultValue": null, "description": "Access token for this API service.", "enumValues": [], "location": "query", "name": "token", "required": true, "schemaType": "string" } ``` The helper injects the command-line token into the parameter collection: ```js function injectToken(operation, params, cliToken) { const tokenParam = operation.parameters.find((parameter) => parameter.name === "token"); if (!tokenParam || params.token !== undefined) { return; } if (!cliToken) { fail("--token is required for this operation.", { operationId: operation.operationId, }); } params.token = cliToken; } ``` Every parameter marked as a query parameter—including the token—is appended to the request URL before transmission: ```js function applyQueryParams(operation, params, url) { for (const parameter of operation.parameters.filter((item) => item.location === "query")) { const value = params[parameter.name]; if (value === undefined) { continue; } appendValue(url.searchParams, parameter.name, value); } } function appendValue(searchParams, name, value) { if (Array.isArray(value)) { for (const item of value) { appendValue(searchParams, name, item); } return; } if (value && typeof value === "object") { searchParams.append(name, JSON.stringify(value)); return; } searchParams.append(name, String(value)); } ``` The resulting ...[truncated 2786 chars]
Remediation
View remediation
"}' ``` 6. If the upstream API only supports query-string authentication, explicitly document the residual exposure risk, configure all infrastructure to redact the `token` parameter, disable query-string logging where possible, use narrowly scoped short-lived tokens, and rotate any token suspected of appearing in logs. 7. Add automated tests that assert credentials never appear in generated URLs, standard output, standard error, or diagnostic payloads when header-based authentication is available. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (7)

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · bin/run.mjs (reported line 20)May include surrounding context.

js
"parameters": [
        {
          "defaultValue": null,
          "description": "Access token for this API service.",
          "enumValues": [],
          "location": "query",
          "name": "token",

Credential Access

High
Category
Privilege Escalation
Confidence
92% confidence
Finding

The skill requires an access token to be sent as a query parameter, which is less secure than using an Authorization header. Query-string credentials are commonly exposed via logs, browser history, intermediary proxies, analytics systems, and referrer leakage, increasing the chance of token disclosure and unauthorized API use.

Content

Scanner excerpt · generated/operations.json (reported line 15)May include surrounding context.

json
"parameters": [
        {
          "defaultValue": null,
          "description": "Access token for this API service.",
          "enumValues": [],
          "location": "query",
          "name": "token",

Credential Access

High
Category
Privilege Escalation
Confidence
84% confidence
Finding

The skill explicitly instructs callers to supply an access token, which is a sensitive credential, via a GET query parameter. In this context, the issue is not credential theft logic inside the skill, but an insecure API design/documentation pattern that can leak credentials through logs, URL capture, analytics systems, or referrer-like handling.

Content

Scanner excerpt · generated/operations.md (reported line 19)May include surrounding context.

md
| Name | In | Required | Type | Default | Description |
| --- | --- | --- | --- | --- | --- |
| `token` | `query` | yes | `string` | n/a | Access token for this API service. |
| `channelId` | `query` | yes | `string` | n/a | The unique identifier for a YouTube channel. |
| `cursor` | `query` | no | `string` | n/a | The cursor for pagination. |

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding

The skill invokes a network-capable helper (node {baseDir}/bin/run.mjs ...) that will make authenticated outbound API requests, but the manifest does not declare any explicit tool scope such as permissions or allowed-tools. This creates a policy gap where the agent may use network access without transparent least-privilege constraints, making review and enforcement harder and increasing the risk of unintended or abused external calls.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The skill defines the API access token as a query parameter and automatically appends it to the request URL. Query-string credentials are commonly exposed through logs, browser history, proxy/CDN logs, monitoring systems, and error telemetry, which increases the chance of credential leakage even when HTTPS is used.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The operation requires an API access token as a query parameter, but the documentation provides no warning about secure handling. Query parameters are commonly logged by servers, proxies, browser history, and monitoring tools, so documenting secrets this way without guidance increases the risk of credential exposure.

Content

No source excerpt is available for this finding.

Vague Triggers

Low
Category
Not specified by scanner
Confidence
91% confidence
Finding

This JSON manifest describes the API capability and skill identity, but it does not include explicit invocation phrases, scope limits, or exclusion conditions. For manifest files, that can make activation behavior ambiguous and increase the chance of unintended invocation if an orchestrator relies on broad descriptive matching.

Content

No source excerpt is available for this finding.

Static analysis

Detected: suspicious.secret_argv_exposure

Instructions pass high-value credentials through process argv.

Critical
Code
suspicious.secret_argv_exposure
Location
SKILL.md:42