Back to skill

Security audit

Kai Export PPT Lite

Security checks for vulnerabilities and agentic risk

Overview

This skill is a coherent HTML-to-PPTX exporter, but it needs Review because it auto-installs mutable packages and processes HTML image sources with broad local-file and network access.

Install only if you trust the environment and the HTML inputs being exported. Prefer preinstalling pinned dependencies in a controlled environment, disable runtime auto-install where possible, avoid exporting untrusted HTML, and treat file://, relative image paths, and remote image URLs as capable of reading local images or reaching internal network services from the machine running the skill.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • Tool Hijacking and SpoofingModifies or replaces tools so legitimate-looking calls execute attacker logic
  • 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
Findings (5)

T08 · Insecure Dependencies

Error
Location
scripts/export-sandbox-pptx.py:60
Finding

Automatic Installation of Unpinned Runtime Dependencies

Content
View full analysis
bool: if not missing: return True if os.environ.get("KAI_EXPORT_PPT_LITE_AUTO_INSTALL", "1").lower() in {"0", "false", "no"}: return False try: subprocess.run( [sys.executable, "-m", "pip", "install", *missing], check=True, stdout=sys.stderr, stderr=sys.stderr, ) return True except Exception: return False ``` The corresponding dependency declarations in `requirements.txt:1-4` only specify minimum versions: ```text beautifulsoup4>=4.12.0 lxml>=4.9.0 python-pptx>=0.6.23 Pillow>=10.0.0 ``` ### Technical Analysis Importing the exporter invokes dependency detection and automatically runs `pip install` when packages are missing. Automatic installation is enabled by default. Package versions are not pinned exactly, package hashes are not verified, and the command does not enforce an approved package index. Consequently, the installed code can vary after the Skill has been audited. The effective source is also affected by the runtime's pip configuration and package index settings. Although the package names appear legitimate and no intentionally malicious package was identified, this creates a supply-chain execution boundary that is not deterministic or adequately controlled. The subprocess call does not use a shell, so it is not directly vulnerable to shell metacharacter injection. The risk instead comes from executing installation logic and imported code from mutable third-party artifacts. ### Attack Path 1. The exporter runs in an environment where one or more dependencies are absent. 2. `_attempt_install_missing_deps()` is called automatically. 3. Pip resolves the package ...[truncated 873 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
scripts/export-sandbox-pptx.py:12780
Finding

Server-Side Request Forgery Through HTML Image Sources

Content
View full analysis
``` or a URL targeting a private service, link-local endpoint, or cloud metadata service. 2. The exporter parses the attacker-controlled `src` value. 3. `urllib.request.urlopen()` sends the request from the Agent's network context. 4. The target receives a request that may bypass external network controls because it originates from a trusted internal host. 5. If the response is accepted as an image by the presentation librar ...[truncated 817 chars]
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Error
Location
scripts/export-sandbox-pptx.py:12790
Finding

Arbitrary Local File Read Through Image Paths

Content
View full analysis
``` or: ```html ``` 2. The exporter reads the supplied source without enforcing an asset-root boundary. 3. The target file is opened with the permissions of the Agent process. 4. If the file contains a supported image, it is inserted into the generated PPTX. 5. The attacker obtains the PPTX and extracts or views the embedded image. 6. Alternatively, a very large file or malicious image can b ...[truncated 515 chars]
Remediation
View remediation

T07 · Tool Hijacking and Spoofing

Error
Location
scripts/run-skill-export.py:31
Finding

Exporter Module Substitution Through Broad Skill-Root Discovery

Content
View full analysis
bool: return ( (path / "SKILL.md").exists() and (path / "scripts" / "export-sandbox-pptx.py").exists() ) ``` ```python def load_exporter_module(skill_root: Path): script_path = skill_root / "scripts" / "export-sandbox-pptx.py" spec = importlib.util.spec_from_file_location( "kai_export_ppt_lite_exporter", script_path, ) if spec is None or spec.loader is None: raise RuntimeError(f"Failed to create module spec for {script_path}") module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) return module ``` ### Technical Analysis When no explicit root is provided, the bootstrap searches several environment-controlled paths, the current working directory, and every parent of that directory. A candidate is trusted merely because it contains files named `SKILL.md` and `scripts/export-sandbox-pptx.py`. The implementation does not verify package ownership, filesystem permissions, a signed manifest, a trusted installation prefix, or the exporter's cryptographic hash. It then dynamically executes the selected Python file with `exec_module()`. This permits a writable or attacker-prepared directory to masquerade as the legitimate Skill i ...[truncated 1395 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/export-sandbox-pptx.py:12783
Finding

