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

Content
View full analysis

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
View 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

Content
View full analysis

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
View 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
Confidence
75% confidence
Finding

Code or instructions that leak agent conversation context to external services, potentially exposing sensitive user interactions.

Content

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

md
## 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

Context Leakage

High
Category
Data Exfiltration
Confidence
75% confidence
Finding

Code or instructions that leak agent conversation context to external services, potentially exposing sensitive user interactions.

Content

Scanner excerpt · scripts/competitor-scraper.sh (reported line 103)May include surrounding context.

sh
## 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

Context Leakage

High
Category
Data Exfiltration
Confidence
75% confidence
Finding

Code or instructions that leak agent conversation context to external services, potentially exposing sensitive user interactions.

Content

Scanner excerpt · scripts/reddit-miner.sh (reported line 58)May include surrounding context.

sh
## 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

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
scripts/reddit-miner.sh --subreddit "personalfinance" --query "FIRE calculator" --limit 50

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
scripts/reddit-miner.sh --subreddit "personalfinance" --query "FIRE calculator" --limit 50

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
scripts/reddit-miner.sh --subreddit "personalfinance" --query "FIRE calculator" --limit 50

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
scripts/competitor-scraper.sh --product "Personal Capital" --sources "g2,trustpilot,reddit"

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
scripts/competitor-scraper.sh --product "Personal Capital" --sources "g2,trustpilot,reddit"

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
scripts/competitor-scraper.sh --product "Personal Capital" --sources "g2,trustpilot,reddit"

External Model or Provider Selection

High
Category
Excessive Agency
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.

Content

Scanner excerpt · scripts/reddit-miner.sh (reported line 84)May include surrounding context.

sh
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

Missing User Warnings

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
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.

Content

Scanner excerpt · INTEGRATION.md (reported line 233)May include surrounding context.

md
**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

Missing User Warnings

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Skill Enumeration

Medium
Category
Agent Snooping
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.

Content

Scanner excerpt · QUICKSTART.md (reported line 89)May include surrounding context.

md
## 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

Skill Enumeration

Medium
Category
Agent Snooping
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.

Content

Scanner excerpt · QUICKSTART.md (reported line 143)May include surrounding context.

md
## 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

Skill Enumeration

Medium
Category
Agent Snooping
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.

Content

Scanner excerpt · TASK-COMPLETION-SUMMARY.md (reported line 12)May include surrounding context.

md
## 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

Missing User Warnings

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.