Back to skill

Security audit

Amazon Review Workbook

Security checks for vulnerabilities and agentic risk

Overview

The skill is a coherent Amazon review workbook tool, but it needs review because it can control a logged-in Chrome browser and send review text plus an optional DeepLX key to a configured endpoint.

Install only if you are comfortable giving the tool control of a logged-in Chrome session and sending review text to a configured translation service. Use a separate temporary Chrome profile, keep remote debugging bound to localhost, verify URLs are real Amazon domains, review any DeepLX endpoint before use, and avoid enabling translation for sensitive review datasets unless the destination is trusted.

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

Warning
Location
scripts/amazon_review_workbook.py:210
Finding

Unvalidated URL Host Enables Arbitrary Navigation in a Logged-In Browser Profile

Content
View full analysis
tuple[str, str]: parsed = urlparse(url) match = re.search( r"/(?:dp|gp/product|product-reviews)/([A-Z0-9]{10})", parsed.path, re.I ) if not match: raise ValueError(f"Unable to parse an ASIN from URL: {url}") host = parsed.netloc or "www.amazon.com" return match.group(1).upper(), host def build_review_url(host: str, asin: str) -> str: return f"https://{host}/product-reviews/{asin}/ref=cm_cr_dp_d_show_all_btm?ie=UTF8" ``` ```python def navigate(self, url: str) -> None: self.send("Page.navigate", {"url": url}, timeout=20) time.sleep(4) ``` ```python asin, host = parse_product_url(url) review_url = build_review_url(host, asin) ``` ```python combo_url = f"https://{host}/product-reviews/{asin}/ref=cm_cr_dp_d_show_all_btm?ie=UTF8&{combo_params}" ``` ```python combo_url = f"https://{host}/product-reviews/{asin}/ref=cm_cr_dp_d_show_all_btm?ie=UTF8&{kw_params}" ``` ### Technical Analysis The URL parser verifies that the path contains a syntactically valid ten-character ASIN, but it accepts `parsed.netloc` without confirming that the hostname belongs to Amazon. The accepted host is subsequently interpolated into URLs that are opened through the Chrome DevTools Protocol. Consequently, a URL such as `https://attacker.example/dp/B012345678` satisfies the ASIN path requirement. The resulting review URL points to `attacker.example`, not Amazon. The browser connection also selects the first available Chrome page target. The documented setup recommends using a ...[truncated 2053 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/deeplx_translate.py:68
Finding

DeepLX Translation Can Transmit Review Content and API Credentials to Arbitrary or Plaintext Endpoints