Silent TLS Certificate Verification Bypass

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (284)

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
python3 scripts/export-sandbox-pptx.py <file.html> [output.pptx] [--width 1440] [--height 900]

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
python3 scripts/export-sandbox-pptx.py <file.html> [output.pptx] [--width 1440] [--height 900]

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
python3 scripts/export-sandbox-pptx.py <file.html> [output.pptx] [--width 1440] [--height 900]

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
python3 scripts/export-sandbox-pptx.py <file.html> [output.pptx] [--width 1440] [--height 900]

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
5. Let the script self-bootstrap dependencies first. Skill metadata / `requirements.txt` are optimizations, not assumptions.

Hidden Instructions

High
Category
Prompt Injection
Confidence
70% confidence
Finding

Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Content

Scanner excerpt · contracts/slide_creator/source_snapshot/demos/aurora-mesh-en.html (reported line 446)May include surrounding context.

html
<nav class="nav-dots" aria-label="Slide navigation"></nav>

<!-- ═══════════════════════ SLIDES ═══════════════════════ -->

<!-- Slide 1: Hero — Full-screen declaration -->
<section class="slide" data-notes="kai-slide-creator product intro, zero dependencies and 21 presets" aria-label="Hero">

Hidden Instructions

High
Category
Prompt Injection
Confidence
70% confidence
Finding

Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Content

Scanner excerpt · contracts/slide_creator/source_snapshot/demos/bold-signal-en.html (reported line 353)May include surrounding context.

html
<div class="progress-bar"></div>
<nav class="nav-dots"></nav>

<!-- Slide 1: Cover -->
<section class="slide" data-notes="Welcome. kai-slide-creator — 21 design presets, zero dependencies.">
<div class="reveal bold-ghost-number" style="opacity: 0.04; font-size: clamp(10rem, 16vw, 16rem);">01</div>
<div class="slide-content" style="width: 100%; max-width: 1000px; display: flex; flex-direction: column; position: relative;">

Intent-Code Divergence

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The documentation on Slide 5 promises a concrete save-to-file capability for edit mode. In the actual code, notes are only written back to each slide's dataset and broadcast to the presenter view; there is no File System Access API, download generation, or other persistence logic implementing Ctrl+S or file saving.

Content

No source excerpt is available for this finding.

Hidden Instructions

High
Category
Prompt Injection
Confidence
70% confidence
Finding

Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Content

Scanner excerpt · contracts/slide_creator/source_snapshot/demos/chinese-chan-en.html (reported line 319)May include surrounding context.

html
<div class="progress-bar"></div>
<nav class="nav-dots"></nav>

<!-- Slide 1: Cover -->
<section class="slide" data-notes="Welcome. This is kai-slide-creator — presentations that embrace silence.">
<div class="reveal zen-ghost-kanji" style="font-size: clamp(8rem, 18vw, 14rem); opacity: 0.04;">空</div>
<div class="slide-content" style="text-align: center; align-items: center;">

Hidden Instructions

High
Category
Prompt Injection
Confidence
70% confidence
Finding

Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Content

Scanner excerpt · contracts/slide_creator/source_snapshot/demos/modern-newspaper-zh.html (reported line 316)May include surrounding context.

html
</div>
    </div>

    <!-- ═══════════════════════════════════════════════════════
         SLIDE 1 — Hero 封面
         ═══════════════════════════════════════════════════════ -->
    <section class="slide title-slide" id="slide-1" data-notes="产品封面页。kai-slide-creator 的产品名和核心主张。使用 Cover/Masthead 布局:左上角期刊印章,黄色横条,超大标题占满底部左侧。" aria-label="Title slide">

Hidden Instructions

High
Category
Prompt Injection
Confidence
70% confidence
Finding

Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Content

Scanner excerpt · contracts/slide_creator/source_snapshot/demos/neo-brutalism-en.html (reported line 311)May include surrounding context.

html
<div class="progress-bar" style="position:fixed;top:0;left:0;height:3px;background:#000;width:0%;z-index:100;transition:none;"></div>
    <nav class="nav-dots" aria-label="Slide navigation"></nav>

    <!-- Slide 1: Hero — Full-screen declaration -->
    <section class="slide" data-notes="kai-slide-creator product intro cover, zero dependencies and 21 presets" aria-label="Hero">
        <div class="stripe" style="top: 0; right: 0; width: 300px; height: 300px;"></div>
        <div class="slide-content" style="justify-content: flex-end;">

