Back to skill

Security audit

Presentation MD

Security checks for vulnerabilities and agentic risk

Overview

This is a coherent slide-deck skill, but some optional commands can publish decks externally or run changing internet-downloaded tools, so it needs careful review before use.

Use the deck generation features normally, but review carefully before running install/render/deploy commands. Avoid deploying confidential decks unless you explicitly intend to publish them, pin or preinstall trusted package versions where possible, and run PDF export or deployment in a sandboxed environment without unrelated credentials when processing untrusted deck content.

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)

T08 · Insecure Dependencies

Error
Location
scripts/deploy.sh:82
Finding

Unpinned Vercel CLI Is Downloaded and Executed During Deployment

Content
View full analysis
/dev/null 2>&1 || { echo "error: npx not found — install Node.js first" >&2 exit 1 } if ! npx --yes vercel whoami >/dev/null 2>&1; then echo "error: not logged into the Vercel CLI." >&2 echo "run: npx vercel login" >&2 echo "then re-run this script." >&2 exit 1 fi VERCEL_ARGS=(deploy --yes --cwd "$DEPLOY_DIR") $PROD && VERCEL_ARGS+=(--prod) URL="$(npx --yes vercel "${VERCEL_ARGS[@]}" 2>&1 | tail -n1)" ``` Related unpinned installation and execution instructions also appear in: - `SKILL.md:26` - `SKILL.md:32` - `SKILL.md:50` - `SKILL.md:214-215` - `SKILL.md:376` Examples include: ```bash npx @presentation-md/install claude-code npx skills add isatimur/presentation-md --skill presentation-generator npx @presentation-md/render deck.json -o deck.html --theme npm i @presentation-md/theme- npx @presentation-md/create-theme ``` ### Technical Analysis The deployment script invokes `npx --yes vercel` without specifying an exact, reviewed package version. If the Vercel CLI is not already installed locally, `npx` can retrieve the currently selected package release from the configured npm registry and execute it immediately. The `--yes` option suppresses the interactive package-installation confirmation. The Skill documentation similarly recommends executing several unversioned npm packages. The effective code run by these commands can therefore change after this Skill package has been reviewed. A compromised upstream account, malicious future release, registry compromise, or manipulated npm registry configuration could cause arbitrary package lifecycle or CLI code to execute. Although `scripts/package-lock.json` pins Playwright artifacts with integrity hashes, that lockfile does not protect the separate `npx ve ...[truncated 1421 chars]
Remediation
View remediation
whoami npx --yes vercel@ "${VERCEL_ARGS[@]}" ``` 2. Prefer declaring the CLI in a project-local `package.json`, committing the corresponding lockfile, and installing it with: ```bash npm ci --ignore-scripts ``` Only omit `--ignore-scripts` if a reviewed dependency genuinely requires lifecycle scripts. 3. Execute the locked local binary instead of dynamically resolving a package: ```bash "$SCRIPT_DIR/node_modules/.bin/vercel" ... ``` 4. Pin all packages shown in `SKILL.md` to reviewed exact versions rather than tags or unconstrained latest releases. 5. Validate registry configuration and use trusted registries only. Where available, verify package provenance and signatures. 6. Run installation and rendering commands in a sandbox with: - Minimal filesystem mounts. - No unrelated credentials. - Restricted environment variables. - Egress controls. - A non-privileged operating-system account. 7. Remove `--yes` where automatic package acquisition is unnecessary, or explicitly verify that the expected package and version are already installed before execution. ]]>

T09 · Insecure Skill Coding Practices

Error
Location
scripts/pdf-security.mjs:68
Finding

DNS Rebinding Window in the PDF Export Network Guard

Content
View full analysis
{ timer = setTimeout(() => reject(new Error(`DNS lookup timed out for ${hostname}`)), DNS_TIMEOUT_MS); }), ]); const allowed = addresses.length > 0 && addresses.every(isPublicNetworkAddress); hostnameCache.set(hostname, allowed); return allowed; } catch { hostnameCache.set(hostname, false); return false; } finally { if (timer) clearTimeout(timer); } ``` The request is subsequently performed by Playwright after the separate validation: ```js if (!(await isAllowedPublicHttpUrl(currentUrl, hostnameCache, resolveHostname))) { await route.abort(); return; } let response = await route.fetch({ maxRedirects: 0 }); for (let hop = 0; response.status() >= 300 && response.status() < 400; hop += 1) { const location = response.headers()["location"]; if (!location || hop >= MAX_REDIRECT_HOPS) { await response.dispose(); await route.abort(); return; } const nextUrl = new URL(location, currentUrl).toString(); if (!(await isAllowedPublicHttpUrl(nextUrl, hostnameCache, resolveHostname))) { await response.dispose(); await route.abort(); return; } await response.dispose(); currentUrl = nextUrl; response = await route.fetch({ url: currentUrl, maxRedirects: 0 }); } await route.fulfill({ response }); ``` ### Technical Analysis The guard correctly rejects known private, loopback, link-local, reserved, and documentation IP ranges during its explicit DNS check. It also re ...[truncated 3140 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • System Prompt LeakageDirect Leakage, Indirect Extraction, Tool-Based Exfiltration
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
Findings (28)

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The skill is presented primarily as a deck generator, but it also includes public deployment to Vercel and creation of externally accessible URLs. That mismatch can bypass user expectations and consent boundaries, causing confidential presentation content to be published through a capability not clearly disclosed in the top-level purpose.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The skill is presented primarily as a deck generator, but it also includes public deployment to Vercel and creation of externally accessible URLs. That mismatch can bypass user expectations and consent boundaries, causing confidential presentation content to be published through a capability not clearly disclosed in the top-level purpose.

