Back to skill

Security audit

Douyin Creator Marketplace (Xingtu) KOL Comment Keyword Analysis API

Security checks for vulnerabilities and agentic risk

Overview

This is a coherent single-endpoint JustOneAPI connector, but it sends the user’s API token in the URL query string, which creates avoidable credential exposure risk.

Review this skill before installing if your JustOneAPI token is sensitive, billable, or broadly scoped. It calls only the declared JustOneAPI endpoint, but because the token is placed in the URL query string, it may appear in infrastructure, proxy, or service logs outside the local machine. Prefer a narrowly scoped, revocable token and avoid logging full request 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:27
Finding

API Authentication Token Exposed in URL Query String

Content
View full analysis

Vulnerability Details

File Location: bin/run.mjs, lines 27–34, 68–74, and 197–207
Vulnerability Type: Sensitive credential exposure through URL query parameters
Risk Level: Medium

Vulnerable Code

The operation manifest defines the authentication token as a query parameter:

javascript
      {
        "defaultValue": null,
        "description": "User authentication token.",
        "enumValues": [],
        "location": "query",
        "name": "token",
        "required": true,
        "schemaType": "string"
      },

The request URL is then populated and transmitted:

javascript
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,
};
javascript
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);
  }
}

Technical Analysis

injectToken places the supplied API token into params.token. Because the manifest identifies token as having a query location, applyQueryParams appends the credential to the request URL before fetch transmits the request to https://api.justoneapi.com.

HTTPS protects the URL from passive observation while the connection is in transit, but it does not prevent the complete URL from being recorded at endpoints or trusted intermediaries. Query strings may be retained in reverse-proxy access logs, API gateway telemetry, server logs, monitoring products, debugging output, or exception diagnostics. Personnel and services with access to th ...[truncated 1800 chars]

Remediation
View remediation

Remediation Suggestions

  1. Replace query-string authentication with an authorization header supported by the service, preferably:

    javascript
    const requestInit = {
      headers: {
        "accept": "application/json",
        "authorization": `Bearer ${args.token}`,
      },
      method: operation.method,
    };
    
  2. Remove token from the operation's query-parameter definitions and ensure it cannot be supplied through --params-json.

  3. If the upstream API only supports query-string authentication, request support for header-based authentication. Until then:

    • Configure gateways, reverse proxies, servers, and monitoring systems to redact the token query parameter.
    • Disable full-URL logging for this endpoint.
    • Ensure errors and diagnostic output never include serialized request URLs.
    • Apply short token lifetimes, narrow endpoint scopes, rate limits, rotation, and revocation.
    • Restrict access to request logs and establish short retention periods.
  4. Reject credentials embedded in general parameters so the dedicated token handling path is always used.

  5. Add automated tests verifying that tokens do not appear in URLs, standard output, standard error, or logged exception details.

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
88% confidence
Finding

The skill invokes a network-capable helper (node {baseDir}/bin/run.mjs calling a remote API) but does not declare an explicit tool scope such as permissions or allowed-tools. That mismatch weakens least-privilege controls and can cause agents or reviewers to underestimate the skill's ability to make outbound requests with a bearer token, increasing the risk of unintended data egress or unauthorized external calls.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The skill defines the authentication token as a query parameter and injects it into the request URL, which causes the secret to appear in places URLs are commonly logged or exposed, such as shell history, proxy logs, browser/debug tooling, monitoring systems, and upstream access logs. Even though the request uses HTTPS, putting credentials in the URL materially increases accidental disclosure risk compared with sending the token in an Authorization header or other header-based secret transport.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The documentation shows that callers must provide a token and oAuthorId as query parameters to an external API, but it does not warn users that sensitive authentication material and account-linked identifiers will be transmitted off-platform. This can lead to accidental disclosure, unsafe handling in logs, browser history, or monitoring systems, especially because query parameters are commonly recorded more broadly than headers or bodies.

Content

No source excerpt is available for this finding.

Vague Triggers

Low
Category
Not specified by scanner
Confidence
81% confidence
Finding

This manifest-style JSON describes the skill's purpose and capability, but it does not define any explicit trigger phrases, scope limits, or exclusion conditions. For manifest files, the absence of specific activation constraints can make invocation matching ambiguous, especially if downstream systems infer triggers from general descriptions like 'Comment Keyword Analysis' or 'audience language analysis.'

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
72% confidence
Finding

The natural-language description states that the operation is used for 'audience language analysis,' which introduces language-related behavior without indicating any user choice, opt-in, or locale limitations. Under the policy rule, language or locale behavior should either be optional, explicitly documented, or clearly justified as region-specific.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.