Back to skill

Security audit

GTS Ecommerce Price Monitor

Security checks for vulnerabilities and agentic risk

Overview

This is a coherent e-commerce price monitoring skill, but users should understand that it stores tracking history and can enable scheduled scans and external notifications.

Install only if you are comfortable with local tracking files, price history, and optional scheduled browser scans. Use it with public marketplace URLs you trust, review notification destinations before enabling them, and be cautious opening generated CSV files in spreadsheet software.

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)

T05 · Unauthorized Access and Privilege Escalation

Warning
Location
SKILL.md:35
Finding

Unrestricted Product URLs May Enable Server-Side Request Forgery

Content
View full analysis

Vulnerability Details

File Location: SKILL.md:35-49; scripts/manage.py:45-56
Vulnerability Type: Unrestricted URL handling and potential server-side request forgery
Risk Level: Medium

Vulnerable Code

SKILL.md:35-49:

markdown
The agent should:
- Accept any e-commerce product URL
- Ask for the desired check frequency (default: 24h)
- Ask for an optional target/alert price
- Store the config in `scripts/prices.json`

### Step 2: Price Scanning

When the user asks to scan or on schedule, the agent:

1. Reads the product list from `scripts/prices.json`
2. For each URL:
   - Visits the page using web browser
   - Extracts: product name, current price, currency, stock status, seller name

scripts/manage.py:45-56:

python
url = args[0] if args else input("URL: ")
name = input("Product name (optional): ").strip()
interval = input("Check interval in hours (default 24): ").strip() or "24"
alert_price = input("Alert price (optional): ").strip()

pid = products["next_id"]
products["next_id"] += 1

entry = {
    "id": pid,
    "url": url,
    "name": name or f"Product #{pid}",

Technical Analysis

The Skill explicitly accepts any URL and stores it without validating its scheme, hostname, resolved address, port, or redirect destination. The scanning workflow subsequently instructs an agent-controlled browser to visit every stored URL.

Consequently, an attacker who can add a tracking target may supply a URL pointing to a loopback service, RFC1918 private network, link-local address, cloud metadata service, or another endpoint reachable from the agent environment but not from the attacker. Scheduling increases the exposure because the request may be repeated automatically across sessions.

The actual network request is performed by the agent/browser rather than the included Python scripts. Exploitability therefore depends on the browser tool's network isolation ...[truncated 1430 chars]

Remediation
View remediation

Remediation Suggestions

  1. Replace the instruction to accept any URL with an explicit allowlist of supported public e-commerce domains.
  2. Permit only https URLs and reject URLs containing embedded credentials, unsupported ports, or ambiguous hostname encodings.
  3. Resolve the hostname before every request and reject loopback, private, link-local, multicast, reserved, and unspecified IPv4 and IPv6 ranges.
  4. Explicitly block cloud metadata addresses, including 169.254.169.254, and equivalent provider-specific hostnames.
  5. Revalidate every redirect destination and enforce a low redirect limit.
  6. Defend against DNS rebinding by binding requests to the validated public address or repeating address validation at connection time.
  7. Run browser requests in an isolated environment without access to the host network or cloud metadata service.
  8. Require confirmation when a URL is outside the supported marketplace-domain allowlist.
  9. Validate all existing targets before creating a recurring scan task, and disable scheduled scans containing invalid targets.
  10. Avoid recording arbitrary response bodies or internal endpoint content in reports, history, or notifications.

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/report.py:119
Finding

Spreadsheet Formula Injection in CSV Reports

Content
View full analysis

Vulnerability Details

File Location: scripts/report.py:119-129; scripts/manage.py:189-198
Vulnerability Type: CSV/spreadsheet formula injection
Risk Level: Medium

Vulnerable Code

scripts/report.py:119-129:

python
writer.writerow(["Timestamp", "Product ID", "Product Name", "Price", "Currency", "URL", "Seller", "In Stock"])
for h in sorted(history, key=lambda x: x.get("timestamp", "")):
    writer.writerow([
        h.get("timestamp", ""),
        h.get("product_id", ""),
        h.get("product_name", ""),
        h.get("price", ""),
        h.get("currency", "RM"),
        h.get("url", ""),
        h.get("seller", ""),
        h.get("in_stock", True),
    ])

scripts/manage.py:189-198:

python
writer.writerow({
    "timestamp": e.get("timestamp", ""),
    "product_id": e.get("product_id", ""),
    "product_name": e.get("product_name", ""),
    "price": e.get("price", ""),
    "currency": e.get("currency", "RM"),
    "url": e.get("url", ""),
    "seller": e.get("seller", ""),
    "in_stock": e.get("in_stock", True),
})

Technical Analysis

The report generators write values originating from user input or scraped marketplace pages directly into CSV cells. Relevant fields include product names, URLs, seller names, currencies, and timestamps.

Python's CSV module correctly quotes and escapes CSV syntax, but quoting does not prevent spreadsheet software from evaluating a cell as a formula. A value beginning with =, +, -, or @ may be interpreted as a formula when the report is opened in spreadsheet software. Some applications also ignore leading tabs, carriage returns, newlines, or spaces before a formula marker.

An attacker could therefore place a formula-like value in a marketplace product or seller name, or persuade a user to track a crafted URL. If that value is later copied into price history and exported, opening the report may evaluate ...[truncated 1404 chars]

Remediation
View remediation

Remediation Suggestions

  1. Introduce a centralized function that converts every externally influenced CSV value to a safe string.
  2. After accounting for leading whitespace and control characters, prefix cells beginning with =, +, -, or @ with an apostrophe.
  3. Apply the sanitizer consistently to product names, URLs, seller names, currencies, timestamps, and any future textual fields.
  4. Preserve numeric fields as validated numeric types rather than arbitrary strings.
  5. Reject or normalize carriage returns, newlines, null bytes, and unexpected control characters in scraped text.
  6. Consider generating an XLSX file with cells explicitly typed as strings instead of relying on CSV interpretation.
  7. Add tests covering payloads such as formula markers preceded by spaces, tabs, carriage returns, and Unicode whitespace.
  8. Warn users that existing unsanitized reports should be treated as untrusted and opened with formula execution disabled.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • YARA SignaturesMalware Match, Webshell Match, Cryptominer Match
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (9)

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 49)May include surrounding context.

