Back to skill

Security audit

爱图表 AIPPT

Security checks for vulnerabilities and agentic risk

Overview

This PPT skill mostly does what it says, but its saved API-key file can be abused to run commands later, so it needs review before installation.

Review before installing. The maintainer should replace shell-sourced credential storage with a non-executable data format, validate API keys strictly, avoid passing secrets as command-line arguments or chat text, document how to delete or rotate saved keys, and narrow the CLI surface to PPT-related actions unless the broader API tools are intentionally part of the skill.

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
scripts/aitubiao-cli.sh:64
Finding

Persistent Arbitrary Command Execution Through Unsafe Credential File Sourcing

Content
View full analysis
&2 echo "Please configure credentials first. See SKILL.md for setup instructions." >&2 exit 1 fi source "$CREDENTIALS_FILE" if [[ -z "${API_KEY:-}" ]]; then echo "Error: API_KEY is empty in $CREDENTIALS_FILE" >&2 echo "Please add your API Key. Get one at: https://app.aitubiao.com/setting/api-keys?utm_source=skill_skill-clawhub&channel=skill-clawhub" >&2 exit 1 fi if [[ ! "${API_KEY}" =~ ^sk_v1_ ]]; then echo "Error: API_KEY format invalid (must start with sk_v1_)" >&2 echo "Your current key may have expired. Create a new one at: https://app.aitubiao.com/setting/api-keys?utm_source=skill_skill-clawhub&channel=skill-clawhub" >&2 exit 1 fi export BASE_URL="${BASE_URL:-https://api.aitubiao.com}" export CHANNEL="${CHANNEL:-skill-clawhub}" if [[ "$BASE_URL" != "https://api.aitubiao.com" ]]; then echo "Error: BASE_URL in $CREDENTIALS_FILE does not match this CLI's expected endpoint" >&2 echo " Expected: https://api.aitubiao.com" >&2 echo " Current: $BASE_URL" >&2 printf ' Re-run: bash %q auth \n' "$0" >&2 exit 1 fi if [[ -z "$CHANNEL" ]]; then echo "Error: CHANNEL is empty in $CREDENTIALS_FILE" >&2 exit 1 fi } ``` The authentication command accepts any value beginning with `sk_v1_` and writes it directly into that executable file: ```bash cmd_auth() { local api_key="${1:-}" if [[ -z "$api_key" ]]; then echo "Error: API Key required. Usage: aitubiao-cli.sh auth " >&2 echo "Get one at: https:// ...[truncated 3684 chars]
Remediation
View remediation
&2 exit 4 fi ``` The exact length limits should be based on the provider’s actual key specification. 3. **Reject control characters explicitly.** Newlines, carriage returns, null bytes, and other control characters must never be accepted in credential values. 4. **Avoid command-line secret transport.** Read the key from protected standard input or an interactive hidden prompt rather than `auth `, reducing exposure through shell history and process inspection. 5. **Create the credentials directory with restrictive permissions:** ```bash install -d -m 700 "$HOME/.aitubiao" ``` 6. **Write credentials atomically and safely.** Create a temporary file in the destination directory with mode `0600`, write validated data, and atomically rename it into place. Refuse unsafe symbolic-link targets. 7. **Preserve fixed configuration in code.** Since the CLI requires exactly `https://api.aitubiao.com`, keep the base URL as a constant rather than loading it from a credential file. Do the same for the distribution channel unless user ...[truncated 275 chars]
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
  • Rogue AgentSelf-Modification, Session Persistence
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (11)

Tp2

High
Category
MCP Tool Poisoning
Confidence
85% confidence
Finding

Mixing characters from multiple Unicode scripts in a single identifier is a common technique to create visually ambiguous tool names.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
92% confidence
Finding

The public description says the skill generates PPTs, but the body also handles persistent credential storage, quota/billing checks, local file downloads, and references broader project creation/export behaviors. This mismatch can mislead users about the sensitivity of the operations, increasing the chance they disclose API keys or approve local/network actions they did not expect.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
93% confidence
Finding

The skill explicitly persists credentials in ~/.aitubiao/credentials for cross-session reuse. Session persistence of secrets increases the blast radius of host compromise, account sharing, or accidental reuse by later sessions or different users on the same machine, especially because the stored secret authorizes billable remote actions.

Content

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

md
---
name: 爱图表-AIPPT
description: 输入一个主题或一段文字,自动生成一份完整可编辑的PPT演示文稿。适合做汇报、讲课、方案展示。支持中文/英文,可以自由选择页数和风格。触发词:创建PPT、做PPT、生成演示文稿、制作幻灯片、create PPT、make slides、generate presentation。
license: MIT
compatibility: Requires network access to api.aitubiao.com, Bash shell, curl, and jq
metadata:

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

Broad trigger phrases like '做PPT', '制作幻灯片', and 'make slides' can match ordinary conversation and invoke a workflow that requests API keys, performs billable API calls, and persists credentials. Accidental invocation is more dangerous here because the skill has network access and monetized actions, not just harmless text formatting.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill instructs users to paste an API key directly into chat and then stores it persistently in ~/.aitubiao/credentials across sessions. Even though it claims the key stays local, the instructions do not clearly minimize exposure risk, recommend secure input handling, or explain lifecycle controls, making credential leakage or unintended reuse more likely.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The CLI advertised for a PPT-generation skill exposes multiple additional capabilities—chart creation, Sankey generation, 3D illustration creation, quota inspection, and project download—that are not justified by the skill manifest. In an agent context, unnecessary commands expand the attack surface and enable use of the API for actions beyond the user’s expected intent, increasing the chance of misuse or unauthorized data access.

Content

No source excerpt is available for this finding.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
70% confidence
Finding

Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Content

Scanner excerpt · scripts/aitubiao-cli.sh (reported line 50)May include surrounding context.

sh
check_jq() {
  if ! command -v jq &>/dev/null; then
    echo "Error: jq is required but not installed." >&2
    echo "Install it with: sudo apt install jq  (or brew install jq on macOS)" >&2
    exit 4
  fi
}

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
80% confidence
Finding

Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Content

Scanner excerpt · scripts/aitubiao-cli.sh (reported line 278)May include surrounding context.

sh
BASE_URL=https://api.aitubiao.com
CHANNEL=skill-clawhub
EOF
  chmod 600 "$CREDENTIALS_FILE"

  echo "Credentials saved to $CREDENTIALS_FILE"
  echo "  API_KEY: ${api_key:0:12}...${api_key: -4}"

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The script can export arbitrary project content identified by projectId and write the resulting file to an arbitrary local path. In a PPT-creation skill, this is over-privileged functionality: if an agent can supply or infer project IDs, it may retrieve unrelated user data and persist it locally, creating confidentiality and data exfiltration risks.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
95% confidence
Finding

The script explicitly overrides LANG and LC_ALL to C.UTF-8, and on MSYS it forces those values regardless of the user's existing locale settings. This is a natural-language locale policy concern because it imposes a specific locale behavior instead of offering a user choice or documenting an opt-in mechanism.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
99% confidence
Finding

The auth command writes CHANNEL=skill-clawhub into the credentials file, but then prints 'CHANNEL: skill-aitubiao' as if that were the configured value. This is an active contradiction in the user-facing command output and can mislead operators about which channel the code will actually use.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.