Back to skill

Security audit

Walter Competitor

Security checks for vulnerabilities and agentic risk

Overview

This Amazon competitor-analysis skill is purpose-aligned, but it needs Review because its CLI wrapper can turn normal inputs into shell commands and its setup handles credentials unsafely.

Install only after the publisher removes shell=True command execution, passes CLI arguments safely or uses a direct API client, pins/localizes the mcporter dependency, and provides a safer secret configuration flow. Treat any SellerSprite key used with the documented command as potentially exposed through shell history or CLI configuration and rotate it if already used.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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 (3)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/sellersprite_mcp.py:17
Finding

OS Command Injection Through Shell-Based MCP Invocation

Content
View full analysis
Dict[str, Any]: """Execute an mcporter command and return parsed JSON.""" try: result = subprocess.run( command, shell=True, capture_output=True, encoding='utf-8', errors='replace', timeout=30 ) ``` ```python def _call(self, tool: str, **kwargs) -> Dict[str, Any]: """Invoke an MCP tool.""" args = " ".join([f'{k}: "{v}"' if isinstance(v, str) else f'{k}: {v}' for k, v in kwargs.items()]) cmd = f'mcporter call {self.server}.{tool} {args}' return run_mcporter(cmd) ``` ### Technical Analysis `SellerSpriteMCP._call()` constructs a command by directly interpolating tool arguments into a string. `run_mcporter()` then executes that string using `subprocess.run(..., shell=True)`. String values are only surrounded by double quotes and are not escaped for the operating-system shell. Double quotes do not neutralize shell command substitution, and an attacker can also introduce a closing quote followed by shell metacharacters. Consequently, attacker-controlled values can alter the command interpreted by the shell instead of remaining data passed to `mcporter`. The vulnerable sink is reachable from normal Skill input. In particular, `TrafficAnalysisV2.comprehensive_analysis()` accepts a user-provided keyword and passes it through `_auto_discover_competitors()` and `CachedAPILayer.call()` to `SellerSpriteMCP._call()`. ### Attack Path 1. An attacker supplies a category keyword containing shell syntax, such as command substitution or a quote followed by a shell operator. 2. `TrafficAnalysisV2.comprehensive_analysis()` receives the malicious keyword. 3. `_auto_discover_competitors()` passes it to the `competitor_loo ...[truncated 1252 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
scripts/sellersprite_mcp.py:6
Finding

Unpinned Global Installation of a Third-Party CLI Dependency

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/sellersprite_mcp.py:7
Finding

SellerSprite API Secret Exposed Through a Command-Line URL

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
Findings (18)

Tp4

High
Category
MCP Tool Poisoning
Confidence
93% confidence
Finding

The Chinese description repeats strong claims of fully automatic competitor intelligence and offensive strategy generation, while the underlying behavior reportedly depends on explicit ASIN-driven methods and generic data aggregation. Such overstated claims can mislead users into believing the skill independently performs strategic targeting, increasing the chance of misuse, over-collection, or unsafe delegation of decision-making.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
88% confidence
Finding

The Chinese description repeats strong claims of fully automatic competitor intelligence and offensive strategy generation, while the underlying behavior reportedly depends on explicit ASIN-driven methods and generic data aggregation. Such overstated claims can mislead users into believing the skill independently performs strategic targeting, increasing the chance of misuse, over-collection, or unsafe delegation of decision-making.

Content

No source excerpt is available for this finding.

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
98% confidence
Finding

This is a concrete tool-parameter abuse issue: the wrapper exposes many methods that accept external strings and funnels them into shell execution. In a skill meant to automate competitor intelligence gathering, that context makes the issue more dangerous because multiple public-facing parameters can be influenced through normal workflow and converted into host-level command execution.

Content

Scanner excerpt · scripts/sellersprite_mcp.py (reported line 20)May include surrounding context.

python
def run_mcporter(command: str) -> Dict[str, Any]:
    """执行 mcporter 命令并返回解析后的 JSON"""
    try:
        result = subprocess.run(
            command,
            shell=True,
            capture_output=True,

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
88% confidence
Finding

The skill advertises executable/code-like capabilities and includes Python snippets plus threaded data retrieval logic, but declares no explicit tool scope or allowed-tools boundary. In an agent environment, missing scope declarations can let the runtime grant broader-than-intended execution or external access, which is risky because this skill is designed to automatically collect competitor intelligence at scale.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
85% confidence
Finding

The skill explicitly promotes automatic retrieval of competitor intelligence without manual competitor selection, but the description lacks a clear warning or consent boundary for that behavior. In practice this can trigger unexpected large-scale collection of third-party business intelligence, surprising users and increasing legal, compliance, or platform-policy exposure.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

This markdown file presents all instructions, code comments, and report templates only in Chinese. Under the policy, forcing a specific language without user opt-in or a clearly justified locale scope is a natural-language policy violation.

Content

No source excerpt is available for this finding.

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
98% confidence
Finding

The code executes a dynamically provided shell command using subprocess.run(..., shell=True). Because the command string is later built from tool names and kwargs without shell escaping, any attacker-controlled value can inject additional shell syntax and execute arbitrary OS commands on the host.

Content

Scanner excerpt · scripts/sellersprite_mcp.py (reported line 20)May include surrounding context.

python
def run_mcporter(command: str) -> Dict[str, Any]:
    """执行 mcporter 命令并返回解析后的 JSON"""
    try:
        result = subprocess.run(
            command,
            shell=True,
            capture_output=True,

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill's stated purpose is competitor-analysis API access, but it achieves this by constructing and executing shell commands at runtime. That creates a broader execution surface than necessary and turns ordinary input fields like keyword or asin into potential vectors for host command execution.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

User-derived values flow into a shell command without validation, escaping, or any confirmation barrier. In this context, benign-looking analysis inputs such as keyword, asin, or marketplace may be attacker-controlled and can be crafted to append arbitrary commands when interpreted by the shell.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The skill hard-codes self.marketplace = "US" and performs competitor discovery against that locale without any user choice or justification. In a market-intelligence skill, this can silently analyze the wrong regional marketplace, causing misleading competitive conclusions, inappropriate recommendations, and potentially noncompliant data handling for users expecting another locale.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
81% confidence
Finding

The file-level natural-language documentation is entirely in Chinese and does not offer any language choice or indicate that the skill is region- or language-specific. Under the 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.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The layer forwards user-supplied keywords and ASINs to external network APIs without any consent, disclosure, minimization, or redaction controls visible in this file. In a competitive-intelligence skill, those queries may reveal sensitive business research, product targets, or investigation intent to the third-party provider, creating a privacy and data-governance risk.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The manifest explicitly says '无需手动提供ASIN,全自动竞品情报获取', but the main competitor-intelligence entrypoint is get_complete_competitor_intelligence(self, asin: str), which depends on a manually supplied ASIN and passes that ASIN into multiple downstream API calls. This is a direct mismatch between the advertised autonomous discovery behavior and the implemented interface.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
93% confidence
Finding

The natural-language content presents the skill entirely in Chinese, including the description and user interaction instructions, with no indication that users may choose another language. Under the locale policy, forcing a specific language without opt-in can be a policy violation unless the restriction is explicitly justified.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
86% confidence
Finding

The module's natural-language documentation and inline user-facing messages are written in Chinese, with no indication that language is configurable or chosen by user preference. Under the language/locale policy, forcing a specific language without opt-in can be a policy violation unless clearly justified.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Low
Category
Not specified by scanner
Confidence
80% confidence
Finding

The module documentation and implementation show that the skill operates by controlling an external system command rather than only performing in-scope traffic and competitor analysis. Requiring and invoking a globally installed CLI introduces host-environment interaction that is not part of the manifest's stated business purpose.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
87% confidence
Finding

The module docstring claims '接入全部 36 个卖家精灵 API', and the file repeatedly emphasizes '100% API 利用率', but _get_all_api_names() only enumerates a much smaller set of APIs and even contains a duplicate competitor_lookup. This documentation actively overclaims implementation completeness relative to what the code itself defines and tracks.

Content

No source excerpt is available for this finding.

Dynamic attribute access via getattr()

Low
Category
Dangerous Code Execution
Confidence
50% confidence
Finding

Dynamic getattr() with a non-literal attribute name can access arbitrary object attributes, potentially bypassing access controls.

Content

Scanner excerpt · scripts/unified_data_layer_v2.py (reported line 57)May include surrounding context.

python
return {"code": "OK", "data": data, "cached": True}
        
        self.call_stats["actual"] += 1
        method = getattr(self.client, api_name, None)
        if not method:
            return {"code": "ERROR", "message": f"Unknown API: {api_name}"}