Back to skill

Security audit

Engagement Analytics Skill

Security checks for vulnerabilities and agentic risk

Overview

This analytics skill is not deceptive or self-executing, but some copy-ready tracking examples can collect or share sensitive user behavior without enough built-in guardrails.

Install only if you want analytics implementation guidance and are prepared to review privacy and compliance details yourself. Do not paste the form, identity-linking, attribution, webhook, or LLM sentiment examples into production without consent gating, data minimization, sensitive-field exclusions, redaction, retention rules, and vendor/data-sharing review.

Vulnerability Patterns
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T09 · Insecure Skill Coding Practices

Warning
Location
references/social-analytics.md:131
Finding

Untrusted Social Media Comments Are Sent to an External LLM Without Sanitization or Prompt-Injection Controls

Content
View full analysis
dict: prompt = f"""Analyze these social media comments and classify each as: - positive, neutral, or negative - category: product_feedback, shipping, price, comparison, question, praise, complaint - urgency: high (requires response), medium, low Comments: {comments} Return JSON: [{{"comment": "...", "sentiment": "...", "category": "...", "urgency": "..."}}]""" response = client.messages.create( model="claude-sonnet-4-20250514", max_tokens=1000, messages=[{"role": "user", "content": prompt}] ) return response.content[0].text ``` ### Technical Analysis The function directly interpolates externally controlled social media comments into an instruction-bearing prompt. No separation, escaping, sanitization, or explicit treatment of the comments as untrusted data is applied. An attacker can publish a comment containing instructions such as requests to ignore the classification task, generate forged classifications, or return content that violates the expected output structure. Because the implementation returns the model's response as an unrestricted string rather than validating it against a schema, manipulated output can propagate into dashboards, moderation workflows, or automated response systems. The comments are also transmitted to Anthropic over the network. Social media comments may contain usernames, email addresses, telephone numbers, account identifiers, or other personal data. The example provides no redaction, consent verification, data-minimization step, retention control, or regional-processing configuration before this disclosure. ...[truncated 1985 chars]
Remediation
View remediation
Classification: bounded_comment = redacted_comment[:2000] prompt = { "task": "Classify the supplied comment.", "se ...[truncated 981 chars]
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (14)

Missing User Warnings

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The form-abandonment example records per-field interaction history and sends last_field_touched plus an ordered fields_touched trail, which can reveal sensitive user intent and, depending on field names, health, financial, account, or contact-related information. Because this is presented as a ready-to-paste GTM Custom HTML pattern without warnings or exclusions for sensitive forms/fields, it creates a strong risk of overcollection and privacy violations.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill’s trigger scope is unusually broad and includes many generic requests like 'measure engagement' or 'how do I measure X,' plus an instruction to 'Always use this skill.' In an agent system, this can cause over-invocation, routing analytics-related requests into a data-collection-oriented skill even when the user’s intent is ambiguous, increasing the chance of inappropriate tracking guidance or privacy-impacting recommendations.

Content

No source excerpt is available for this finding.

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
75% confidence
Finding

Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Content

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

md
- Use server-side tagging (GTM Server-Side) for sensitive data flows
- Respect `Do Not Track` headers and browser privacy modes
- Apple ATT opt-in required for IDFA on iOS — design attribution without assuming access
- CCPA: provide opt-out mechanism; do not sell behavioral data without consent

---

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The document instructs collection of detailed per-email and per-user engagement data, including hashed email identifiers, device, location, and behavioral scoring, without any mention of consent, lawful basis, notice, retention, or regional privacy constraints. In an analytics-tracking skill, this omission is materially risky because users may implement privacy-invasive tracking and profiling by default, creating compliance and trust harms even if the examples are technically valid.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The Klaviyo identification and webhook guidance promotes cross-channel identity linking, anonymous-visitor backfill, and transmission of engagement events to external endpoints, but does not warn about consent requirements, data-sharing implications, or the sensitivity of combining web and email behavior. In this skill context, that makes the omission more dangerous because the skill is explicitly meant to be reused for tracking implementations, so missing safeguards are likely to propagate into production systems.

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/email-analytics.md (reported line 92)May include surrounding context.

md
}
}

resp = requests.post(
    "https://a.klaviyo.com/api/webhooks/",
    headers={
        "Authorization": "Klaviyo-API-Key YOUR_PRIVATE_KEY",

External Transmission

Medium
Category
Data Exfiltration
Confidence
70% 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/email-analytics.md (reported line 92)May include surrounding context.

md
}
}

resp = requests.post(
    "https://a.klaviyo.com/api/webhooks/",
    headers={
        "Authorization": "Klaviyo-API-Key YOUR_PRIVATE_KEY",

Dynamic Request Target

Medium
Category
Server-Side Request Forgery
Confidence
60% confidence
Finding

Request target host is built from a dynamic or untrusted value. If the host is attacker-influenced, this enables SSRF to arbitrary internal or metadata endpoints.

Content

Scanner excerpt · references/email-analytics.md (reported line 134)May include surrounding context.

md
api_key = "YOUR_MAILCHIMP_KEY"
server = "us1"  # from your API key suffix

resp = requests.get(
    f"https://{server}.api.mailchimp.com/3.0/reports/CAMPAIGN_ID",
    auth=("anystring", api_key)
)

Dynamic Request Target

Medium
Category
Server-Side Request Forgery
Confidence
60% confidence
Finding

Request target host is built from a dynamic or untrusted value. If the host is attacker-influenced, this enables SSRF to arbitrary internal or metadata endpoints.

Content

Scanner excerpt · references/email-analytics.md (reported line 161)May include surrounding context.

md
"api": True,
    }
}
requests.post(
    f"https://{server}.api.mailchimp.com/3.0/lists/LIST_ID/webhooks",
    auth=("anystring", api_key),
    json=payload

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The skill explicitly recommends setting a persistent user ID for cross-device tracking without an immediate, explicit warning that this links behavior across contexts and can materially increase privacy risk. In an analytics implementation guide, omission of consent, disclosure, and platform-policy caveats can lead users to deploy privacy-invasive tracking by default.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The attribution SDK section instructs users to initialize AppsFlyer and send purchase events to a third party, but does not clearly warn that install, device, and post-install event data will be shared externally for attribution and profiling. In this skill's context, that omission is risky because readers are likely to copy implementation patterns directly into production analytics stacks.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% 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/social-analytics.md (reported line 90)May include surrounding context.

python
# LinkedIn Marketing API — requires Company Admin access
resp = requests.get(
    "https://api.linkedin.com/v2/organizationalEntityShareStatistics",
    headers={"Authorization": f"Bearer {OAUTH_TOKEN}"},
    params={
        "q": "organizationalEntity",

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The sample sentiment-analysis code sends raw social media comments to Anthropic, a third-party LLM service, without any warning about external data sharing, consent requirements, or data-minimization controls. Social comments can contain personal data, complaints, order details, or sensitive context, so this creates a real privacy and compliance risk if copied into production as-is.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The guidance explicitly recommends collecting session identifiers, hashed user identifiers, referrer/UTM attribution, browser, OS, and other behavioral telemetry, but provides no guardrails around notice, consent, data minimization, retention, or regional privacy compliance. In a tracking-focused skill, this omission is material because implementers may copy the pattern directly into production and collect identifiable or linkable user-behavior data unlawfully or excessively.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.