Hidden Instructions

High
Category
Prompt Injection
Confidence
70% confidence
Finding

Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Content

Scanner excerpt · contracts/slide_creator/source_snapshot/demos/neo-retro-dev-zh.html (reported line 617)May include surrounding context.

html
</div>
    </div>

    <!-- ══ SLIDE 1: TITLE ══ -->
    <section class="slide" id="slide-1"
        data-notes="Slide Creator: Claude Code 零依赖 HTML 演示文稿生成器,21 种预设样式,三分钟出稿"
        aria-label="Title">

Hidden Instructions

High
Category
Prompt Injection
Confidence
70% confidence
Finding

Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Content

Scanner excerpt · contracts/slide_creator/source_snapshot/demos/neo-retro-dev-zh.html (reported line 617)May include surrounding context.

html
</div>
    </div>

    <!-- ══ SLIDE 1: TITLE ══ -->
    <section class="slide" id="slide-1"
        data-notes="Slide Creator: Claude Code 零依赖 HTML 演示文稿生成器,21 种预设样式,三分钟出稿"
        aria-label="Title">

Hidden Instructions

High
Category
Prompt Injection
Confidence
70% confidence
Finding

Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Content

Scanner excerpt · contracts/slide_creator/source_snapshot/demos/notebook-tabs-zh.html (reported line 583)May include surrounding context.

html
</div>
    </div>

    <!-- ═══════════════════════════════════════════════
         SLIDE 1 — Hero 封面
         ═══════════════════════════════════════════════ -->
    <section class="slide" id="slide-1" data-notes="slide-creator 产品自我介绍:一个命令生成精美演示文稿,21 种设计预设,零学习成本。" aria-label="Hero">

Hidden Instructions

High
Category
Prompt Injection
Confidence
70% confidence
Finding

Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Content

Scanner excerpt · contracts/slide_creator/source_snapshot/demos/paper-ink-zh.html (reported line 538)May include surrounding context.

html
</div>
    </div>

    <!-- ═══════════ SLIDE 1 — Hero 封面 ═══════════ -->
    <section class="slide" id="slide-1" data-notes="slide-creator:零依赖 HTML 演示文稿,为 Claude Code 和 OpenClaw 设计。19 种预设,零运行依赖。" aria-label="Hero">
        <div class="slide-content">
            <div class="eyebrow reveal">为 Claude Code 和 OpenClaw 打造的演示工具</div>

Hidden Instructions

High
Category
Prompt Injection
Confidence
70% confidence
Finding

Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Content

Scanner excerpt · contracts/slide_creator/source_snapshot/demos/paper-ink-zh.html (reported line 538)May include surrounding context.

html
</div>
    </div>

    <!-- ═══════════ SLIDE 1 — Hero 封面 ═══════════ -->
    <section class="slide" id="slide-1" data-notes="slide-creator:零依赖 HTML 演示文稿,为 Claude Code 和 OpenClaw 设计。19 种预设,零运行依赖。" aria-label="Hero">
        <div class="slide-content">
            <div class="eyebrow reveal">为 Claude Code 和 OpenClaw 打造的演示工具</div>

Hidden Instructions

High
Category
Prompt Injection
Confidence
70% confidence
Finding

Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Content

Scanner excerpt · contracts/slide_creator/source_snapshot/demos/swiss-modern-zh.html (reported line 892)May include surrounding context.

html
<div class="progress-bar"></div>
    <nav class="nav-dots" aria-label="Slide navigation"></nav>

    <!-- Slide 1: Hero -- Title Grid -->
    <section class="slide" id="slide-1" data-export-role="title_grid" data-notes="slide-creator: 零依赖 HTML 演示文稿, 21 种设计预设, 为 Claude Code 和 OpenClaw 而生" aria-label="Hero">
        <div class="bg-num">01</div>
        <div class="hero-inner">

Hidden Instructions

High
Category
Prompt Injection
Confidence
70% confidence
Finding

Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Content

Scanner excerpt · contracts/slide_creator/source_snapshot/demos/terminal-green-en.html (reported line 312)May include surrounding context.

html
<div class="progress-bar"></div>
<nav class="nav-dots" aria-label="Slide navigation"></nav>

