Back to skill

Security audit

Customer Research & Validation

Security checks for vulnerabilities and agentic risk

Overview

This customer-research skill mostly does what it says, but its generic web scraper can contact arbitrary URLs and the docs understate privacy and site-policy risks from collecting reviews and quotes.

Review before installing. Use the scraper only on authorized public sources, avoid or restrict the generic URL mode, run setup in a virtual environment without sudo, and anonymize or minimize stored quotes and interview notes before feeding them into marketing workflows.

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/competitor-scraper.py:118
Finding
Unrestricted User-Controlled URL Fetching Enables Server-Side Request Forgery## Vulnerability Details **File Location**: `scripts/competitor-scraper.py:118-129`; reachable through `scripts/competitor-scraper.py:247-252` and CLI arguments at `scripts/competitor-scraper.py:280-282` **Vulnerability Type**: Server-Side Request Forgery (SSRF) **Risk Level**: High ### Vulnerable Code ```python def scrape_generic_reviews(url): """ Generic web scraper for review pages. Looks for common review HTML patterns. """ reviews = [] try: headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36' } response = requests.get(url, headers=headers, timeout=10) response.raise_for_status() ``` The vulnerable function is exposed through the following dispatch logic: ```python def scrape_competitor(platform, identifier): if platform == "gumroad": return scrape_gumroad_reviews(identifier) elif platform == "producthunt": return scrape_producthunt_reviews(identifier) elif platform == "url": return scrape_generic_reviews(identifier) else: print(f"Unknown platform: {platform}", file=sys.stderr) return [] ``` User input reaches the function through these arguments: ```python parser.add_argument("--platform", required=True, choices=["gumroad", "producthunt", "url"], help="Platform to scrape") parser.add_argument("--identifier", help="Product identifier (slug or ID)") parser.add_argument("--url", help="Direct URL to scrape") ``` ### Technical Analysis When the `url` platform is selected, the program passes the user-controlled `--url` or `--identifier` value directly to `requests.get()`. It does not validate: - The URL scheme - The destination hostname - The resolved IP address - The destination port - Whether the address is loopback, private, link-local, or reserved - Redirect destinations The `requests` li ...[truncated 2388 chars]
Remediation
## Remediation Suggestions 1. Restrict generic scraping to an explicit allowlist of approved public review domains where feasible. 2. Permit only HTTPS URLs and reject URLs containing embedded credentials. 3. Reject nonstandard destination ports unless explicitly required. 4. Resolve the hostname before connecting and reject every resolved address belonging to loopback, private, link-local, multicast, unspecified, or reserved ranges for both IPv4 and IPv6. 5. Disable automatic redirects with `allow_redirects=False`, or validate every redirect target using the same scheme, hostname, port, and resolved-address controls. 6. Protect against DNS rebinding by ensuring the validated address is the address actually used for the connection. 7. Apply outbound firewall or proxy rules so the Skill can connect only to approved public destinations. 8. Impose response-size limits in addition to the existing timeout. 9. Return a clear validation error before making a request when a destination is not approved. 10. Add automated tests covering loopback, RFC1918 private ranges, IPv6 local addresses, link-local metadata addresses, encoded IP representations, and redirect-based bypasses.

T08 · Insecure Dependencies

Note
Location
requirements.txt:5
Finding
Unpinned Dependencies and Mutable Corpus Downloads Create Supply-Chain Risk## Vulnerability Details **File Location**: `requirements.txt:5-11`; installation occurs at `setup.sh:32-47` **Vulnerability Type**: Unpinned third-party dependencies and mutable external artifacts **Risk Level**: Low ### Vulnerable Code ```text # Reddit API (free tier) praw>=7.7.0 # Web scraping beautifulsoup4>=4.12.0 requests>=2.31.0 # Sentiment analysis (uses free TextBlob) textblob>=0.17.0 ``` The setup script installs the unconstrained future versions and downloads additional mutable resources: ```bash # Install dependencies echo "📦 Installing Python dependencies..." pip3 install -r "$SKILL_DIR/requirements.txt" || { echo "❌ Failed to install dependencies" exit 1 } echo "✅ Dependencies installed" echo "" # Download TextBlob corpora echo "📚 Downloading TextBlob corpora (for sentiment analysis)..." python3 -m textblob.download_corpora 2>/dev/null || { echo "⚠️ TextBlob corpora download may have failed" echo " Try manually: python3 -m textblob.download_corpora" } ``` ### Technical Analysis Every Python dependency uses a lower-bound constraint rather than an exact reviewed version. A fresh installation can therefore retrieve future releases and independently resolved transitive dependencies that were not present during this audit. The installation does not use: - A lockfile - Exact versions - Package hashes - A documented private or trusted package index - Integrity verification for downloaded TextBlob corpora - An automatically created isolated virtual environment Python packages may execute build or installation logic during installation. Although no malicious package was identified in the audited dependency list, the current process provides insufficient reproducibility and integrity assurance if an upstream package, release account, transitive dependency, package index, or downloaded corpus is compromised. ### Attack Path 1. A user runs: ...[truncated 1581 chars]
Remediation
## Remediation Suggestions 1. Replace lower-bound constraints with exact, reviewed versions. 2. Generate and commit a lockfile that includes all transitive dependencies. 3. Require package hashes, for example by using pip's `--require-hashes` mode with a hash-pinned requirements file. 4. Install dependencies inside a dedicated virtual environment rather than the user's global Python environment. 5. Use an explicitly configured trusted package index or an internally controlled package mirror. 6. Run dependency vulnerability and provenance checks in continuous integration. 7. Review dependency updates before regenerating the lockfile instead of accepting future releases automatically. 8. Pin or checksum TextBlob and NLTK corpus artifacts, or package reviewed corpus data as a versioned project resource when licensing permits. 9. Avoid running setup with elevated privileges and document that `setup.sh` must not be executed with `sudo`. 10. Consider using binary-only installations where practical to reduce exposure to unexpected source-build scripts.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Rogue AgentSelf-Modification, Session Persistence
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (37)

