Back to skill

Security audit

PPT Presenter — 带逐字稿的演讲级PPT生成器

Security checks for vulnerabilities and agentic risk

Overview

This skill coherently builds HTML presentations and images, but users should be careful because it can send slide prompts to Gemini and handles an API key in exposure-prone ways.

Install only if you are comfortable using Gemini for slide image generation. Avoid using confidential notes in prompts unless you approve sending that content to Google, prefer tightly restricted and low-quota API keys, and be aware that the generated template is Chinese-localized unless you change it.

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/generate_slide_images.py:24
Finding

Gemini API Key Exposed Through Command-Line Arguments and Request URLs

Content
View full analysis
tuple[bytes, str] | None: """Generate image using Gemini 3 Pro Image (generateContent with IMAGE modality).""" url = f"https://generativelanguage.googleapis.com/v1beta/models/{model}:generateContent?key={api_key}" payload = json.dumps({ "contents": [{"parts": [{"text": f"Generate this image: {prompt}"}]}], "generationConfig": {"responseModalities": ["IMAGE", "TEXT"]}, }).encode() req = urllib.request.Request(url, data=payload, headers={"Content-Type": "application/json"}) ``` ```python def generate_with_imagen(prompt: str, api_key: str, model: str = FALLBACK_MODEL) -> tuple[bytes, str] | None: """Generate image using Imagen 4.0 (predict endpoint).""" url = f"https://generativelanguage.googleapis.com/v1beta/models/{model}:predict?key={api_key}" payload = json.dumps({ "instances": [{"prompt": prompt}], "parameters": {"sampleCount": 1, "aspectRatio": "16:9"}, }).encode() req = urllib.request.Request(url, data=payload, headers={"Content-Type": "application/json"}) ``` ```python parser.add_argument("--api-key", default=os.environ.get("GEMINI_API_KEY", ""), help="Gemini API key") ``` The unsafe command-line method is also documented in `SKILL.md:73-76`: ```bash python3 scripts/generate_slide_images.py \ --prompts-file prompts.json \ --output-dir ./images \ --api-key "$GEMINI_API_KEY" ``` ### Technical Analysis The Gemini API key is interpolated directly into the query string of every request. HTTPS protects the request contents while in transit, but it does not prevent the complete URL from being retained by URL-aware ...[truncated 2107 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Note
Location
assets/reveal-template.html:178
Finding

Remote Presentation Scripts Loaded Without Subresource Integrity

Content
View full analysis
``` ```html ``` ### Technical Analysis The generated presentation downloads and executes reveal.js JavaScript directly from a public CDN. The URLs pin reveal.js to version `5.1.0`, which limits unexpected version drift, but the resource elements do not contain Subresource Integrity hashes. Without integrity verification, the browser trusts whatever content the CDN returns for those URLs. If the CDN account, package publication process, or delivery infrastructure were compromised, modified JavaScript could execute in the presentation's origin. The loaded code would have browser-level access to the presentation DOM, including slide content and speaker notes. This is a conditional supply-chain risk rather than evidence that jsDelivr or reveal.js is malicious. The audit did not find an existing malicious dependency or remote code payload. ### Attack Path 1. An attacker compromises a relevant CDN, package distribution channel, or delivery path. 2. A user opens a generated presentation while network access is available. 3. The browser requests the reveal.js resources from the CDN. 4. Because no integrity hash is specified, the browser accepts a modified response. ...[truncated 973 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (7)

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The manifest says to use the skill when a user asks to create a presentation, PPT, slides, tech sharing, keynote, or talk, and also when asked to add speaker notes or convert markdown notes into a presentation. These are broad, common phrases without exclusion conditions or narrow context, which could cause unintended invocation for general presentation-related requests.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
85% confidence
Finding

The title and summary are presented in Chinese, and later instructions hard-code Chinese UI text and examples such as lang="zh-CN", Chinese keyboard hints, and Chinese audience phrasing. This indicates a default locale preference rather than offering a language choice, which can violate language/locale policy when users have not opted in.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The skill instructs the agent to send slide prompts and potentially user-derived content to the Gemini API, but it does not require explicit user consent or a clear warning that data will leave the local environment. If users provide sensitive notes, internal documents, or confidential markdown, that material could be transmitted to a third-party service without informed approval.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The template sets <html lang="zh-CN">, which forces the generated presentation to use a Chinese locale regardless of the user's preference. The file does not state that this is optional or limited to China-specific use cases.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The HTML document is explicitly set to lang="zh-CN", which imposes a specific language/locale on all generated presentations. The file does not offer a user opt-in or explain that this template is intentionally region-specific, so it may violate language/locale policy requirements.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The keyboard hint shown to users is hardcoded in Chinese, which forces a specific language in the interface. There is no indication that users can choose another language or that the template is deliberately limited to Chinese-speaking contexts.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
82% confidence
Finding

The keyboard hints and script guidance include Chinese text and explicitly prefer Chinese for Chinese audiences, but the overall skill does not first require a user language selection. This creates a locale-specific default that may not match user expectations.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.