<!-- SLIDE 01: Cover — Boot Sequence -->
<section class="slide" data-notes="Welcome! Introduce slide-creator's vision: zero-dependency HTML presentations.">
    <div class="slide-num reveal">[01/08] &gt; BOOT_SEQUENCE</div>
    <div class="boot-lines">

Hidden Instructions

High
Category
Prompt Injection
Confidence
70% confidence
Finding

Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Content

Scanner excerpt · contracts/slide_creator/source_snapshot/demos/terminal-green-en.html (reported line 351)May include surrounding context.

html
</div>
</section>

<!-- SLIDE 03: Discovery -->
<section class="slide" data-notes="Style discovery workflow: pick by eye, not by description.">
    <div class="slide-num reveal">[03/08] &gt; DISCOVERY_PROTOCOL</div>
    <div class="label reveal">&gt; FEATURE</div>

Hidden Instructions

High
Category
Prompt Injection
Confidence
70% confidence
Finding

Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Content

Scanner excerpt · contracts/slide_creator/source_snapshot/demos/terminal-green-en.html (reported line 397)May include surrounding context.

html
</p>
</section>

<!-- SLIDE 05: How It Works -->
<section class="slide" data-notes="Three-command workflow.">
    <div class="slide-num reveal">[05/08] &gt; EXECUTION_FLOW</div>
    <div class="label reveal">&gt; HOW_IT_WORKS</div>

Hidden Instructions

High
Category
Prompt Injection
Confidence
70% confidence
Finding

Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Content

Scanner excerpt · contracts/slide_creator/source_snapshot/demos/vintage-editorial-zh.html (reported line 305)May include surrounding context.

html
</div>
</div>

<!-- SLIDE 1: COVER -->
<section class="slide" data-notes="欢迎观众,介绍 slide-creator 工具。">
  <div class="deco-circle" style="width:600px;height:600px;top:-200px;right:-200px;"></div>
  <div class="deco-circle" style="width:200px;height:200px;bottom:80px;left:60px;"></div>

Hidden Instructions

High
Category
Prompt Injection
Confidence
70% confidence
Finding

Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Content

Scanner excerpt · contracts/slide_creator/source_snapshot/demos/vintage-editorial-zh.html (reported line 305)May include surrounding context.

html
</div>
</div>

<!-- SLIDE 1: COVER -->
<section class="slide" data-notes="欢迎观众,介绍 slide-creator 工具。">
  <div class="deco-circle" style="width:600px;height:600px;top:-200px;right:-200px;"></div>
  <div class="deco-circle" style="width:200px;height:200px;bottom:80px;left:60px;"></div>

Hidden Instructions

High
Category
Prompt Injection
Confidence
70% confidence
Finding

Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Content

Scanner excerpt · contracts/slide_creator/source_snapshot/references/blue-sky-starter.html (reported line 419)May include surrounding context.

html
<div id="stage">
<div id="track">

  <!-- ══════════════════════════════════════════
       01 — COVER
       ══════════════════════════════════════════ -->
  <section class="slide cover" style="overflow:hidden;" data-notes="欢迎!slide-creator 从提示词生成精美的 HTML 演示文稿 — 零依赖,浏览器原生。21 个主题,单文件输出。">

Hidden Instructions

High
Category
Prompt Injection
Confidence
70% confidence
Finding

Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Content

Scanner excerpt · contracts/slide_creator/source_snapshot/references/blue-sky-starter.html (reported line 419)May include surrounding context.

html
<div id="stage">
<div id="track">

  <!-- ══════════════════════════════════════════
       01 — COVER
       ══════════════════════════════════════════ -->
  <section class="slide cover" style="overflow:hidden;" data-notes="欢迎!slide-creator 从提示词生成精美的 HTML 演示文稿 — 零依赖,浏览器原生。21 个主题,单文件输出。">

Hidden Instructions

High
Category
Prompt Injection
Confidence
70% confidence
Finding

Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Content

Scanner excerpt · contracts/slide_creator/source_snapshot/references/html-template.md (reported line 36)May include surrounding context.

md
<meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Presentation Title</title>
    <!-- Fonts: combine style file fonts + CJK fallback in single Google Fonts URL -->
    <!-- CJK RULE: for Chinese (lang="zh"/lang="zh-CN"), append &family=Noto+Sans+SC:wght@400;700 -->
    <!--   for serif Chinese styles, use Noto_Serif_SC:wght@300;400;700 instead -->
    <link rel="preconnect" href="https://fonts.googleapis.com">