Back to skill

Security audit

Douyin E-commerce API

Security checks for vulnerabilities and agentic risk

Overview

The skill does what it claims, but it handles the JustOneAPI token in ways that can expose it through process listings or URL logs.

Install only if you are comfortable giving this skill a JustOneAPI token and sending Douyin item IDs to api.justoneapi.com. Use a narrowly scoped, short-lived token if available, avoid running it on shared systems where process arguments may be visible, and rotate the token if command logs or URL logs may have captured it.

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

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

Content
View full analysis
" --token "$JUST_ONE_API_TOKEN" --params-json '{"key":"value"}' ``` `bin/run.mjs:21-29`: ```js { "defaultValue": null, "description": "Access token for this API service.", "enumValues": [], "location": "query", "name": "token", "required": true, "schemaType": "string" } ``` `bin/run.mjs:197-203`: ```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); } } ``` The query value is ultimately appended to the request URL: ```js 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)); } ``` ### Technical Analysis The network request is part of the declared functionality and is restricted to the fixed HTTPS origin `https://api.justoneapi.com`; therefore, the transmission is not evidence of covert exfiltration. However, the credential transport mechanism is insecure. Supplying the token with `--token` places the expanded secret in the Node.js process argument vector. Depending on the operating system and process isolation settings, command-line arguments may be visible to other local users, monitoring agents, process inspection tools ...[truncated 2054 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • System Prompt LeakageDirect Leakage, Indirect Extraction, Tool-Based Exfiltration
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (7)

Direct Prompt Extraction

High
Category
System Prompt Leakage
Confidence
85% confidence
Finding

Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.

Content

Scanner excerpt · SKILL.md (reported line 50)May include surrounding context.

md
- Get a token from [Just One API Dashboard](https://dashboard.justoneapi.com/en/login?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_douyin_ec&utm_content=project_link).
- Authentication details: [Just One API Usage Guide](https://docs.justoneapi.com/en/?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_douyin_ec&utm_content=project_link).

## Output Rules

- Start with a plain-language answer tied to the Douyin E-commerce task the user asked for.
- Include the most decision-relevant fields from the selected endpoint before dumping raw JSON.

Credential Access

High
Category
Privilege Escalation
Confidence
88% confidence
Finding

This finding reflects the presence and handling of an access token in the skill, which by itself is expected for authenticated API access, but here it is coupled to insecure transport via the query parameter. In this context, the real security issue is credential exposure risk rather than deliberate credential theft logic in the code.

Content

Scanner excerpt · bin/run.mjs (reported line 20)May include surrounding context.

js
"parameters": [
        {
          "defaultValue": null,
          "description": "Access token for this API service.",
          "enumValues": [],
          "location": "query",
          "name": "token",

Credential Access

High
Category
Privilege Escalation
Confidence
98% confidence
Finding

The API requires an access token to be sent as a query parameter, which is unsafe because query strings are commonly logged by servers, intermediaries, analytics tools, browser history, and monitoring systems. This increases the risk of credential disclosure and unauthorized reuse of the token to access the API service.

Content

Scanner excerpt · generated/operations.json (reported line 14)May include surrounding context.

json
"parameters": [
        {
          "defaultValue": null,
          "description": "Access token for this API service.",
          "enumValues": [],
          "location": "query",
          "name": "token",

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · generated/operations.md (reported line 17)May include surrounding context.

md
| Name | In | Required | Type | Default | Description |
| --- | --- | --- | --- | --- | --- |
| `token` | `query` | yes | `string` | n/a | Access token for this API service. |
| `itemId` | `query` | yes | `string` | n/a | The unique ID of the item on Douyin E-commerce. |

### Request body

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
86% confidence
Finding

The skill invokes a Node helper that performs authenticated external API requests, but the manifest does not declare any explicit tool scope such as allowed-tools or permissions. That creates an authorization and transparency gap: an agent may execute network-capable code without the skill clearly constraining or disclosing that capability, increasing the risk of unintended outbound requests or misuse of the provided token.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The skill explicitly defines the access token as a query parameter and injects it into the request URL. Query-string credentials are commonly exposed through logs, browser/history records, proxy telemetry, error reporting, and upstream infrastructure, increasing the chance of credential disclosure even when HTTPS is used.

Content

No source excerpt is available for this finding.

Vague Triggers

Low
Category
Not specified by scanner
Confidence
86% confidence
Finding

This JSON manifest describes the skill's purpose and operation but does not provide any explicit trigger phrases, activation boundaries, or exclusion conditions. For manifest files, the absence of specificity can make invocation behavior ambiguous if this description is used to decide when the skill should run.

Content

No source excerpt is available for this finding.