Back to skill

Security audit

IMDb User Reviews Summary API

Security checks for vulnerabilities and agentic risk

Overview

The skill appears to be a legitimate single-endpoint API wrapper, but it handles the required API token in exposure-prone ways that users should review before installing.

Install only if you are comfortable giving this skill a JustOneAPI token. Prefer a narrowly scoped or disposable token if the provider supports it, avoid running it in environments that log command lines or full request URLs, and rotate the token if you suspect it was exposed.

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

Error
Location
bin/run.mjs:164
Finding
API Credential Exposed Through Command-Line Arguments and URL Query Parameters<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:43-51`; `bin/run.mjs:87-109, 164-167, 196-206, 239-260` **Vulnerability Type**: API credential exposure **Risk Level**: High The Skill requires an API token for its declared functionality, but handles that credential through two exposure-prone channels: a command-line argument and an HTTPS URL query parameter. ### Vulnerable Code `SKILL.md:43-51`: ```bash node {baseDir}/bin/run.mjs --operation "titleUserReviewsSummaryQuery" --token "$JUST_ONE_API_TOKEN" --params-json '{"id":"<id>"}' ``` ```markdown - Required: `JUST_ONE_API_TOKEN` - Pass the token with `--token "$JUST_ONE_API_TOKEN"`; do not paste token values into chat messages, screenshots, or logs. ``` `bin/run.mjs:164-167`: ```js if (flag === "--token") { parsed.token = value; index += 1; continue; } ``` `bin/run.mjs:196-206`: ```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; } ``` `bin/run.mjs:239-260`: ```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)); } ``` `bin/run.mjs:87-109`: ```js injectToken(operation, params, args.tok ...[truncated 3261 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. **Remove command-line token handling** - Read the secret directly from `process.env.JUST_ONE_API_TOKEN`. - Remove the `--token` parser branch and avoid accepting credentials through `--params-json`. - Fail safely when the environment variable is absent, without printing its value. 2. **Prefer header-based authentication** - If JustOneAPI supports it, transmit the credential using an authorization header, such as: ```js const token = process.env.JUST_ONE_API_TOKEN; const requestInit = { method: operation.method, headers: { accept: "application/json", authorization: `Bearer ${token}`, }, }; ``` - Confirm the exact authentication scheme with the provider rather than assuming the bearer format. 3. **Harden mandatory query-token authentication** - If the upstream service only accepts a query token, document this residual risk explicitly. - Configure gateways, proxies, application logs, monitoring systems, and error trackers to redact the `token` query parameter. - Never include the complete request URL in error output or diagnostics. - Set a restrictive referrer policy where browser-based use is possible. - Use short-lived, narrowly scoped tokens and rotate them regularly. 4. **Prevent alternate token injection** - Reject `token` inside `--params-json`; otherwise callers can bypass the intended secret-loading mechanism because `injectToken()` preserves an existing `params.token`. - Maintain an allowlist containing only the documented user inputs, such as `id` and `languageCountry`. 5. **Update documentation** - Replace the documented `--token` invocation with an environment-only invocation: ```bash JUST_ONE_API_TOKEN="..." node {baseDir}/bin/run.mjs \ --operation "titleUserReviewsSummaryQuery" \ --params-json '{"id":"<id>"}' ``` - Warn users that query-string authentication may be logged by net ...[truncated 51 chars]
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
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (5)

Lp3

Medium
Category
MCP Least Privilege
Confidence
88% confidence
Finding
The skill invokes a network-capable helper (`node .../bin/run.mjs`) and requires an API token, but it does not declare an explicit tool scope such as `permissions` or `allowed-tools`. This creates an authorization and review gap: an agent or platform may permit broader execution/network behavior than intended, making outbound requests less transparent and harder to constrain.

Missing User Warnings

Medium
Confidence
96% confidence
Finding
The API authentication token is sent as a URL query parameter, which commonly leaks via logs, browser history, proxy caches, monitoring systems, and referrer-like telemetry. In this skill, the token is explicitly modeled as a query parameter and automatically injected, so every request exposes the credential more broadly than an Authorization header would.

Natural-Language Policy Violations

Low
Confidence
79% confidence
Finding
The skill documentation limits `languageCountry` to a fixed set of locales and presents them as the available values, but it does not state that locale selection is optional, user-chosen, or justified by a region-specific purpose. This can be a natural-language locale policy issue because it constrains language behavior without documenting user opt-in.

Natural-Language Policy Violations

Low
Confidence
86% confidence
Finding
The `languageCountry` parameter automatically defaults to `en_US`, which imposes a specific language/locale choice unless the user overrides it. The file lists alternative locales, but it does not explicitly ask the user to choose or document that English (US) will be assumed by default.

Vague Triggers

Low
Confidence
78% confidence
Finding
This manifest file describes a required `token` parameter only as "User's authentication token" and provides no specificity about format, source, or scoping. In manifest-style interface definitions, underspecified inputs can create ambiguous invocation or wiring behavior around which credential should be supplied.

Static analysis

No suspicious patterns detected.