Back to skill

Security audit

prose-to-deck

Security checks for vulnerabilities and agentic risk

Overview

This deck-generation skill is coherent overall, but it needs review because unsafe slug handling can write outside the intended project folder and generated decks may load unverified third-party scripts.

Before installing, confirm you are comfortable with the skill creating a project directory and several local files. Prefer review mode, use the default ./projects output root, avoid untrusted or path-like titles until slug validation is fixed, and inspect any generated HTML before sharing because it may contact third-party CDNs and run their JavaScript.

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

Warning
Location
scripts/init_project.py:37
Finding

Unvalidated project slug permits writes outside the configured project root

Content
View full analysis
str: ts = (now or datetime.now()).strftime("%Y%m%d-%H%M%S") return f"{base_slug}-{ts}" def reserve_project_dir(projects_root: Path, initial_slug: str) -> ProjectInitResult: slug = initial_slug project_dir = projects_root / slug suffix = 2 while project_dir.exists(): slug = f"{initial_slug}-{suffix}" project_dir = projects_root / slug suffix += 1 return ProjectInitResult(slug=slug, project_dir=project_dir) def init_project(base_slug: str, author: str, mode: str, projects_root: Path) -> ProjectInitResult: projects_root.mkdir(parents=True, exist_ok=True) result = reserve_project_dir(projects_root, build_slug(base_slug)) print(f"Creating project: {result.project_dir}", file=sys.stderr) result.project_dir.mkdir(parents=True, exist_ok=False) write_progress(result.project_dir, result.slug, author, mode) touch_artifacts(result.project_dir) ``` ### Technical Analysis The positional `base_slug` argument is incorporated directly into a filesystem path without validating or normalizing it as a single safe path component. There are no checks for: - Absolute paths - `/` or platform-specific path separators - `.` or `..` traversal components - A strict allowlist of slug characters - Whether the resolved destination remains beneath `projects_root` With `pathlib`, joining a root path with an absolute second operand discards the original root. Relative values containing `..` can similarly resolve outside the configured project directory. The resulting path is then passed to `mkdir(parents=True)` and used as the destination for six generated artifact files. ### Attack Path 1. An attacker or untrusted ...[truncated 1235 chars]
Remediation
View remediation
str: if not SLUG_PATTERN.fullmatch(value): raise ValueError("base_slug must contain only lowercase letters, digits, and hyphens") return value root = projects_root.resolve() safe_slug = validate_base_slug(base_slug) candidate = (root / build_slug(safe_slug)).resolve() if candidate.parent != root: raise ValueError("Project directory must be a direct child of projects_root") ``` 4. Apply a reasonable maximum slug length to avoid filesystem and denial-of-service edge cases. 5. Add regression tests covering absolute paths, nested paths, traversal values, mixed separators, empty slugs, and valid slugs. 6. Continue using `exist_ok=False` to preserve the current collision protection, but do not rely on it as a path-containment control. ]]>

T08 · Insecure Dependencies

Warning
Location
references/materials.md:14
Finding

Generated presentations execute third-party CDN resources without integrity verification

Content
View full analysis
`, then call `lucide.createIcons()`. CDN: `https://unpkg.com/@phosphor-icons/web@2.1.1/src/regular/style.css` CDN: `https://cdnjs.cloudflare.com/ajax/libs/Chart.js/4.4.1/chart.umd.min.js` CDN: `https://cdnjs.cloudflare.com/ajax/libs/echarts/5.4.3/echarts.min.js` CDN: `https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.min.js` CDN: `https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.5/gsap.min.js` ``` The associated build instructions state: ```text Single `.html` file. All CSS and JS inline. External resources: Google Fonts for the roles actually used + libraries from `references/materials.md` only when content requires them. If the output uses CDN fonts or libraries, the presentation must still preserve readable core text and structure when those resources fail to load. ``` ### Technical Analysis The Skill instructs generated presentations to load JavaScript and CSS directly from third-party CDNs. No Subresource Integrity hashes, restrictive Content Security Policy, local vendoring requirement, or cryptographic verification process is specified. Most dependency URLs identify particular releases, but Mermaid uses only the major-version selector `@10`. That selector can resolve to different package content over time without any corresponding change to the reviewed Skill package. Even exactly versioned CDN resources remain dependent on the integrity of the package registry, CDN, DNS resolution, and the remote account or publication pipeline. Fallback readability protects presentation availability when a resource fails to load, but it does not protect against a resource that loads successfully wit ...[truncated 1486 chars]
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (7)

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The declared description presents the skill as a content transformation tool that converts long-form writing into a designed single-file HTML presentation. The supplied code does not perform any such transformation or rendering. Instead, it is a setup utility that creates a new project folder, assigns a timestamped slug, writes a progress template, and creates empty placeholder files for later stages. While the created artifacts suggest support for the described workflow, this code chunk’s actual purpose is project initialization, not presentation generation. That is a materially different primary behavior, so this is a mismatch.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The declared description promises a content-processing/presentation-generation skill. The actual code chunk shown does not implement that purpose; it merely forwards execution to a Python script named init_project.py. While this may be a support entrypoint, based on the supplied code alone the observed behavior is project/script initialization and interpreter selection, which is materially different from the declared primary purpose. Therefore this chunk does not accurately represent the described functionality.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
89% confidence
Finding

The skill instructs the agent to create and modify multiple files and to run a local Python script, but it does not declare any explicit tool scope or allowed-tools boundary. That increases the risk of unintended filesystem writes or broader execution than a caller expects, especially because the workflow persists artifacts across several phases.

Content

No source excerpt is available for this finding.

Whitespace Padding

Medium
Category
Prompt Injection
Confidence
70% confidence
Finding

Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.

Content

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

md
## Execution Modes

| Mode                    | Behavior                                                                                        |
| ----------------------- | ----------------------------------------------------------------------------------------------- |
| `mode=review` (default) | Pause at each HITL checkpoint, write the stage file, notify the user, and wait for confirmation |
| `mode=auto`             | Skip all pauses — write all stage files and continue immediately                                |

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

Auto mode is designed to skip human approval while still writing all stage files, progress state, and final output. In practice, that means a single invocation can cause extensive filesystem modification without an explicit up-front warning or confirmation, which raises the risk of accidental overwrites, clutter, or writing to a user-specified alternate path.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
86% confidence
Finding

The instruction uses a Chinese phrase ("演进时间线") as a required reference example without indicating that language choice is optional or context-specific. This can reflect a locale/language constraint in the artifact process without documenting user choice or justification.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The checklist explicitly tells the agent to 'Fix issues silently' and only notify the user when a design decision is required. In an agent workflow, this can hide substantive content, styling, or technical changes from the user, reducing transparency and bypassing user review for modifications the user may care about.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.