Back to skill

Security audit

Mindshow AIPPT Skill

Security checks for vulnerabilities and agentic risk

Overview

This skill mostly matches its PPT-generation purpose, but it exposes AIPPT tokens and selected files to arbitrary configured API origins and includes under-disclosed deletion/template-management operations.

Review before installing. Use only the official https://api.mindshow.vip service unless you fully trust the alternate environment, avoid setting AIPPT_BASE_URL from untrusted instructions, do not upload sensitive documents without confirming third-party processing, and require explicit confirmation before invoking delete or advanced-template mutation endpoints.

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

Error
Location
aippt-cli.js:191
Finding

Bearer Token Disclosure Through an Unrestricted API Base URL

Content
View full analysis

Vulnerability Details

File Location: aippt-cli.js:191-194, 228, 237-240
Vulnerability Type: Credential disclosure caused by an untrusted network destination
Risk Level: High

Vulnerable Code

js
async function buildFetchOptions(args, method, operation, requestBody) {
  const token = args.token || process.env.AIPPT_TOKEN;
  const headers = { Accept: 'application/json' };
  if (token) headers.Authorization = `Bearer ${token}`;

  const content = getRequestContent(operation);
  const contentTypes = Object.keys(content);
  const wantsMultipart = contentTypes.includes('multipart/form-data') || Boolean(args.file);

  if (wantsMultipart) {
    if (!args.file) fail('This endpoint requires --file for multipart/form-data');
    const filePath = path.resolve(args.file);
    const fileBytes = fs.readFileSync(filePath);
    const form = new FormData();
    form.append('file', new Blob([fileBytes]), path.basename(filePath));
    appendMultipartFields(form, args.field);
    return { method: method.toUpperCase(), headers, body: form };
  }

  headers['Content-Type'] = 'application/json';
  return {
    method: method.toUpperCase(),
    headers,
    body: JSON.stringify(requestBody === undefined ? parseRequestBody(args) : requestBody),
  };
}
js
const baseUrl = (args['base-url'] || process.env.AIPPT_BASE_URL || apiDoc.servers?.[0]?.url || '').replace(/\/+$/, '');
js
const response = await fetch(`${baseUrl}${apiPath}`, {
  ...(await buildFetchOptions(args, method, operation, requestBody)),
  signal: controller.signal,
});

The expected service defined in apidoc.json:3312-3315 is:

json
"servers": [
  {
    "url": "https://api.mindshow.vip",
    "description": "正式环境"
  }
]

Technical Analysis

The CLI obtains the API destination from the --base-url argument, the AIPPT_BASE_URL environment variable, or a server URL in a potentially user-supplied API document. It does not validate the resulting scheme, hostname, port, or ...[truncated 2770 chars]

Remediation
View remediation

Remediation Suggestions

  1. Allowlist trusted API origins

    • Permit https://api.mindshow.vip by default.
    • If alternate deployments are required, use an explicit administrator-managed allowlist rather than accepting arbitrary URLs.
  2. Bind credentials to an approved origin

    • Add the Authorization header only after parsing and validating the final URL.
    • Never send the production AIPPT token when the destination origin differs from the approved API origin.
    • Require a separate explicitly supplied token for each approved alternate environment.
  3. Enforce secure URL properties

    • Parse destinations with the URL class.
    • Require HTTPS.
    • Reject embedded URL credentials, unexpected ports, malformed hosts, and non-HTTP protocols.
    • Resolve hostnames and reject loopback, private, link-local, multicast, and unspecified address ranges where custom hosts are supported.
    • Revalidate redirect destinations or disable redirects to prevent an approved endpoint from redirecting credentials to an untrusted origin.
  4. Restrict custom API documents

    • Do not trust servers[0].url from arbitrary --apidoc files for authenticated requests.
    • Treat an alternate API document as schema input only, or require explicit approval of its server origin.
  5. Minimize sensitive transmission

    • Before uploading a file or sending presentation content to a non-default approved environment, clearly identify the destination and request user confirmation.
    • Document that selected files and presentation content leave the local system and are processed by the configured service.
  6. Add regression tests

    • Verify that credentials are sent to the official HTTPS origin.
    • Verify that credentials are withheld from unapproved origins.
    • Verify rejection of HTTP, loopback, private, link-local, redirect-based, and credential-bearing URLs.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (14)

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

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