Context Leakage

High
Category
Data Exfiltration
Content
## What It Does

1. **Reddit/Forum Mining** — Extract threads, comments, sentiment from subreddits and forums
2. **Survey Generation** — Convert research questions into structured surveys
3. **Interview Scripts** — Generate customer interview guides with probing questions
4. **Persona Validation** — Test persona assumptions against real user behavior
Confidence
75% confidence
Finding
Code or instructions that leak agent conversation context to external services, potentially exposing sensitive user interactions.

Context Leakage

High
Category
Data Exfiltration
Content
## What It Does

1. **Reddit/Forum Mining** — Extract threads, comments, sentiment from subreddits and forums
2. **Survey Generation** — Convert research questions into structured surveys
3. **Interview Scripts** — Generate customer interview guides with probing questions
4. **Persona Validation** — Test persona assumptions against real user behavior
Confidence
75% confidence
Finding
Code or instructions that leak agent conversation context to external services, potentially exposing sensitive user interactions.

Context Leakage

High
Category
Data Exfiltration
Content
## What It Does

1. **Reddit/Forum Mining** — Extract threads, comments, sentiment from subreddits and forums
2. **Survey Generation** — Convert research questions into structured surveys
3. **Interview Scripts** — Generate customer interview guides with probing questions
4. **Persona Validation** — Test persona assumptions against real user behavior
Confidence
75% confidence
Finding
Code or instructions that leak agent conversation context to external services, potentially exposing sensitive user interactions.

Ae1

High
Category
analysis-evasion
Content
scripts/reddit-miner.sh --subreddit "personalfinance" --query "FIRE calculator" --limit 50
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
scripts/reddit-miner.sh --subreddit "personalfinance" --query "FIRE calculator" --limit 50
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
scripts/reddit-miner.sh --subreddit "personalfinance" --query "FIRE calculator" --limit 50
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
scripts/competitor-scraper.sh --product "Personal Capital" --sources "g2,trustpilot,reddit"
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
scripts/competitor-scraper.sh --product "Personal Capital" --sources "g2,trustpilot,reddit"
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
scripts/competitor-scraper.sh --product "Personal Capital" --sources "g2,trustpilot,reddit"
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

External Model or Provider Selection

High
Category
Excessive Agency
Content
if [[ "$SENTIMENT" == true ]]; then
    # Use OpenClaw LLM for sentiment (0 = very negative, 0.5 = neutral, 1 = very positive)
    # For now, placeholder — in production, call gemini or sonnet via openclaw CLI
    # SENTIMENT_SCORE=$(echo "$FULL_TEXT" | openclaw chat --model gemini-3-flash-preview --system "Rate sentiment 0-1. Output only number." --no-stream)
    SENTIMENT_SCORE=0.5  # Placeholder
  fi
