Back to skill

Security audit

Gamma Presentation Generator

Security checks for vulnerabilities and agentic risk

Overview

This Gamma deck skill is purpose-aligned, but it needs review because it uses API keys, sends user content to Gamma, and downloads from an API-provided URL without enough validation or warning.

Install only if you are comfortable with your presentation topics and content being sent to Gamma and with a Gamma API key being available to the skill. Prefer a dedicated, scoped key stored securely, avoid shared keys where possible, do not include confidential or regulated content unless approved, and treat the unpinned npx install path and export-download URL handling as items that should be fixed before broader deployment.

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
generate.ts:77
Finding

Unvalidated API-Provided Export URL Enables Server-Side Request Forgery

Content
View full analysis
{ // Gamma export endpoint const exportUrl = `${gammaUrl}/export/${format}` console.log(`Downloading ${format} from: ${exportUrl}`) const res = await fetch(exportUrl, { redirect: 'follow' }) if (!res.ok) { // Try alternate download approach — Gamma web export console.log(`Direct export failed (${res.status}), trying web export...`) // For now, return the gammaUrl for manual download return gammaUrl } const buffer = await res.arrayBuffer() await Bun.write(outputPath, buffer) return outputPath } ``` ### Technical Analysis The generation-status response is treated as trusted, and `data.gammaUrl` or `data.url` is passed directly into `downloadPresentation`. The code appends an export path and performs a network request without validating the URL's protocol, hostname, resolved address, or port. The request also uses `redirect: 'follow'`. Even if the initial URL points to an expected Gamma domain, an HTTP redirect can send the request to another host. A compromised Gamma service, malicious upstream response, DNS compromise, or other manipulation of the API response could cause the Agent to request arbitrary resources reachable from its execution environment. Potential targets include: - Services bound to `localhost` - Private-network HTTP services - Cloud instance metadata endpoints - Administrative interfaces that trust requests from the local network - Other endpoints inaccessible to an external attacker The downloaded response is written to the caller-selected out ...[truncated 1424 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Note
Location
README.md:43
Finding

Unpinned Package Execution in Installation Instructions

Content
View full analysis
Remediation
View remediation
install gamma-presentation ``` 2. Document the expected package publisher, registry, and reviewed version. 3. Prefer an installation workflow backed by a lockfile and package-manager integrity metadata. 4. Where practical, publish and verify package checksums or signatures before execution. 5. Periodically review and deliberately update the pinned version rather than automatically executing the latest release. 6. Warn users that the installation command executes third-party code and should be run with least privilege in an isolated environment. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Rogue AgentSelf-Modification, Session Persistence
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (14)

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The description says no Gamma account is needed, yet the skill requires a GAMMA_API_KEY and the finding indicates credential/config access and remote API/export behavior. This mismatch can mislead users about authentication, data handling, and trust assumptions, causing them to provide content or run the skill without informed consent.

Content

No source excerpt is available for this finding.

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

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

The API key is stored in the environment. Do not expose it to the user.

bash
# Set in your shell profile or .env
export GAMMA_API_KEY="sk-gamma-..."

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · openclaw/SKILL.md (reported line 82)May include surrounding context.

The API key is stored in the environment. Do not expose it to the user.

bash
# Set in your shell profile or .env
export GAMMA_API_KEY="sk-gamma-..."

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The managed mode instructs users to place a shared API key in a local config file without any warning about file permissions, multi-user systems, secret rotation, or the risks of sharing one credential among teammates. This increases the chance of credential leakage, unauthorized usage, and cost abuse, especially because the README normalizes use of a shared key.

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 · README.md (reported line 25)May include surrounding context.

bun run generate.ts --topic "Q2 Product Roadmap" --format pdf --output ./roadmap.pdf

Generate from detailed content

bun run generate.ts --content "Create a 10-slide pitch deck about..." --output ./pitch.pdf

text

## Install

Skill Enumeration

Medium
Category
Agent Snooping
Confidence
85% confidence
Finding

Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

Content

Scanner excerpt · README.md (reported line 32)May include surrounding context.

Claude Code

bash
# Symlink into skills
ln -s /path/to/gamma-skill ~/.claude/skills/gamma

Skill Enumeration

Medium
Category
Agent Snooping
Confidence
80% confidence
Finding

Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

Content

Scanner excerpt · README.md (reported line 38)May include surrounding context.

OpenClaw / PCClaw

bash
cp SKILL.md ~/.openclaw/skills/gamma/SKILL.md

ClawhHub

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.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The README explicitly states that user topic/content is sent to the Gamma API, but it does not clearly warn users that potentially sensitive prompts or document contents will be transmitted to a third-party service. In a skill that invites free-form content generation, this omission can lead to accidental disclosure of confidential business, personal, or regulated data.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
93% confidence
Finding

The skill invokes code with environment-variable access and external network use, but it does not declare any explicit tool scope or permissions boundary. That makes the capability surface under-documented and increases the chance an agent or user will run it without understanding that secrets may be read and data may be sent off-host.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill instructs users to submit arbitrary presentation content to a third-party API but does not warn that prompts, outlines, and deck content may contain confidential business, personal, or regulated data. In this context, omission of a privacy warning is dangerous because presentation requests often include sensitive internal strategy, investor material, or proprietary information.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The manifest description claims users can generate decks with 'No Gamma account needed,' which implies no user-held Gamma credential is necessary. However, the implementation explicitly requires a Gamma API key, sourced from GAMMA_API_KEY or ~/.gamma/config.json, and exits if none is found.

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 10)May include surrounding context.

md
# Gamma Presentation Generator

Generate polished presentations from a topic or content brief. Uses Gamma AI
to create professionally designed slides. The user does not need a Gamma account.

## When to Use

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 · openclaw/SKILL.md (reported line 10)May include surrounding context.

md
# Gamma Presentation Generator

Generate polished presentations from a topic or content brief. Uses Gamma AI
to create professionally designed slides. The user does not need a Gamma account.

## When to Use

Static analysis

Detected: suspicious.env_credential_access

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
generate.ts:16