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

Content
View full analysis
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
View remediation
"}' ``` - 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)

Undeclared Tool Scope

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.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.