Back to skill

Security audit

Douyin Creator Marketplace (Xingtu) Spread Metrics API

Security checks for vulnerabilities and agentic risk

Overview

This is a focused JustOneAPI read-only API skill, but it handles the user's API token in a way that can expose it through command arguments and URL query logs.

Install only if you are comfortable sending your JustOneAPI token and requested kolId/query parameters to api.justoneapi.com. Use a narrowly scoped or short-lived token if available, avoid shell tracing and command logging, and rotate the token if it may have appeared in process listings, logs, or shared debugging output.

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:241
Finding

API Token Exposed Through Command-Line Arguments and URL Query Parameters

Content
View full analysis
parameter.name === "token"); if (!tokenParam || params.token !== undefined) { return; } if (!cliToken) { fail("--token is required for this operation.", { operationId: operation.operationId, }); } params.token = cliToken; } ``` All query parameters, including `token`, are serialized into the URL: ```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 URL is transmitted to the external service: ```js 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, }; let response; try { response = await fetch(url, requestInit); } catch (error) { fail("Network request failed.", { cause: error instanceof Error ? error.message : String(error), op ...[truncated 2940 chars]
Remediation
View remediation
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)

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
90% 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 gap where an agent or platform may permit broader external access than intended, reducing enforceability and auditability of what the skill is allowed to do.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The skill requires an authentication token and automatically injects it into the outbound query string, but this file provides no user-facing warning that the secret will be sent to a third-party service. Query-string tokens are especially risky because they are commonly logged by clients, proxies, gateways, and server access logs, increasing the chance of credential leakage beyond the intended recipient.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The manifest requires a user authentication token to be sent as a query parameter to an external API, but it provides no warning about external transmission, credential sensitivity, or safe handling expectations. Sending credentials in query strings is especially risky because they are commonly logged by clients, proxies, servers, and monitoring systems, increasing the chance of token exposure and unauthorized API access.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The API documentation explicitly requires an authentication token in the URL query string, which is commonly exposed in browser history, reverse proxies, server logs, analytics, referrer headers, and shared debugging output. Even though this file is only documentation, it guides integrators toward an insecure credential transport pattern that can lead to token leakage and unauthorized API access.

Content

No source excerpt is available for this finding.

Vague Triggers

Low
Category
Not specified by scanner
Confidence
81% confidence
Finding

This is a JSON manifest-style file, so vague-trigger checks apply. The top-level description and display name describe the API capability but provide no activation boundaries, example trigger phrases, or exclusion conditions, which can make invocation criteria ambiguous in systems that infer skill use from manifest text.

Content

No source excerpt is available for this finding.