Back to skill

Security audit

presentation-generator

Security checks for vulnerabilities and agentic risk

Overview

This is a coherent presentation generator, but its optional share/export paths use unpinned networked tooling and can publish decks externally, so users should review it before installing.

Install only if you are comfortable with npm-based tooling that may execute current registry versions. For sensitive decks, avoid the Vercel deploy path unless you explicitly intend public sharing, use a constrained environment, and prefer pinned or locally locked versions of the renderer and Vercel CLI. Do not export untrusted HTML decks to PDF on a network that can reach sensitive internal services.

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

Warning
Location
scripts/deploy.sh:82
Finding

Unpinned Vercel CLI Is Downloaded and Executed at Runtime

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)" ``` The same general pattern also appears in `SKILL.md`, including unversioned commands for `@presentation-md/install`, `skills`, `@presentation-md/render`, and theme packages. ### Technical Analysis The deployment script invokes `npx --yes vercel` without specifying an immutable package version. If the package is not already cached locally, `npx` can retrieve the current release from the configured npm registry and execute it immediately. The `--yes` option suppresses the normal installation prompt. Consequently, the code that executes during deployment is not necessarily the code that existed when this Skill was audited. Its behavior can change due to a compromised package release, compromised maintainer credentials, registry manipulation, or changes to the user's npm registry configuration. The script also invokes the package twice, first for authentication status and then for deployment. Either invocation represents a remote code execution boundary because npm packages and their dependencies execute with the permissions of the current user. ### Attack Path 1. An attacker compromises the `vercel` npm package, one of its dependencies, or the npm account used to publish it. An equivalent attack could target a malicious registry configured through the user's npm settings. 2. The victim or agent invokes `scripts/dep ...[truncated 1286 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/pdf-security.mjs:115
Finding

DNS Rebinding Can Bypass the PDF Export Private-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); } } ``` ```js export function createPdfRouteGuard(inputPath, { resolveHostname = defaultResolver } = {}) { const hostnameCache = new Map(); return async (route) => { if (route.request().resourceType() === "script") { await route.abort(); return; } let currentUrl = route.request().url(); let parsed; try { parsed = new URL(currentUrl); } catch { await route.abort(); return; } if (INLINE_SCHEMES.has(parsed.protocol)) { await route.continue(); ...[truncated 4055 chars]
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • 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
Findings (27)

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The skill is described as a presentation generator, but it also includes deployment and public-sharing capabilities via Vercel. This mismatch is dangerous because users may invoke a seemingly local content-generation skill without realizing it can perform external publication actions, risking confidential deck exposure or unintended data egress.

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

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

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
91% confidence
Finding

The manifest description says the skill should be used for 'any presentation request,' which is broad enough to overlap with many ordinary requests involving summaries, notes, or communications. It does not provide clear boundaries or exclusion conditions for when this skill should or should not activate.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding

The skill instructs the agent/user to execute an unpinned npx @presentation-md/install package, which fetches the latest published code at runtime. If the package is compromised, typosquatted, or updated maliciously, the agent could run attacker-controlled install logic with the user's local privileges.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
83% confidence
Finding

npx skills add ... executes a package/toolchain without an explicit version pin, creating a supply-chain risk similar to other unpinned npx invocations. Because this is part of the installation path for the skill itself, a compromised upstream package could lead to arbitrary code execution during onboarding.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding

The skill recommends npx @presentation-md/render ... without pinning a version, so rendering a deck can trigger execution of whatever package version is current at that time. This expands the attack surface beyond install time to normal workflow usage, increasing the chance of silent remote code execution via a poisoned package release.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
93% confidence
Finding

The unpinned npx @presentation-md/create-theme instruction allows execution of mutable remote package code when creating themes. Any upstream compromise would run in the local environment and may access files, tokens, or shell capabilities available to the user.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
93% confidence
Finding

This second npx @presentation-md/create-theme --from-url example has the same unpinned package-execution risk, with additional exposure because it may also ingest remote branding content. A compromised package or malicious update could combine code execution with untrusted network input handling.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding

Another unpinned npx @presentation-md/render invocation appears in the markdown import flow, again enabling execution of latest-available package code. Repeated guidance to use mutable npx commands normalizes unsafe package execution across multiple workflow stages.

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
91% confidence
Finding

The instruction npx vercel login invokes the Vercel CLI without pinning a version, introducing supply-chain risk into the deployment/authentication path. Because login flows often handle tokens and account credentials, compromise here can have broader account-level consequences than a simple local render command.

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.

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.

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
92% confidence
Finding

npx --yes vercel whoami can resolve and execute the vercel package without a pinned version, so behavior depends on whatever version is fetched or locally resolved at runtime. In an agent or CI environment, this creates supply-chain and reproducibility risk if an unexpected version or compromised dependency is executed.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The manifest describes a skill for generating slide decks as HTML and PowerPoint from notes. This script instead authenticates with Vercel and deploys the generated content to a public remote URL, which is a distinct operational behavior beyond generation itself.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

A presentation generator would be expected to create files locally, but not necessarily to publish them to an external hosting platform. This script performs networked deployment and creates externally accessible URLs, which is a separate capability not declared in the stated purpose.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding

npx --yes vercel "${VERCEL_ARGS[@]}" performs the actual deploy using an unpinned vercel package, which means the code used for deployment is not fixed to a known version. That introduces supply-chain risk and makes the deployment path non-reproducible, especially concerning because this script performs external publication.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
77% confidence
Finding

The instruction 'The first JSON you emit must already clear this file' imposes a fixed output format requirement in natural language. Under the policy rule, forcing a specific language/format without user opt-in can be a natural-language policy concern, even though this one is relatively low impact because it concerns format rather than human language locale.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.