Back to skill

Security audit

IMDb Critics Review Summary API

Security checks for vulnerabilities and agentic risk

Overview

This skill is a narrow IMDb review-summary API wrapper, but it should be reviewed because it handles the JustOneAPI token in URL and command-line forms that can leak through logs or process views.

Install only if you are comfortable sending IMDb lookup ids and your JustOneAPI token to api.justoneapi.com. Prefer using a restricted or revocable token, avoid sharing command lines or logs from runs, and rotate the token if it may have appeared in process telemetry, shell history, proxy logs, or copied URLs.

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:20
Finding
API Token Exposed Through URL Query Parameters and Command-Line Arguments<![CDATA[ ## Vulnerability Details **File Location**: `bin/run.mjs:20-28`, `bin/run.mjs:91-108`; `SKILL.md:43`, `SKILL.md:50` **Vulnerability Type**: Credential exposure through insecure transport placement **Risk Level**: Medium ### Vulnerable Code `bin/run.mjs:20-28` declares the authentication token as a query parameter: ```js { "defaultValue": null, "description": "User's authentication token.", "enumValues": [], "location": "query", "name": "token", "required": true, "schemaType": "string" }, ``` `bin/run.mjs:91-108` injects the supplied token into the parameter collection, appends all query parameters to the request URL, and sends that URL over the network: ```js const params = parseParams(args.paramsJson); applyDefaults(operation, params); injectToken(operation, params, args.token); validateRequired(operation, params); const baseUrl = manifest.baseUrl; const url = new URL(operation.path, ensureBaseUrl(baseUrl)); applyPathParams(operation, params, url); applyQueryParams(operation, params, url); const requestInit = { headers: { "accept": "application/json", }, method: operation.method, }; if (operation.requestBody && params.body !== undefined) { ``` `SKILL.md:43` instructs users to place the secret in a command-line argument: ```bash node {baseDir}/bin/run.mjs --operation "titleCriticsReviewSummaryQuery" --token "$JUST_ONE_API_TOKEN" --params-json '{"id":"<id>"}' ``` ### Technical Analysis The helper accepts the JustOneAPI authentication token through `--token` and stores it in `params.token`. Because the operation metadata marks `token` as a query parameter, `applyQueryParams` appends the credential to the request URL before `fetch` is called. HTTPS encrypts the request in transit, so passive network observers cannot normally read the token. However, placing credentials in URLs remains unsafe because complete URLs may be retained by reverse proxies, API gateways, web-server access logs, monitoring systems, tracing plat ...[truncated 2397 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. **Avoid command-line secret arguments** - Read the token directly from `process.env.JUST_ONE_API_TOKEN`. - Remove or deprecate `--token` so the secret does not appear in process arguments. - If backward compatibility is required, emit a warning and prioritize the environment variable or a protected credential provider. 2. **Move authentication out of the URL** - If supported by JustOneAPI, transmit the credential in an authorization header, for example: ```js const token = process.env.JUST_ONE_API_TOKEN; if (!token) { fail("JUST_ONE_API_TOKEN is required."); } const requestInit = { headers: { accept: "application/json", authorization: `Bearer ${token}`, }, method: operation.method, }; ``` - Use the exact header and authentication scheme documented by JustOneAPI. - Remove `token` from the operation's query-parameter list after migrating authentication. 3. **If query authentication is mandated by the upstream API** - Continue using HTTPS, but configure all clients, proxies, gateways, access logs, tracing systems, and error handlers to redact the `token` query parameter. - Prevent request URLs containing credentials from being included in diagnostics. - Use narrowly scoped, short-lived, and readily revocable tokens where the provider supports them. 4. **Update documentation** - Replace the documented `--token "$JUST_ONE_API_TOKEN"` invocation with an environment-only workflow. - Explicitly prohibit placing the token in `--params-json`, logs, screenshots, or copied request URLs. 5. **Add regression safeguards** - Add tests asserting that secrets do not appear in process output, errors, or logged URLs. - Add static checks that reject authentication secrets declared as query parameters unless an explicit upstream compatibility exception is documented. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • 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
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (5)

Lp3

Medium
Category
MCP Least Privilege
Confidence
70% confidence
Finding
Without declared permissions the skill's intent is opaque and cannot be validated.

Missing User Warnings

Medium
Confidence
96% confidence
Finding
The skill defines the authentication token as a query parameter and later appends all query parameters directly into the request URL. Tokens in URLs are commonly exposed through logs, browser/history layers, intermediary proxies, monitoring systems, and error messages, making credential leakage more likely than if the token were sent in an Authorization header. In this skill context, the risk is real because the code is explicitly a wrapper around a third-party external API and gives no warning that the secret will be placed in the URL.

Missing User Warnings

Medium
Confidence
97% confidence
Finding
Passing an authentication token in the query string is dangerous because query parameters are commonly logged by servers, proxies, analytics tools, browser histories, and monitoring systems. This increases the risk of credential leakage and replay if any intermediary or downstream system captures request URLs.

Missing User Warnings

Low
Confidence
82% confidence
Finding
The script performs an outbound fetch to api.justoneapi.com using user-supplied parameters, including title identifiers and an authentication token. While network access is the skill's core function, the file itself contains no visible warning, print, or comment disclosing that request data is transmitted to a third-party service.

Vague Triggers

Low
Confidence
79% confidence
Finding
This manifest-style file describes the skill's purpose but does not define any specific trigger phrases, activation boundaries, or negative examples. In systems that infer invocation from descriptions, broad phrasing like calling an IMDb review summary by ID may be matched too loosely because the scope of when this skill should or should not activate is not explicitly constrained.

Static analysis

No suspicious patterns detected.