Back to skill

Security audit

amazon-competitor-intelligence-monitor

Security checks for vulnerabilities and agentic risk

Overview

The skill is a mostly coherent ZooData competitor-analysis integration, but it needs Review because its API key can be redirected to HTTP or localhost via an environment override and its install command is unpinned.

Install only if you trust the ZooData publisher and need Amazon competitor analysis using a ZooData API key. Avoid setting ZOODATA_BASE_URL; especially do not point it at HTTP, localhost, or unofficial hosts. Prefer a pinned install source or reviewed commit, and remember that scheduled monitoring stores local baseline/history data and consumes API credits on recurring runs.

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 (2)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/zoodata.py:55
Finding

Bearer API Key Can Be Sent over Plaintext HTTP or to an Untrusted Local Process

Content
View full analysis
dict: global _last_request_time url = f"{BASE_URL}/{endpoint}" if not BASE_URL_TRUSTED: print(f"ERROR: refusing to send your API key to untrusted host '{_host_of(BASE_URL)}'. " "Set ZOODATA_BASE_URL to a zoodata.ai host or localhost, or unset it.", ...[truncated 3464 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
README.md:19
Finding

Unpinned npx Installation Command Introduces Mutable Supply-Chain Execution

Content
View full analysis
Remediation
View remediation
add SerendipityOneInc/ZooData-Skills ``` 2. Pin the installed Skill source to an immutable commit, signed release, or content digest rather than a mutable branch. 3. Publish expected integrity hashes and provide a verification procedure. 4. Use lockfiles and exact versions for the installer and all transitive dependencies. 5. Enable release signing and provenance attestations, and document how users can verify them. 6. Recommend installation without administrative privileges. 7. Periodically audit the pinned installer version and update the documentation only after reviewing the new release. 8. Where feasible, provide a direct, verifiable installation method that does not execute a mutable package merely to retrieve the Skill. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
Findings (13)

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

This second mismatch finding highlights that the skill claims two focused modes (Full Scan and Quick Check) but appears to expose broader keyword, market, brand, history, and self-check utilities, while the claimed monitoring/alerting behavior is only loosely specified in markdown. Such inconsistency weakens security review and can cause operators to rely on assurances about scope and behavior that are not actually enforced.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

This second mismatch finding highlights that the skill claims two focused modes (Full Scan and Quick Check) but appears to expose broader keyword, market, brand, history, and self-check utilities, while the claimed monitoring/alerting behavior is only loosely specified in markdown. Such inconsistency weakens security review and can cause operators to rely on assurances about scope and behavior that are not actually enforced.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
92% confidence
Finding

The install instruction uses npx skills add SerendipityOneInc/ZooData-Skills without pinning an exact package or version, so users may execute whatever package/version resolves at install time. That creates a supply-chain risk: a compromised upstream package, typosquat, or malicious new release could run arbitrary code on the user's machine during installation.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
95% confidence
Finding

The skill declares significant capabilities (environment access, file reads, network, and shell execution) but does not expose an explicit tool-scope or permission boundary in the manifest. That creates a governance and least-privilege problem: an agent runtime may grant broader powers than users or reviewers expect, increasing the blast radius if the skill is misused, prompt-injected, or modified later.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/reference.md (reported line 25)May include surrounding context.

md
# ─── Configuration ───────────────────────────────────────────────────────────

DEFAULT_BASE_URL = "https://api.zoodata.ai/openapi/v2"
API_BASE_PATH = "/openapi/v2"
KEYWORD_DATE_RANGE_MAX_DAYS = 93
KEYWORD_TIMELINE_MAX_DAYS = 61

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/zoodata.py (reported line 50)May include surrounding context.

python
# ─── Configuration ───────────────────────────────────────────────────────────

DEFAULT_BASE_URL = "https://api.zoodata.ai/openapi/v2"
API_BASE_PATH = "/openapi/v2"
KEYWORD_DATE_RANGE_MAX_DAYS = 93
KEYWORD_TIMELINE_MAX_DAYS = 61

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/zoodata.py (reported line 87)May include surrounding context.

python
# ─── Configuration ───────────────────────────────────────────────────────────

DEFAULT_BASE_URL = "https://api.zoodata.ai/openapi/v2"
API_BASE_PATH = "/openapi/v2"
KEYWORD_DATE_RANGE_MAX_DAYS = 93
KEYWORD_TIMELINE_MAX_DAYS = 61

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The review prompt toolkit renders Map/Reduce prompts, ingests local JSON files, and aggregates caller-produced annotations into review insights. That is a generic review-analysis and prompt-engineering capability, not an obvious requirement for a skill whose stated purpose is competitor intelligence monitoring over a defined competitor set.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The review-tag prompt explicitly says 'Output must be in English — translate non-English text before extracting.' This hard-codes a language policy for downstream use without offering a user choice or documenting a justified locale restriction, which matches the natural-language policy violation criteria.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The manifest describes a skill focused on analysis of a defined competitor set, either as a one-shot teardown or sustained per-competitor monitoring. This file implements many additional workflows such as full market entry analysis, opportunity discovery, listing audits against category leaders, pricing analysis for the user's own ASIN, and standalone review intelligence, which materially broaden the skill beyond competitor-set-focused analysis.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The manifest promises competitor-focused insight keyed by competitor identifiers like ASINs, brands, or keywords identifying a competitor set. These commands provide standalone keyword snapshots, trend profiles, keyword expansion, SERP results, and traffic-term analytics, which are broader keyword-research capabilities rather than per-competitor teardown or monitoring.

Content

No source excerpt is available for this finding.

Vague Triggers

Low
Category
Not specified by scanner
Confidence
89% confidence
Finding

The example prompt "Quick check my tracked competitors" is a short, generic phrase that could collide with ordinary user requests rather than clearly signaling a narrow skill invocation. The README provides examples, but it does not define explicit trigger boundaries or exclusion conditions to distinguish when this skill should activate versus when it should not.

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/zoodata.py (reported line 1234)May include surrounding context.

python
"priceMin", "priceMax", "ratingMin", "ratingMax", "bsrMin", "bsrMax",
                 "salesGrowthRateMin", "salesGrowthRateMax", "sellerCountMin", "sellerCountMax",
                 "variantCountMin", "variantCountMax"):
        val = getattr(args, attr.replace("Min", "_min").replace("Max", "_max")
                      .replace("monthly", "monthly_").replace("review", "review_")
                      .replace("sales", "sales_").replace("Growth", "_growth_")
                      .replace("Rate", "rate_").replace("price", "price_")

Static analysis

No suspicious patterns detected.