Content

No source excerpt is available for this finding.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
wn directory*, not the user's project — resolve `<skill-dir>` to wherever this `SKILL.md` is installed (e.g. `~/.claude/skills/presentation-generator/` or the p

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
96% confidence
Finding

The script adds public deployment capability that goes beyond merely generating presentation artifacts; it can publish potentially confidential decks to an external URL. Even though the comments warn about preview mode and human confirmation, the capability materially expands the trust boundary and creates data-exfiltration risk if triggered by an agent or confused user.

Content

No source excerpt is available for this finding.

Chaining Abuse

High
Category
Tool Misuse
Confidence
75% confidence
Finding

Tool calls are chained to bypass individual safety checks or escalate capabilities beyond what any single tool call would allow.

Content

Scanner excerpt · scripts/deploy.sh (reported line 52)May include surrounding context.

sh
CLEANUP_DIR=""
cleanup() {
  [[ -n "$CLEANUP_DIR" ]] && rm -rf "$CLEANUP_DIR"
}
trap cleanup EXIT

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
94% confidence
Finding

The code performs external hosting/public deployment to Vercel, which is a sensitive side effect not inherent to presentation generation. In skill context, presentations are often drafts or confidential business materials, so embedding a one-command publishing path increases the risk of accidental disclosure.

Content

No source excerpt is available for this finding.

Direct Prompt Extraction

High
Category
System Prompt Leakage
Confidence
85% confidence
Finding

Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.

Content

Scanner excerpt · scripts/export-pdf.mjs (reported line 82)May include surrounding context.

js
console.log(`slides in source: ${expectedSlides}, pages in PDF: ${actualPages}`);
if (expectedSlides > 0 && actualPages !== expectedSlides) {
  console.error(
    `warning: page count doesn't match slide count — check the deck's @media print rules (page-break-after: always on each .slide)`
  );
}

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The manifest description says to use the skill for "any presentation request," which is extremely broad and overlaps with common user asks. It does not provide constraints, exclusions, or a narrower activation scope, increasing the chance of unintended invocation.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding

The skill instructs users or agents to execute npx @presentation-md/install without pinning a specific version. Because npx fetches the latest package at runtime, a compromised publisher account, malicious update, or dependency hijack could result in arbitrary code execution on the user's machine.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
88% confidence
Finding

The command npx skills add ... is unpinned and may execute whatever version is current at invocation time. That creates a supply-chain exposure where a future malicious or compromised release could run code or install altered skill content without the user's explicit review.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding

The render path uses npx @presentation-md/render without a version pin, allowing execution of the latest published package. Since rendering tools often parse attacker-controlled deck content and may invoke browsers or file operations, an untrusted package update could lead to code execution or unsafe local processing.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
79% confidence
Finding

The skill references generating content in Studio using the user's own Claude API key, pushing interaction toward a specific external AI provider. If an agent follows this path without explicit opt-in, private deck content or notes may be sent to a third-party service unexpectedly.

Content

No source excerpt is available for this finding.

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
80% 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 212)May include surrounding context.

md
3. **Selection index** — `references/theme-selection-index.json` (mood, best_for, aliases, gallery)
4. **Stunning twenty-five** — `references/stunning-25.md` (flagship craft ceilings + Studio `?example=`)
5. **Layout recipes** — `references/layout-recipes.md` (pitch / launch / wrap / neon / poster / paper / hud / modernist / soft-product / playful / neon-tech / data-editorial / scatterbrain slide maps)
6. **Visual pick** — MCP `preview_themes` / `list_themes` (never ask the user to choose from bare names)

Install: `npm i @presentation-md/theme-<name>`. Scaffold: `npx @presentation-md/create-theme`.
Brand match: `import_brand_theme` MCP or `npx @presentation-md/create-theme --from-url …`.

Rp1

Medium
Category
MCP Rug Pull
Confidence
93% confidence
Finding

Installing themes via npm i @presentation-md/theme-<name> with an unconstrained version allows arbitrary newer package code to be installed. Theme packages may include postinstall behavior or malicious dependency changes, creating a classic supply-chain attack path.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding

The npx @presentation-md/create-theme --from-url flow is both unpinned and accepts remote input, increasing supply-chain and content-ingestion risk. An attacker could abuse either a malicious package update or crafted remote brand source to trigger unsafe processing in theme generation tooling.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding

The markdown import/render command again relies on an unpinned npx @presentation-md/render, which executes whatever version is currently published. Because this path processes user-supplied markdown and HTML fragments, a malicious package release could combine parsing and runtime execution risks.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
60% 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 · SKILL.md (reported line 440)May include surrounding context.

md
## Rendering Guidelines

- **Direct to file** when inside a repo: write `<slug>/deck.html`
- **Code block** when copy-paste is requested: wrap the rendered HTML in a fenced code block, no surrounding explanation
- **No framework imports** — all CSS is internal, no Tailwind/Bootstrap/React
- **No lorem ipsum** — all copy must be plausible, specific, and consistent with the brand

Rp1

Medium
Category
MCP Rug Pull
Confidence
92% confidence
Finding

Using npx vercel login without a pinned CLI version exposes users to supply-chain compromise in a highly sensitive authentication flow. A malicious CLI release could steal tokens, modify deployment targets, or exfiltrate project data during login or deployment.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
88% confidence
Finding

The documentation tells users or agents to invoke npx @presentation-md/render without pinning a specific version. npx resolves and may fetch the latest package at execution time, which creates a supply-chain risk: a compromised upstream release, typo-squatted dependency, or breaking update could be executed unexpectedly in the user's environment.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
87% confidence
Finding

This example invokes npx @presentation-md/create-theme without a version pin, allowing execution of whatever version is current at runtime. Because this tool may be run directly from documentation in an agent-enabled workflow, an attacker who compromises the package or one of its transient dependencies could gain code execution on the host.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
87% confidence
Finding

The unpinned npx @presentation-md/create-theme command exposes consumers to non-deterministic package resolution and possible remote code execution via a malicious or compromised release. In security-sensitive agent contexts, documentation examples are often copied verbatim, increasing the chance this becomes an exploitable supply-chain entry point.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
87% confidence
Finding

This line references the same unpinned npx @presentation-md/create-theme tooling pattern in nearby documentation context, reinforcing a workflow that executes latest-available code from the registry. Even absent malicious intent, this is dangerous because it normalizes insecure package execution in a skill likely to be used by automated agents.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding

npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding

npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding

npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.