Back to skill

Security audit

In The Cards Lenormand Skill

Security checks for vulnerabilities and agentic risk

Overview

The skill matches its stated purpose of interpreting card spreads, saving readings locally, and creating documents, with minor privacy and reliability caveats.

Use this skill explicitly for card readings and expect questions and interpretations to remain saved locally until deleted. Generated HTML contacts external font providers. Prefer a regular user account with Chromium’s sandbox enabled, install dependencies using the bundled lockfile, and visually inspect outputs because validation can succeed after skipping browser checks.

Vulnerability Patterns
  • 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
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Output HandlingUnvalidated Output Injection, Cross-Context Output, Unbounded Output
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (21)

Incomplete referenced artifact analysis

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
| `social-card` | `assets/seed-social-card.html` | `scripts/render-social-cards.js` | `lenormand-xhs-{topic}-{date}-NN.png` |

Incomplete referenced artifact analysis

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node scripts/render-social-cards.js output/lenormand-xhs-{topic_slug}-{date}.html

Incomplete referenced artifact analysis

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
| `scripts/render-social-cards.js` | Puppeteer: social card HTML → 1080×1440 PNGs | Phase 3c |

Incomplete referenced artifact analysis

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node scripts/validate.js output/lenormand-{spread_type}-{topic_slug}-{date}.html --type a4-pdf

Incomplete referenced artifact analysis

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node scripts/validate.js output/lenormand-web-{topic_slug}-{date}.html --type web-page

Incomplete referenced artifact analysis

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node scripts/validate.js output/lenormand-xhs-{topic_slug}-{date}.html --type social-card

Incomplete referenced artifact analysis

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
Validation is run automatically via `node scripts/validate.js` at the end of each product generation step. See Phase 3a–3c for usage. All checks must pass (exit

Incomplete referenced artifact analysis

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node scripts/manage-readings.js record-product {reading_id} --type a4-pdf

Incomplete referenced artifact analysis

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node scripts/manage-readings.js record-product {reading_id} --type web-page

Incomplete referenced artifact analysis

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node scripts/manage-readings.js record-product {reading_id} --type social-card

Incomplete referenced artifact analysis

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node scripts/manage-readings.js record-product {reading_id} --type long-image

Incomplete referenced artifact analysis

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
- "上次的解读" / "latest reading" → `node scripts/manage-readings.js latest`

Incomplete referenced artifact analysis

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
- "列出最近的解读" → `node scripts/manage-readings.js list --limit 5`

Incomplete referenced artifact analysis

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
| `scripts/manage-readings.js` | CLI: list, find, update reading index | Phase 2b, post-hoc regen |

Skill declares no tool scope ('permissions' or 'allowed-tools') but code capabilities were detected: env.

Medium
Category
MCP Least Privilege
Confidence
70% confidence
Finding

Without declared permissions the skill's intent is opaque and cannot be validated.

Content

No source excerpt is available for this finding.

The trigger list includes everyday requests without requiring Lenormand context.

Medium
Category
Trigger Abuse
Confidence
97% confidence
Finding

Triggers such as "deciding between two options" can select this skill for ordinary decision-support requests without an explicit request for divination. If the host uses these triggers for automatic activation, the mandatory workflow can substitute an unwanted card-reading task and persist the user's question and interpretation locally without clear task-specific authorization; no external disclosure is shown.

Content

No source excerpt is available for this finding.

The skill forces the source prompt's language over the user's language preference.

Medium
Category
Output Handling
Confidence
99% confidence
Finding

The instruction requires all output to be Chinese or English based on the pasted prompt and explicitly rejects the user's profile and chat language. This imposes an output-language constraint without user opt-in, so a user requesting interpretation of a foreign-language spread cannot retain their preferred response language.

Content

No source excerpt is available for this finding.

The validator reports success when required browser checks are skipped or fail to execute, contradicting its documented exit-code guarantee.

Medium
Category
Excessive Agency
Confidence
99% confidence
Finding

The exception handler calls finalize() without recording a failed check, so a browser launch, navigation, or evaluation failure can produce exit code 0 and 'All checks passed' when the completed static checks passed; missing Puppeteer has the same fail-open behavior. This can cause an agent or automated workflow to deliver incompletely validated artifacts, although this skill's skipped checks primarily concern typography and layout rather than security controls, limiting the demonstrated impact.

Content

No source excerpt is available for this finding.

Mandatory third-party font loading lacks a privacy warning.

Low
Category
Output Handling
Confidence
88% confidence
Finding

Mandatory external font imports cause network requests to jsDelivr when generated HTML is rendered with network access, exposing the renderer's IP address and request metadata without a disclosed privacy choice. This matters for potentially personal readings, although the imports do not themselves transmit reading contents, and offline or static outputs may not make such requests.

Content

No source excerpt is available for this finding.

The schema requires a Chinese topic identifier regardless of the reading's selected language.

Low
Category
Output Handling
Confidence
90% confidence
Finding

The topic_slug field must be a 2–6 character Chinese identifier, even though the schema supports English readings. This imposes a specific language on generated output without an explicit opt-in or a documented justification for the constraint.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
80% confidence
Finding

The caret range permits newer Puppeteer 25.x releases, so installations without an enforced lockfile can introduce unreviewed dependency changes, including potentially compromised releases. Puppeteer is appropriate for this skill's PDF and image generation, but installation and browser automation make dependency integrity relevant. This is a low-severity supply-chain hardening issue, not evidence of malicious behavior or a known vulnerable version; an existing committed lockfile used with npm ci would substantially mitigate it.

Content

Scanner excerpt · scripts/package.json (reported line 5)May include surrounding context.

json
"name": "in-the-cards-lenormand-scripts",
  "private": true,
  "dependencies": {
    "puppeteer": "^25.1.0"
  }
}

Static analysis

No suspicious patterns detected.