md
- Handles platform-specific page structures (see [PLATFORMS.md](references/PLATFORMS.md))

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 105)May include surrounding context.

md
- Handles platform-specific page structures (see [PLATFORMS.md](references/PLATFORMS.md))

YARA rule 'backdoor_persistence': Backdoor persistence with malicious payloads (shell commands, SSH key injection, hidden root users) [malware]

High
Category
YARA Match
Confidence
75% confidence
Finding

YARA rule matched a known malware signature (reverse shell, backdoor, ransomware, C2 framework, or info stealer).

Content

Scanner excerpt · references/CONFIG.md (reported line 32)May include surrounding context.

cted via Discord, alerts route there automatically.

Scheduled Scanning

The agent should set up a recurring cron job when the user asks for automatic scanning:

text
Every 6 hours: scan tracked products, check alerts, notify if triggered
Every 24 hours: generate and save a daily summary report
Weekly (Monday): generate weekly comparison report

Setup

bash
# Example — add to user's crontab or OpenClaw cron
openclaw cron add --name "price-scan" \
  --schedule '{"kind":"every","everyMs":21600000}' \
  --payload '{"kind":"agentTurn","message":"Run scheduled price scan on all tracked products. Check alerts and notify me of any changes."}'

Price History Storage

Default format: JSONL

text
scripts/price_history.jsonl

Each line is a JSON object:

json
{
  "timestamp": "2026-04-30T10:00:00",
  "product_id": 1,
  "product_name": "iPhone 15 Pro",
  "price": 4899.00,
  "currency": "RM",
  "url": "https://shopee.com.my/...",
  "seller": "Apple Flagship Store",
  "in

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The skill description is broadly framed around common e-commerce and reporting tasks, which increases the chance of unintended activation during ordinary conversation. In an agent environment, overbroad triggering can cause the agent to begin collecting URLs, browsing third-party sites, and persisting data without the user clearly intending to invoke this specific skill.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

The natural-language guidance accepts broad commands like "price report," "compare prices," and "scan prices now" without defining boundaries on what sources, accounts, or stored data may be used. This can lead to ambiguous invocation and unintended browsing or data processing, especially if the agent applies the skill to unrelated URLs or prior user context.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The skill instructs the agent to store product URLs, alerts, latest prices, and append-only price history in local files, but it does not warn users that this information will persist across sessions. Persistent storage of URLs and monitoring history can expose business-sensitive competitive intelligence, and users may not realize their tracking activity is being retained long-term.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The guidance routes alerts and exports through Telegram, email, Discord, and potentially Google Sheets without disclosing that product history, URLs, sellers, prices, or other user-associated data may be transmitted to third-party services. This creates a privacy and data-handling risk because users may not realize their tracking data is leaving the local environment or OpenClaw workspace.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The file explicitly instructs setting up a recurring cron job that will continue executing scans and notifications over time, but it does not warn about persistence, resource usage, or the fact that background execution may continue after the immediate user interaction ends. In an agent skill context, unattended scheduled actions can create ongoing data collection, repeated outbound messaging, and surprise system changes if the user has not given informed consent.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

The code defaults displayed currency to "RM" in product listings and exported history, which implies a Malaysia-specific locale choice. Because the file does not offer a user choice or explain that the skill is intentionally region-specific, this is a natural-language locale policy concern.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.