Back to skill

Security audit

Yunlv Cantonfair

Security checks for vulnerabilities and agentic risk

Overview

This Canton Fair sales-planning skill is purpose-aligned and discloses its API and local lead-data handling, but users should review contact-data and outreach practices carefully.

Install only if you are comfortable using a TRADEGPT_API_KEY with Yunlv's API and handling business lead/contact data locally. Before using generated outreach, verify contact accuracy, consent or lawful basis, unsubscribe/opt-out handling, and regional privacy or anti-spam rules; also treat the advertised coverage and scoring metrics as claims to validate, not guaranteed results.

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
scripts/cantonfair-planner.py:342
Finding

Unbounded Schedule Generation Enables Local Resource Exhaustion

Content
View full analysis

Vulnerability Details

File Location: scripts/cantonfair-planner.py, lines 342-371 and 407-410
Vulnerability Type: Uncontrolled resource consumption
Risk Level: Medium

Vulnerable Code

python
plan = []
for day in range(1, days + 1):
    day_plan = {
        "day": day,
        "activities": [],
        "focus": ""
    }

    if day == 1:
        day_plan["focus"] = "Pre-event preparation"
        day_plan["activities"] = [
            "Confirm booth location and admission documents",
            "Prepare samples and promotional materials",
            "Review the target buyer list",
            "Prepare business cards and sample catalogs"
        ]
    elif day == 2:
        day_plan["focus"] = "Event development"
        day_plan["activities"] = [
            f"Visit halls associated with {fair_phase}",
            "Collect business cards and requirement information",
            "Immediately follow up with interested customers",
            "Record customer requirements and budgets"
        ]
    else:
        day_plan["focus"] = "Post-event follow-up"
        day_plan["activities"] = [
            "Organize and archive customer information",
            "Send thank-you email or WhatsApp message",
            "Arrange sample confirmation",
            "Create a subsequent follow-up plan"
        ]

    plan.append(day_plan)

The corresponding command-line argument accepts any integer without an upper bound:

python
p_plan.add_argument('--days', type=int, default=3, help='Plan duration in days')

Technical Analysis

The --days value is parsed as an unrestricted Python integer and passed directly to generate_development_plan. The function creates one dictionary containing several strings and lists for every integer in range(1, days + 1). Every generated object remains in the plan list until the complete result is serialized wit ...[truncated 2196 chars]

Remediation
View remediation

Remediation Suggestions

  1. Enforce a small, documented range appropriate for event planning, such as 1 through 30 days:

    python
    def bounded_days(value: str) -> int:
        days = int(value)
        if not 1 <= days <= 30:
            raise argparse.ArgumentTypeError(
                "--days must be between 1 and 30"
            )
        return days
    
    p_plan.add_argument(
        "--days",
        type=bounded_days,
        default=3,
        help="Plan duration in days, from 1 to 30"
    )
    
  2. Add defense-in-depth validation inside generate_development_plan so direct library callers cannot bypass CLI validation:

    python
    MAX_PLAN_DAYS = 30
    
    if not isinstance(days, int) or isinstance(days, bool):
        raise TypeError("days must be an integer")
    if not 1 <= days <= MAX_PLAN_DAYS:
        raise ValueError(
            f"days must be between 1 and {MAX_PLAN_DAYS}"
        )
    
  3. If larger plans are a legitimate requirement, generate entries incrementally rather than retaining the entire schedule in memory, and impose response-size, execution-time, and memory limits at the service or worker boundary.

  4. Add automated tests for zero, negative, non-integer, boundary, and extremely large values to ensure invalid durations are rejected before iteration begins.

  5. Where the script is exposed through an API or job runner, apply request validation, rate limits, timeouts, output-size limits, and per-worker memory constraints.

Vulnerability Patterns
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (11)

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The skill claims capabilities around lead discovery, exhibitor/buyer data reference, contact structuring, and personalized outreach generation that are not actually evidenced by the skill file. This can cause operators or downstream agents to over-trust the tool, handle sensitive contact data under false assumptions, or invoke external processing paths that are not clearly implemented or bounded.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The repeated 'Use when' conditions are expansive and lack clear boundaries, encouraging invocation for a wide range of sales, exhibitor, and outreach scenarios. This ambiguity can lead to misuse, accidental data exposure to external APIs, or reliance on the skill outside its validated scope.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

Broad trigger phrases like '参展商', '展会数据', and '采购商名单' can activate the skill for loosely related requests, causing unintended handling of trade-show lead generation or contact-oriented workflows. In a security context, over-broad invocation increases the chance that sensitive business or personal data is routed into this skill when a narrower, safer tool should have been used.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
82% confidence
Finding

Natural-language policy review applies to all file types. The manifest centers activation on Chinese phrases like "广交会" and "展会获客策略" while also serving an international topic (Canton Fair) and does not state that users may interact in other languages or that the restriction is region-specific by policy.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

This manifest is in scope for vague-trigger review. Several triggers such as "展会信息参考", "参展商", "展会数据", "采购商名单", and "展品分类" are broad generic phrases that could appear in many exhibition or sales contexts, not specifically Canton Fair lead strategy tasks, increasing the chance of unintended invocation.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The document instructs users to collect and act on attendee contact details, including phone and email, and to initiate follow-up through WhatsApp, WeChat, and email without mentioning consent, lawful basis, retention, or privacy notice requirements. In a lead-generation skill for trade show outreach, this creates a realistic risk of privacy non-compliance, unwanted contact, and mishandling of personal data rather than being a purely theoretical issue.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

This code file’s natural-language interface text, command descriptions, and embedded guidance are entirely in Chinese, which effectively constrains the skill to a specific language without any visible opt-in or alternative locale handling. The policy explicitly calls out language or locale constraints as findings when the skill does not offer user choice or documented justification.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
91% confidence
Finding

This markdown file uses Chinese as the sole instructional/content language throughout, and there is no indication that users can choose another language or that the file is intentionally limited to a Chinese-only audience. Under the stated policy, forcing a specific language without user opt-in can be a natural-language policy violation.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
83% confidence
Finding

The file presents all instructions in Chinese and does not indicate that the language is optional, user-selected, or required for a specific regional context. Under the policy, forcing a specific language without opt-in can be a natural-language policy violation.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
76% confidence
Finding

This markdown file is a template library whose example outreach emails are written in English, while the surrounding documentation is in Chinese. That can be read as steering users toward a specific language for customer communication without any stated opt-in, alternatives, or justification for when English is appropriate.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
98% confidence
Finding

The score command path references args.buyers, but that argument is never defined for the score subcommand. This causes a runtime AttributeError when score is invoked, creating a reliable denial-of-service for that CLI path and indicating inadequate input-path testing rather than deliberate abuse logic.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.