Back to skill

Security audit

IMDb Keyword Search API

Security checks for vulnerabilities and agentic risk

Overview

This is a focused IMDb search API skill, but users should treat its JustOneAPI token carefully because the helper passes it on the command line and in the request URL.

Install only if you are comfortable giving this skill a JustOneAPI token for IMDb searches. Prefer a limited or easily rotated token, avoid logging full commands or URLs, and rotate the token if you believe process arguments or request URLs may be captured in your environment.

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:112
Finding
API Token Exposed Through Command-Line Arguments and URL Query Parameters<![CDATA[ ## Vulnerability Details **File Location**: `bin/run.mjs:112-147`; related invocation guidance at `SKILL.md:50-56` **Vulnerability Type**: Credential exposure through process arguments and URL query parameters **Risk Level**: Medium ### Relevant Code `bin/run.mjs:112-147`: ```javascript const args = parseArgs(process.argv.slice(2)); if (!args.operation) { fail("Missing required --operation argument."); } const operation = manifest.operations.find((item) => item.operationId === args.operation); if (!operation) { fail(`Unknown operation "${args.operation}".`, { availableOperations: manifest.operations.map((item) => item.operationId) }); } 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) { requestInit.body = JSON.stringify(params.body); requestInit.headers["content-type"] = operation.requestBody.contentType || "application/json"; } let response; try { response = await fetch(url, requestInit); } catch (error) { fail("Network request failed.", { cause: error instanceof Error ? error.message : String(error), operationId: operation.operationId, }); } ``` The token is defined as a query parameter at `bin/run.mjs:24-32`: ```javascript { "defaultValue": null, "description": "User's authentication token.", "enumValues": [], "location": "query", "name": "token", "required": true, "schemaType": "string" } ``` The documented invocation at `SKILL.md:50` places the environment variable value into the process argument list: ```bash node {baseDir}/bin/run.mjs --operation "mainSe ...[truncated 3692 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. **Read the token directly from the environment** - Use `process.env.JUST_ONE_API_TOKEN` inside `run.mjs`. - Remove the `--token` argument so the secret is not exposed in the process command line. - Reject `token` inside `--params-json` to prevent users from accidentally placing credentials in JSON arguments. 2. **Use an authorization header** - If supported by JustOneAPI, remove `token` from the query-parameter manifest and send it in a header, for example: ```javascript const token = process.env.JUST_ONE_API_TOKEN; if (!token) { fail("JUST_ONE_API_TOKEN is required."); } const requestInit = { method: operation.method, headers: { accept: "application/json", authorization: `Bearer ${token}`, }, }; ``` 3. **Address upstream API constraints** - If JustOneAPI mandates query-string authentication, request support for header-based authentication. - Until then, document the residual logging risk, use narrowly scoped and short-lived tokens where available, and ensure URLs are redacted in proxies, telemetry, error reports, and access logs. 4. **Apply systematic redaction** - Redact parameters named `token`, `apiKey`, `authorization`, and similar variants from all diagnostics. - Never include the fully constructed request URL in errors or debug output. - Configure infrastructure logging to replace token query values with a fixed marker such as `[REDACTED]`. 5. **Rotate potentially exposed credentials** - Rotate tokens previously used through the documented command if process or URL logs may have been retained. - Review API usage for unexpected requests or quota consumption. 6. **Update the documentation** - Replace the `--token "$JUST_ONE_API_TOKEN"` example with direct environment-based execution: ```bash JUST_ONE_API_TOKEN="$JUST_ONE_API_TOKEN" \ node {baseDir}/bin/run.mjs \ --operation "mainSearchQuery" \ --params-json '{"searchTerm":"<searchTerm>"}' ``` - Prefer co ...[truncated 144 chars]
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (5)

Lp3

Medium
Category
MCP Least Privilege
Confidence
86% confidence
Finding
The skill invokes a network-capable helper (`node .../bin/run.mjs`) to call an external API, but it does not declare any explicit tool scope such as `permissions` or `allowed-tools`. This creates a policy gap where an agent may execute network actions without a clear, reviewable declaration of intended capabilities, increasing the risk of unintended outbound requests or misuse in broader agent environments.

Missing User Warnings

Medium
Confidence
97% confidence
Finding
The skill requires the authentication token as a query parameter and automatically appends it to the request URL. Query-string secrets are commonly exposed through logs, monitoring systems, browser/history layers, proxies, and error telemetry, so this increases the chance of credential leakage even when HTTPS is used.

Natural-Language Policy Violations

Low
Confidence
89% confidence
Finding
The manifest sets a default languageCountry value of en_US, which means requests will use a specific language/locale unless the user overrides it. This is a natural-language locale preference imposed by default rather than selected by the user.

Natural-Language Policy Violations

Low
Confidence
84% confidence
Finding
The manifest sets `languageCountry` to `en_US` by default, which biases the skill toward a specific language/locale when the user does not choose one. This can violate language/locale policy expectations unless the user is explicitly given a choice or the locale restriction is justified.

Natural-Language Policy Violations

Low
Confidence
86% confidence
Finding
The documentation sets `languageCountry` to a default of `en_US` and does not state that users should choose or confirm their preferred language/locale. Under the policy rule, forcing a specific locale without opt-in can be a natural-language policy concern, even though other locale values are available.

Static analysis

No suspicious patterns detected.