Back to skill

Security audit

Chimney Sweep Fireplace Kit

Security checks for vulnerabilities and agentic risk

Overview

This markdown-only marketing skill does not run code, but some prompt templates can generate misleading public credential, rating, and review-request claims.

Install only if you will manually review and edit outputs before publishing. Verify every credential, rating, license, insurance, and jurisdiction-specific claim, and change the review sequence so all customers receive the same neutral opportunity to leave an honest public 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 (3)

T09 · Insecure Skill Coding Practices

Warning
Location
prompts/03-reputation-referral.md:31
Finding
Selective Review Solicitation Enables Review Gating<![CDATA[ ## Vulnerability Details **File Location**: `prompts/03-reputation-referral.md`, lines 31–33 and 48–52 **Vulnerability Type**: Review gating caused by contradictory prompt logic **Risk Level**: Medium ### Vulnerable Code ```text - Review requests must not suppress negative reviews (routing unhappy customers away from public review) - Compliant language: "If you were satisfied with our service, an honest Google review helps other homeowners find reliable chimney professionals — we appreciate whatever you're willing to share" - Satisfaction check gate: sequence must include a genuine satisfaction check BEFORE the public review ask — prevents capturing complaints publicly while harvesting only positive reviews (FTC enforcement risk) ``` ```text TOUCH 1 — Text message (same day, within 2 hours of job completion): - Satisfaction check: "Hi [Customer name], this is [TECHNICIAN_NAME] from [BUSINESS_NAME] — how did everything go today? Any concerns I can address before I leave the area?" - If positive response → Touch 2 (review ask) - If negative or no response → internal alert only; no public review push - 50–75 words ``` ### Technical Analysis The prompt claims that negative reviews must not be suppressed, but its operational instructions condition access to the public review request on a positive satisfaction response. Customers who respond negatively—or do not respond—are explicitly excluded from receiving the public review link. This is review gating: feedback sentiment determines whether a customer is invited to publish a public review. The phrase “harvesting only positive reviews” further demonstrates that the filtering is intentional rather than incidental. Although this issue does not provide operating-system access or code execution, it is an insecure Skill design because the generated workflow can systematically manipulate public reputation data and contradict the stated compliance controls. ### Attack Path 1. A contractor supplies custome ...[truncated 1017 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Send the same neutral public-review invitation to every customer, regardless of satisfaction, response sentiment, or lack of response. 2. Use the satisfaction check only to identify and resolve support issues; do not use it as an eligibility gate for the review link. 3. Replace the conditional instructions with logic such as: ```text - Send the same neutral review invitation to all customers. - If a customer reports a concern, create an internal support alert and address the concern promptly. - Do not delay, suppress, or remove the customer's opportunity to submit an honest public review. ``` 4. Remove the phrase “harvesting only positive reviews.” 5. Add an output-validation rule requiring the model to reject any generated sequence that sends review links only to customers with positive sentiment. 6. Test the prompt with positive, negative, neutral, and absent customer responses to verify that all customers retain equal access to the public review channel. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
prompts/02-service-pages-chimney-schema.md:31
Finding
Unconditional JSON-LD Template Can Publish False Professional Credentials<![CDATA[ ## Vulnerability Details **File Location**: `prompts/02-service-pages-chimney-schema.md`, lines 31–34 and 119–122 **Vulnerability Type**: Credential-validation bypass in generated structured data **Risk Level**: Medium ### Vulnerable Code ```text 1. CSIA CREDENTIAL GATE: - CCS number provided: "CSIA Certified Chimney Sweep #[CCS_NUMBER]" in intro paragraph and schema - "in training": "trained to CSIA Best Practices guidelines" — PERMANENTLY BLOCK "CSIA Certified," "CCS," "CSIA-certified company" ``` ```json "hasCredential": [ {"@type": "EducationalOccupationalCredential", "credentialCategory": "CSIA Certified Chimney Sweep", "identifier": "[CCS_NUMBER]"}, {"@type": "EducationalOccupationalCredential", "credentialCategory": "NFI Gas Appliance Specialist"} ], ``` ### Technical Analysis The prose-level credential gate correctly states that a contractor whose CCS status is `in training` must not be described as CSIA certified. However, the fixed JSON-LD template always emits both a CSIA Certified Chimney Sweep credential and an NFI Gas Appliance Specialist credential. Consequently: - `[CCS_NUMBER] = "in training"` can produce a machine-readable CSIA certification claim with `"identifier": "in training"`. - `[NFI_CREDENTIALS] = "none"` can still produce an NFI Gas Appliance Specialist claim. - Search engines and other schema consumers may process the structured claim even if the visible page uses more cautious wording. The schema template therefore bypasses the prompt’s credential gate and permits inconsistent or fabricated credential metadata. ### Attack Path 1. A user sets `[CCS_NUMBER]` to `in training` and/or `[NFI_CREDENTIALS]` to `none`. 2. The model applies the static JSON-LD example while generating the requested service page. 3. The resulting `hasCredential` array still declares CSIA and NFI credentials. 4. The user publishes the generated JSON-LD on a public website. 5. Search engines, aggregators, or customers consume false m ...[truncated 669 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Generate each `hasCredential` entry conditionally: - Include the CSIA entry only when a syntactically valid, user-confirmed CCS number is supplied. - Include NFI entries only for credentials explicitly supplied by the user. - Omit `hasCredential` entirely if no validated credential exists. 2. Provide separate schema templates for certified and in-training contractors. 3. Never place `in training`, `none`, an empty value, or a placeholder into a credential identifier. 4. Add an explicit rule such as: ```text Before emitting JSON-LD, validate every credential against the input values. If CCS_NUMBER is "in training", omit the CSIA hasCredential entry. If NFI_CREDENTIALS is "none", omit every NFI hasCredential entry. Do not infer credentials from services offered. ``` 5. Run a final consistency check across visible copy, page metadata, and JSON-LD. 6. Where practical, require manual verification against the relevant certification registry before publishing structured credential claims. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
prompts/04-digital-ads-local-seo.md:31
Finding
Fixed Advertisement Instructions Can Fabricate Certification and Rating Claims<![CDATA[ ## Vulnerability Details **File Location**: `prompts/04-digital-ads-local-seo.md`, lines 31–34, 69, and 105 **Vulnerability Type**: Contradictory prompt rules permit deceptive advertising output **Risk Level**: Medium ### Vulnerable Code ```text 1. CSIA CREDENTIAL GATE: - CCS number provided: "CSIA Certified Chimney Sweep #[CCS_NUMBER]" - "in training": "trained to CSIA Best Practices" — permanently block "CSIA Certified" in all ad copy - "CSIA-certified company" is PERMANENTLY BLOCKED in all outputs ``` ```text - Trust/social proof: "[REVIEW_COUNT] 5-Star Reviews" / "Same-Day Service" / "Fully Insured" ``` ```text **Description (30 characters max):** "[BUSINESS_NAME] — CSIA Certified" ``` ### Technical Analysis The prompt establishes conditional credential handling, but later requires a fixed Facebook/Instagram description stating that the business is CSIA certified. This can generate a false certification claim when `[CCS_NUMBER]` is `in training`. The Google advertisement instructions also transform `[REVIEW_COUNT]` into a count of “5-Star Reviews” without checking `[RATING]` or the ratings of individual reviews. A business with a 4.9 aggregate rating—or any lower supplied rating—can therefore be described as having a specified number of five-star reviews without supporting evidence. These later output constraints conflict with the earlier compliance gate. Language models may prioritize the more specific output template, causing inaccurate claims to appear in paid advertisements or public posts. ### Attack Path 1. A user supplies `in training` for `[CCS_NUMBER]` or provides a rating below 5.0. 2. The Skill processes the fixed advertisement templates. 3. The generated social advertisement describes the business as “CSIA Certified.” 4. The generated search-ad set may describe all `[REVIEW_COUNT]` entries as “5-Star Reviews.” 5. The user publishes the generated advertisements without manually reconciling the conflicting instructions ...[truncated 657 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Make all certification language conditional: - If a validated CCS number exists, use the individual’s name and CCS number. - If the status is `in training`, use only the approved training language. - Never output the fixed phrase `[BUSINESS_NAME] — CSIA Certified` for an in-training or unverified business. 2. Replace `"[REVIEW_COUNT] 5-Star Reviews"` with an exact aggregate representation: ```text "[REVIEW_COUNT] Google reviews, [RATING] average rating" ``` 3. Do not infer that every review is five-star from an aggregate rating. 4. Require supporting input before generating claims such as “Same-Day Service” or “Fully Insured.” 5. Add a final advertisement-validation stage that compares every credential, rating, insurance, and service claim against the supplied variables. 6. Define fail-closed behavior: if a credential or rating value is missing, malformed, or contradictory, omit the claim rather than inventing or normalizing it. 7. Test the prompt using `in training`, `none`, missing values, ratings below 5.0, and unverified differentiators to ensure that no fixed template overrides the compliance gates. ]]>
Vulnerability Patterns
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (5)

Intent-Code Divergence

High
Confidence
99% confidence
Finding
The CSIA credential gate correctly blocks 'CSIA Certified' when the business is only 'in training,' but Output B hard-codes the Facebook ad description as '[BUSINESS_NAME] — CSIA Certified.' That contradiction can directly induce false credential claims in public ads, exposing users to deceptive advertising, credential misrepresentation, and possible licensing or trade-association enforcement issues.

Natural-Language Policy Violations

Medium
Confidence
80% confidence
Finding
All required output copy, headlines, CTAs, and fixed phrases are specified in English, and the prompt does not offer any opt-in for another language or locale. Under the policy, forcing a specific language without user choice can be a natural-language policy violation unless the locale restriction is explicitly justified.

Intent-Code Divergence

Medium
Confidence
98% confidence
Finding
The prompt’s FTC compliance section bans '5-star' and star-count requests in public-facing content, yet the Google ad headline guidance explicitly asks for '[REVIEW_COUNT] 5-Star Reviews.' This internal contradiction can cause the model to generate non-compliant advertising copy, creating regulatory and consumer-protection risk for downstream users who trust the prompt’s compliance framing.

Natural-Language Policy Violations

Low
Confidence
80% confidence
Finding
The README frames the skill around US market assumptions and specific Nevada/legal standards, such as US home sales volumes and Nevada contractor scope, while presenting the skill as a general marketing kit. Because the file does not offer a locale choice or clearly scope activation/use to US or Nevada users only, it risks a language/locale policy mismatch for users outside that context.

Missing User Warnings

Low
Confidence
76% confidence
Finding
The prompt asks for a trust headline using "[REVIEW_COUNT] 5-Star Reviews" even though the compliance section says public-facing content must not use "5-star" requests or star-count language. Because this file is a markdown prompt that instructs generation of outward-facing ad copy, a warning or clarification should be included so users understand this sensitive marketing/compliance constraint before use.

Static analysis

No suspicious patterns detected.