Content

Scanner excerpt · aippt-cli.js (reported line 8)May include surrounding context.

js
const path = require('node:path');

const DEFAULT_API_DOC = path.join(__dirname, 'apidoc.json');
const DEFAULT_ENV_FILE = path.join(__dirname, '.env');

function printUsage() {
  console.log(`Usage:

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding

The skill clearly instructs use of environment variables and outbound network access to a third-party API, but it does not declare any explicit tool scope such as allowed tools or permissions. That mismatch weakens policy enforcement and user/operator visibility into what the skill can access, increasing the chance of over-broad execution in environments that rely on manifest-declared restrictions.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The example request sets "language": "zh", and the same default appears again in the file-based workflow, which can steer outputs to a specific language by default. The document does not say to ask the user for preferred language first or explain that this locale restriction is optional.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill tells the agent to upload local files to an external AIPPT service and notes that the service extracts document text for downstream generation, but it does not require a clear user-facing warning or confirmation about third-party transmission. This can cause inadvertent exfiltration of sensitive local data such as internal documents, PII, contracts, or proprietary presentations.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

This workflow again sets "language": "zh" in the request example, reinforcing a fixed locale choice for generated content. Because no user-choice step or justification is provided, this is a natural-language locale policy concern.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The language field for GPT outline generation defaults to zh (Simplified Chinese), which imposes a language choice without explicit user opt-in. This is a natural-language policy concern because it can cause outputs in a forced locale even when the user has not requested that language.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The language field for AI PPT generation also defaults to zh, which bakes in a specific locale choice rather than leaving it to user preference. This can lead to policy-noncompliant behavior where the skill forces a language unexpectedly.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The file upload endpoint transmits user-provided files to a third-party service, yet the documentation lacks an explicit privacy/data-handling warning. In an agent context, this can cause sensitive documents to be uploaded without sufficiently informed consent, especially because the skill explicitly supports user file ingestion.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The manifest description frames the skill as PPT generation/querying, but the exposed API also includes destructive job/template management operations. This mismatch can mislead users or higher-level agents into granting broader trust than warranted, increasing the risk of unintended deletion or modification of user assets.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The delete-job endpoint performs irreversible data deletion but does not prominently warn users about that effect. In an agent-driven workflow, a mislabeled or insufficiently disclosed destructive action can lead to accidental loss of generated presentations and related artifacts.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The advanced-template deletion endpoint can remove user-managed template data without a clear warning. Because this skill otherwise presents as a PPT-generation utility, hidden destructive capabilities raise the risk of unintended loss if triggered by users or upstream agents.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Low
Category
Not specified by scanner
Confidence
84% confidence
Finding

The manifest focuses on generating PPTs from keywords/files, creating outlines/Markdown, templates, uploads, and polling progress. The spec additionally supports generating a reusable template from an uploaded PPT (/v1/job/template_create_by_ppt) and AI beautification of an existing PPT (/v1/job/ppt_create_by_ppt), which are materially different operations from straightforward PPT generation.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
98% confidence
Finding

The summary for /v1/gpt/gen_content_by_outline says '通过PPT大纲生成PPT完整内容' (generate full PPT content from an outline), but the description immediately says '输出PPT大纲' (output PPT outline). That is an active contradiction in the inline API documentation about the endpoint's purpose.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
95% confidence
Finding

The endpoint /v1/advance_template/set requires both an id and a title, which indicates mutation of an advanced template. But its summary says '设置取单个高级模版数据', mixing 'set' and 'get single template data', which contradicts the actual operation exposed by the path and request body.

Content

No source excerpt is available for this finding.

Static analysis

Detected: suspicious.env_credential_access

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
aippt-cli.js:114