Content
View full analysis
str: api_url = explicit or read_env_value("DEEPLX_API_URL") or "" if not api_url: raise SystemExit("Missing DEEPLX_API_URL.") return api_url def resolve_api_key(explicit: str | None = None) -> str: return explicit or read_env_value("DEEPLX_API_KEY") or "" ``` ```python def call_deeplx( text: str, *, api_url: str, api_key: str = "", source_lang: str = "auto", target_lang: str = "ZH", timeout: int = 30, ) -> str: headers = {"Content-Type": "application/json"} if api_key: headers["Authorization"] = f"Bearer {api_key}" headers["x-api-key"] = api_key headers["apikey"] = api_key response = requests.post( api_url, headers=headers, data=json.dumps( { "text": text, "source_lang": source_lang, "target_lang": target_lang, } ), timeout=timeout, ) response.raise_for_status() ``` The batch implementation repeats the same credential handling: ```python headers = {"Content-Type": "application/json"} if api_key: headers["Authorization"] = f"Bearer {api_key}" headers["x-api-key"] = api_key headers["apikey"] = api_key combined = _join_for_translation(texts) response = requests.post( api_url, headers=headers, data=json.dumps( { "text": combined, "source_lang": source_lang, "target_lang": target_lang, } ), ti ...[truncated 2653 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Note
Location
references/setup.md:22
Finding

Installation Instructions Use Unpinned Third-Party Dependencies Without Integrity Verification

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Taint TrackingDirect Taint Flow, Variable-Mediated Taint Flow, Credential Exfiltration Chain
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (32)

Tainted flow: 'api_url' from os.getenv (line 68, credential/environment) → requests.post (network output)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Content

Scanner excerpt · scripts/deeplx_translate.py (reported line 109)May include surrounding context.

python
headers["x-api-key"] = api_key
        headers["apikey"] = api_key

    response = requests.post(
        api_url,
        headers=headers,
        data=json.dumps(

Tainted flow: 'api_url' from os.getenv (line 68, credential/environment) → requests.post (network output)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Content

Scanner excerpt · scripts/deeplx_translate.py (reported line 212)May include surrounding context.

python
combined = _join_for_translation(texts)

    response = requests.post(
        api_url,
        headers=headers,
        data=json.dumps(

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

This code chunk does not perform the core behavior described in the skill declaration. The declaration centers on scraping Amazon customer reviews through Chrome, exporting structured review data, and assisting with tagging. In contrast, the code is narrowly focused on translation via a DeepLX HTTP API, including config loading, request construction, batching, retries, and response parsing. While the description mentions optional DeepLX translation, that is only one supporting subcomponent of the declared workflow; the supplied code lacks the primary advertised capabilities entirely. Therefore the description does not accurately represent what this code chunk actually does.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The declared description presents an end-to-end Amazon review scraping/export pipeline using a logged-in Chrome session and optional DeepLX translation. The supplied code chunk does not perform any scraping, browser control, network access, URL processing, or spreadsheet export. Instead, it focuses on semantic labeling support for already-available review records: heuristics for sentiment/category/focus marks, taxonomy bootstrap generation, canonical tag loading, cache key creation and cache persistence, label payload parsing, and merging labels into records. While the description does mention helping tag rows, this chunk covers only that downstream labeling component and omits the headline capabilities of collecting Amazon reviews and exporting workbooks. That is a material description-behavior mismatch for this code chunk.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The declared description emphasizes end-to-end Amazon review collection through a Chrome debugging session, optional translation filling through DeepLX, and review export. The supplied code chunk does not perform web access, browser automation, session use, scraping, or translation. Instead, it is a post-processing/export utility that takes existing records, maps aliases into a fixed 14-column delivery schema, normalizes sentiment/categories/tags/focus marks/date/helpful votes, validates them, and writes JSON/Excel/CSV outputs. While the output schema aligns with part of the description, the primary advertised capability—collecting reviews from Amazon via Chrome—is absent, making the description materially broader than the actual behavior.

Content

No source excerpt is available for this finding.

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/deeplx_translate.py (reported line 35)May include surrounding context.

python
def candidate_env_files() -> list[Path]:
    files = [
        Path.cwd() / ".env",
        Path(__file__).resolve().parents[1] / ".env",
    ]
    deduped: list[Path] = []

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/deeplx_translate.py (reported line 36)May include surrounding context.

python
def candidate_env_files() -> list[Path]:
    files = [
        Path.cwd() / ".env",
        Path(__file__).resolve().parents[1] / ".env",
    ]
    deduped: list[Path] = []

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The README instructs users to scrape Amazon reviews through a logged-in Chrome session on remote debugging port 9222, but it does not warn that this grants the tooling access to an authenticated browser context. That creates privacy, account, and session-handling risk because users may expose account data or run the scraper against a personal profile without understanding the implications.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The README presents DeepLX translation as an optional feature but does not explicitly disclose that review text will be transmitted to an external translation service. Users may unknowingly send scraped content, potentially including personal data or commercially sensitive material, to a third party without informed consent or proper data-processing review.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
87% confidence
Finding

The skill advertises and orchestrates actions that imply access to environment variables, local files, network endpoints, and a logged-in browser session, but it does not declare an explicit tool or permission scope. That makes the operational boundary unclear and increases the chance the agent invokes sensitive capabilities more broadly than intended, especially around browser-session scraping and external translation services.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The description uses broad triggers like any Amazon link, review scraping, competitor review analysis, review export, or spreadsheet requests, which can cause the skill to activate in situations broader than users expect. Over-broad invocation increases the chance of unintended data collection, browser-session use, or network access when a narrower or safer skill should have been selected.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The skill depends on a logged-in Chrome session for scraping, but the description does not prominently warn about that reliance or the sensitivity of accessing an authenticated browser context. Users may unknowingly permit the skill to operate against a privileged local session, which raises risk around session abuse, unexpected account actions, and collection of authenticated content.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The default prompt automatically invokes the skill for 'this Amazon link' with broad review-collection behavior and no explicit guardrails on when it should trigger or what validation must occur first. In an agentic environment, overly broad invocation language can cause unintended activation on loosely related user input, leading to unreviewed scraping workflows, use of a logged-in browser session, and downstream handling of external content without sufficient user confirmation.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The file requires 评论中文版 to be a faithful Chinese translation and specifies 标签 as short Chinese tags, which imposes a specific language on output. This is a natural-language locale policy concern because the schema does not indicate user opt-in or a documented region-specific justification for forcing Chinese output.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The setup instructs users to launch Chrome with remote debugging on port 9222 against their normal logged-in profile, but it does not warn that the DevTools protocol can expose tabs, cookies, session state, and browser actions to any process or party that can reach that port. In the context of an Amazon-logged-in browser, this can enable account/session abuse or unauthorized scraping and browsing if the port is exposed beyond the local machine or if local malware is present.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The instructions require the model to fill multiple fields in Chinese, including 评论中文版 and 标签, and specify short Chinese tags. This imposes a specific language/locale behavior in natural-language guidance without stating that the workflow is intentionally Chinese-only or allowing user opt-in.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

This code maps country names to Chinese labels and later populates output fields and user-facing messages in Chinese, including a fixed translation target of "ZH". Because the file does not offer opt-in or configuration for output language/localization beyond translation source/target, it enforces a specific locale in a way that may violate language-choice policy.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The translate flow sends collected review text to an external DeepLX service, which is a data egress path outside the local workbook pipeline. In this skill context, the data being processed is scraped third-party content plus derived workbook fields; transmitting it off-box without an explicit runtime warning/consent step can violate user expectations, internal handling rules, or data-sharing restrictions.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

When DeepLX is unavailable, the code instructs the operator to send collected review text to an AI manually, creating an uncontrolled human-mediated data disclosure channel. This bypasses technical safeguards, auditability, and policy enforcement, making accidental oversharing more likely in a workflow already designed to aggregate large volumes of scraped content.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The function transmits review text and optional API credentials to an external service without any in-code user notice, consent gate, or trust restriction on the destination. In a review-scraping workflow, this can expose potentially sensitive or proprietary collected data to a third-party endpoint configured outside the user's awareness.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The batch path combines multiple texts and sends them in one request to an external translation service, increasing the volume of third-party disclosure in a single operation. Because this happens without any visible user-facing acknowledgment or destination validation, it creates a privacy and data-handling risk aligned with the skill's processing of customer review datasets.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The instructions explicitly require producing a 'Chinese tag list', and the surrounding code consistently uses Chinese output field names such as 评论中文版, 评论概括, 情感倾向, 类别分类, 标签, and 重点标记. This imposes a specific language/locale on outputs without any visible opt-in or documented region-specific justification.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The exported analysis records use hard-coded Chinese field names such as "评论用户名", "评论原文", and "情感倾向". This imposes a specific language/locale on downstream output without any visible opt-in, fallback, or justification, which matches the language/locale policy violation category.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
91% confidence
Finding

The skill documentation is written entirely in Chinese and describes output fields such as 评论中文版, indicating a fixed language/locale expectation. There is no explicit user opt-in, alternative locale, or justification that this is a region-specific skill, which fits the language/locale policy concern.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

This markdown file describes running merge-build, which merges labels into a base JSON, writes new labels into a cache, and exports a final workbook. Because the document is a user-facing guide, it should disclose that these steps modify local files and caches so users understand the operation affects stored data.

Content

No source excerpt is available for this finding.

Static analysis

Detected: suspicious.dynamic_code_execution

Dynamic code execution detected.

Critical
Code
suspicious.dynamic_code_execution
Location
scripts/amazon_review_workbook.py:741