Confidence
90% confidence
Finding
Skill selects an external model or provider that may use a different account or billing plan than the operator expects. Undisclosed model switches can cause unexpected cost or quota consumption.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
The deliverables describe Reddit mining and extraction of pain points, complaints, and sentiment without any prominent warning about privacy expectations, API terms, acceptable-use limits, or handling of potentially sensitive user-generated content. In a research automation skill, this omission can normalize collection and downstream use of personal or quasi-personal data in ways that violate platform rules, privacy obligations, or internal compliance requirements.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
The competitor review scraper is presented as scraping multiple third-party platforms with only a rate-limit note, but no warning about robots.txt, anti-bot controls, Terms of Service, account restrictions, or risks from storing and analyzing review content at scale. That makes the skill more dangerous because it frames scraping as operationally ready while omitting the compliance and integrity constraints that often determine whether such collection is permissible.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The document prescribes retaining interview notes for one year and research data for 90 days, but it provides no guidance on handling personal data, consent, access controls, redaction, or lawful basis for retention. Because interview notes and customer research can contain sensitive or identifying information, this omission can lead to privacy violations, over-retention, and downstream exposure if the files are accessed or reused improperly.

Session Persistence

Medium
Category
Rogue Agent
Content
**Solution:** Either persona is wrong, or research query needs refinement. Try broader keywords.

**Issue:** Too many false positives in validation
**Solution:** Keyword matching is simplistic. For production, use semantic similarity (embeddings).

## Future Enhancements
Confidence
75% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Missing User Warnings

Medium
Confidence
88% confidence
Finding
The quick reference normalizes scraping third-party review pages and saving collected data locally without any warning about legal, privacy, or terms-of-service constraints. In a cheat-sheet format, users are encouraged to copy commands directly, which increases the chance of collecting personal data or violating platform rules without informed consent or safeguards.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The quick-start instructs users to run Reddit mining commands that perform external network access and write collected data to local storage, but it does not clearly warn about those side effects up front. This can lead to unintentional scraping, local retention of third-party content, and avoidable rate-limit or policy issues, especially for users who treat quick-start steps as safe defaults.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
The competitor sentiment example directs the user to run a scraper against external sources and save results locally without a prominent notice about data collection, storage, and source-policy implications. In a quick-start context, omission of these warnings makes accidental collection of external content more likely and reduces informed consent before execution.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
The README promotes Reddit/forum mining and web scraping for customer research but does not warn about privacy, data retention, platform terms of service, or legal/ethical constraints. In a skill specifically designed to extract user discussions and competitor information, that omission can normalize collection and downstream use of personal or sensitive community data without safeguards.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
The skill explicitly instructs scraping and storing third-party user content from Reddit, forums, G2, and Trustpilot, but it provides no privacy, consent, retention-minimization, ToS, or lawful-processing guidance. That omission creates a real security/privacy weakness because downstream users may collect personal data, persist verbatim user content, and repurpose it for marketing without safeguards or legal review.

Skill Enumeration

Medium
Category
Agent Snooping
Content
## Deliverables

### 1. ✅ Skill Structure
- **Location:** `skills/customer-research/SKILL.md`
- **Trigger conditions:** Clear and documented
- **Purpose:** Pre-pipeline validation for DaVinci Enterprises products
- **Integration:** Documented workflow with marketing strategy pipeline
Confidence
80% confidence
Finding
Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

Skill Enumeration

Medium
Category
Agent Snooping
Content
## Deliverables

### 1. ✅ Skill Structure
- **Location:** `skills/customer-research/SKILL.md`
- **Trigger conditions:** Clear and documented
- **Purpose:** Pre-pipeline validation for DaVinci Enterprises products
- **Integration:** Documented workflow with marketing strategy pipeline
Confidence
80% confidence
Finding
Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

Skill Enumeration

Medium
Category
Agent Snooping
Content
## Deliverables

### 1. ✅ Skill Structure
- **Location:** `skills/customer-research/SKILL.md`
- **Trigger conditions:** Clear and documented
- **Purpose:** Pre-pipeline validation for DaVinci Enterprises products
- **Integration:** Documented workflow with marketing strategy pipeline
Confidence
80% confidence
Finding
Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
The summary explicitly describes collecting Reddit threads, extracting quotes, and reusing customer language and sample quotes in downstream marketing artifacts, but it provides no privacy, consent, retention, or disclosure guidance. Even when data comes from public sources, operationalizing it for profiling or marketing reuse can create privacy, compliance, and reputational risk if sensitive or identifying content is captured and redistributed.

Missing User Warnings

Medium
Confidence
85% confidence
Finding
The document promotes competitor scraping and future browser automation without warning about site terms, automation boundaries, rate limits, or risks from scripted browsing. That omission can encourage operators to deploy scraping in ways that trigger account, legal, or integrity issues, especially once browser automation is added.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The script solicits sensitive financial, workflow, budgeting, and decision-process information but does not include any privacy notice, consent language, data-use explanation, or handling restrictions. In practice, this can lead to overcollection of personal or business-sensitive information, creating privacy, confidentiality, and social-engineering risks if the notes are stored, shared, or reused insecurely.

Static analysis

No suspicious patterns detected.