Back to skill

Security audit

爱图表3D插图

Security checks for vulnerabilities and agentic risk

Overview

The skill looks like a real 3D chart API integration, but it stores API keys unsafely and ships extra account/file operations beyond its advertised scope.

Review this carefully before installing. Use a dedicated, revocable aitubiao API key, avoid pasting untrusted key strings, and be aware that the bundled CLI can do more than generate 3D chart illustrations, including other project creation and export/download actions under the same account credential.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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
Findings (2)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/aitubiao-cli.sh:64
Finding

Persistent Shell Command Injection Through Executable Credential Storage

Content
View full analysis
&2 echo "Please configure credentials first. See SKILL.md for setup instructions." >&2 exit 1 fi source "$CREDENTIALS_FILE" ``` The credential-writing function accepts any value beginning with `sk_v1_` and interpolates it directly into an executable shell 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://app.aitubiao.com/setting/api-keys?utm_source=skill_skill-clawhub&channel=skill-clawhub" >&2 exit 4 fi if [[ ! "$api_key" =~ ^sk_v1_ ]]; then echo "Error: Invalid API Key format (must start with sk_v1_)" >&2 echo "Get a valid key at: https://app.aitubiao.com/setting/api-keys?utm_source=skill_skill-clawhub&channel=skill-clawhub" >&2 exit 4 fi mkdir -p "$(dirname "$CREDENTIALS_FILE")" cat > "$CREDENTIALS_FILE" << EOF API_KEY=$api_key BASE_URL=https://api.aitubiao.com CHANNEL=skill-clawhub EOF chmod 600 "$CREDENTIALS_FILE" ``` ### Technical Analysis The API-key validation is not anchored at the end of the value and only checks that the supplied argument starts with `sk_v1_`. It does not restrict the remaining characters to the expected key alphabet or reject shell metacharacters and embedded newline characters. The value is subsequently interpolated into `~/.aitubiao/credentials`. That file is treated as executable shell syntax by: ```bash source "$CREDENTIALS_FILE" ``` Consequently, the credential file is not merely configuration data. Any shell syntax inserted into it can be evaluated in the co ...[truncated 1885 chars]
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Warning
Location
scripts/aitubiao-cli.sh:344
Finding

Bundled CLI Exposes API and Filesystem Capabilities Beyond the Declared 3D Illustration Scope

Content
View full analysis
` 自行轮询。 api_request POST "/api/v1/agent/chart/create-project" 90 "$body" "false" } cmd_query_snapshot_job() { load_credentials local job_id="${1:-}" if [[ -z "$job_id" ]]; then echo "Error: query-snapshot-job 需要 jobId 参数" >&2 echo "用法: bash scripts/aitubiao-cli.sh query-snapshot-job " >&2 exit 4 fi api_request GET "/api/v1/agent/chart/snapshot-job/${job_id}" 30 "" "true" } cmd_create_ppt() { load_credentials local body body=$(read_stdin_body) api_request POST "/api/v1/agent/infographic/create-project" 120 "$body" "false" } cmd_create_sankey() { load_credentials local body body=$(read_stdin_body) api_request POST "/api/v1/agent/chart/create-sankey-project" 120 "$body" "false" } cmd_create_3d() { load_credentials local body body=$(read_stdin_body) api_request POST "/api/v1/agent/chart/create-3d-illustration" 180 "$body" "false" } ``` The download operation accepts a caller-selected path: ```bash cmd_download_project() { load_credentials local output_path="${2:-}" local body body=$(read_stdin_body) ``` It resolves the path and creates its parent directory if possible: ```bash output_path=$(resolve_absolute_path "$output_path") ensure_writable_dir "$(dirname -- "$output_path")" ``` It then downloads a server-provided attachment to that destination: ```bash if [[ "$status" == "success" ]]; then attachment=$(echo " ...[truncated 3536 chars]
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (12)

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

The skill is advertised as only generating 3D chart illustrations, but the instructions expose broader capabilities including authentication handling, quota inspection, and references to other project creation/export commands. That mismatch can mislead users and reviewers about the actual authority and data flows of the skill, reducing informed consent and increasing the chance of unintended operations with user credentials or account resources.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The skill content is entirely written in Chinese and repeatedly instructs the agent to communicate fixed Chinese phrases to the user, such as specific error and confirmation messages. There is no opt-in, fallback, or documented region-specific justification that would make the language constraint compliant with the stated locale-policy rule.

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 the agent to solicit the user's API key and save it persistently across sessions, but does not provide an explicit warning about credential sensitivity, storage risks, or least-retention practices. This creates a meaningful chance of credential exposure, reuse by later sessions, or collection beyond what the user reasonably expects.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The skill explicitly directs collection and persistent storage of a user's API key in ~/.aitubiao/credentials, implying durable local secret storage without evidence of encryption or access controls. Persisting user-supplied credentials in this manner increases the blast radius of host compromise, accidental disclosure, or later unauthorized reuse by other tasks or users on the same environment.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The FAQ tells the user to ask the AI to re-initiate a failed or timed-out generation, while earlier rules state the create interface must not be retried automatically because duplicate billing may occur. This contradictory guidance can lead to repeated create requests after uncertain outcomes, causing unintended charges or duplicate jobs.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The manifest describes a narrowly scoped skill for converting charts into 3D-style illustrations. This script exposes additional commands for creating PPT presentations, Sankey diagrams, querying account quota, and downloading generic project exports, which are broader product capabilities not reflected in the skill description.

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}"

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The manifest focuses on generating 3D chart illustrations from uploaded data, but this function retrieves project metadata/pages, starts export jobs, polls task status, and writes exported files locally. That is materially broader lifecycle management and file-export behavior than the manifest communicates.

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 MSYSTEM unconditionally resets both variables again. This is a natural-language locale policy concern because it imposes a locale choice globally rather than offering the user an opt-in or documenting a justified region-specific requirement.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
98% confidence
Finding

The auth command writes CHANNEL=skill-clawhub into the credentials file, but then prints CHANNEL: skill-aitubiao to the user. This is an active documentation/output contradiction that can mislead operators about which channel the skill is configured to use.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.