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<![CDATA[ ## Vulnerability Details **File Location**: `scripts/export-sandbox-pptx.py:60-72` **Vulnerability Type**: Automatic installation of mutable third-party packages **Risk Level**: High ### Vulnerable Code ```python def _attempt_install_missing_deps(missing: List[str]) -> 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
<![CDATA[ ## Remediation Suggestions 1. Disable automatic dependency installation by default. Require an explicit operator-controlled opt-in if runtime installation is unavoidable. 2. Install dependencies during a controlled build or deployment phase rather than while processing presentation input. 3. Pin exact dependency versions instead of using minimum-version constraints. 4. Generate and enforce hashes using a locked requirements file, for example with `--require-hashes`. 5. Require a trusted, explicitly configured package index and disable unintended extra indexes. 6. Use a dedicated virtual environment with minimum filesystem and network privileges. 7. Fail closed with a clear dependency error when required packages are unavailable. 8. Add dependency scanning, lockfile review, and reproducible-build checks to release validation. ]]>

T09 · Insecure Skill Coding Practices

Error
Location
scripts/export-sandbox-pptx.py:12780
Finding
Server-Side Request Forgery Through HTML Image Sources<![CDATA[ ## Vulnerability Details **File Location**: `scripts/export-sandbox-pptx.py:12780-12789` **Vulnerability Type**: Unrestricted outbound request based on untrusted HTML **Risk Level**: High ### Vulnerable Code ```python elif source.startswith(('http://', 'https://')): req = urllib.request.Request(source, headers={'User-Agent': 'Mozilla/5.0'}) import ssl try: import certifi _ssl_ctx = ssl.create_default_context(cafile=certifi.where()) except ImportError: _ssl_ctx = ssl._create_unverified_context() with urllib.request.urlopen(req, context=_ssl_ctx, timeout=15) as resp: img_bytes = resp.read() ``` ### Technical Analysis The exporter treats an HTML image source as a URL and requests it from the machine running the Skill. There is no destination allowlist, hostname validation, resolved-IP validation, redirect validation, or restriction against loopback, private, link-local, multicast, and cloud metadata address ranges. A hostname can also resolve to an internal address or change its resolution between validation and connection if superficial checks are added later. Redirects may lead from an apparently public URL to an internal destination. The response is read without a maximum byte limit. The implementation does not validate `Content-Type` before reading the response. This creates both SSRF and memory-exhaustion exposure. ### Attack Path 1. An attacker supplies an HTML presentation containing an image such as: ```html <img src="http://127.0.0.1:8080/internal-image"> ``` 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
<![CDATA[ ## Remediation Suggestions 1. Disable remote image retrieval by default and require explicit operator authorization. 2. Prefer requiring callers to download and provide assets through the sandbox attachment mechanism. 3. If remote retrieval is necessary, enforce an allowlist of approved HTTPS hosts. 4. Resolve the hostname before connecting and reject loopback, private, link-local, reserved, multicast, and unspecified IP ranges for both IPv4 and IPv6. 5. Repeat destination validation after every redirect and cap the number of redirects. 6. Protect against DNS rebinding by connecting only to the validated address while preserving correct TLS hostname verification. 7. Reject non-HTTPS destinations unless a narrowly documented exception is required. 8. Require an approved image media type and validate the actual decoded format. 9. Enforce strict connection and read timeouts, a maximum response size, and bounded decompression. 10. Run exports in a network-restricted sandbox that cannot access internal services or metadata endpoints. ]]>

T05 · Unauthorized Access and Privilege Escalation

Error
Location
scripts/export-sandbox-pptx.py:12790
Finding
Arbitrary Local File Read Through Image Paths<![CDATA[ ## Vulnerability Details **File Location**: `scripts/export-sandbox-pptx.py:12790-12797` **Vulnerability Type**: Unrestricted local-file access and directory traversal **Risk Level**: High ### Vulnerable Code ```python elif source.startswith('file://'): with open(source[len('file://'):], 'rb') as f: img_bytes = f.read() elif not source.startswith('<svg') and not source.startswith('<?xml'): img_path = html_dir / source if img_path.exists(): with open(img_path, 'rb') as f: img_bytes = f.read() ``` ### Technical Analysis The image loader accepts absolute `file://` paths directly. It also joins relative image sources to `html_dir` without canonicalizing the final path and verifying that it remains inside an approved asset directory. A source containing traversal components such as `../../private.png` can therefore escape the presentation directory. Absolute paths supplied through ordinary path syntax may also supersede the intended base directory depending on platform path semantics. Symlinks inside an allowed directory can lead to the same result. The file is read in full without a size restriction. The later image decoder may reject non-image data, but files containing valid image data can be embedded in the generated PPTX. Large files or image decompression bombs can also consume excessive resources. ### Attack Path 1. An attacker prepares HTML containing a path to a readable local asset: ```html <img src="file:///home/user/private/screenshot.png"> ``` or: ```html <img src="../../private/architecture-diagram.png"> ``` 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
<![CDATA[ ## Remediation Suggestions 1. Reject `file://` URLs in untrusted presentation input. 2. Establish a dedicated asset root associated with the input presentation. 3. Resolve every candidate path with canonical path handling before opening it. 4. Verify that the canonical target is a descendant of the canonical asset root. 5. Reject absolute paths, traversal components, device paths, network-share paths, and alternate path encodings. 6. Prevent symlink escapes by using secure directory-relative file operations where supported, or by verifying each resolved component. 7. Apply maximum file-size, image-dimension, pixel-count, and decompression limits. 8. Validate file signatures and decode images in a resource-limited process. 9. Run the exporter under a dedicated account that cannot read unrelated workspace or user files. ]]>

T07 · Tool Hijacking and Spoofing

Error
Location
scripts/run-skill-export.py:31
Finding
Exporter Module Substitution Through Broad Skill-Root Discovery<![CDATA[ ## Vulnerability Details **File Location**: `scripts/run-skill-export.py:31-102` **Vulnerability Type**: Local module and tool substitution **Risk Level**: High ### Vulnerable Code ```python for env_key in ( "KAI_EXPORT_PPT_LITE_ROOT", "CLAUDE_SKILL_DIR", "CODEX_SKILL_DIR", "OPENCLAW_SKILL_DIR", ): raw = env.get(env_key) if not raw: continue env_path = Path(raw) _add(env_path) _add(env_path.parent) _add(env_path.parent.parent) cwd_path = Path(cwd or Path.cwd()) _add(cwd_path) for parent in cwd_path.parents: _add(parent) _add(Path.home() / "skills" / SKILL_NAME) _add(Path("/home/user/skills") / SKILL_NAME) return candidates ``` ```python def _looks_like_skill_root(path: Path) -> 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
<![CDATA[ ## Remediation Suggestions 1. Resolve the exporter strictly relative to the trusted bootstrap script's installed location. 2. Remove discovery through the current working directory and its parents. 3. Do not trust generic environment variables unless the runtime guarantees their integrity. 4. If an override is necessary, require an explicit `--skill-root` and clearly treat it as a trusted-code selection option. 5. Validate a signed manifest or a pinned cryptographic hash before executing the exporter. 6. Verify that the selected directory and files are owned by a trusted account and are not writable by untrusted users. 7. Package the bootstrap and exporter as one installed, immutable Python package and use a normal package import. 8. Avoid dynamically executing arbitrary filesystem modules when a fixed packaged entry point is available. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/export-sandbox-pptx.py:12783
Finding
Silent TLS Certificate Verification Bypass<![CDATA[ ## Vulnerability Details **File Location**: `scripts/export-sandbox-pptx.py:12783-12788` **Vulnerability Type**: Fail-open TLS configuration **Risk Level**: Medium ### Vulnerable Code ```python import ssl try: import certifi _ssl_ctx = ssl.create_default_context(cafile=certifi.where()) except ImportError: _ssl_ctx = ssl._create_unverified_context() with urllib.request.urlopen(req, context=_ssl_ctx, timeout=15) as resp: img_bytes = resp.read() ``` ### Technical Analysis If `certifi` is not installed, the exporter falls back to `ssl._create_unverified_context()`. This disables certificate-chain and hostname verification for HTTPS image requests. The absence of certifi does not require TLS verification to be disabled: `ssl.create_default_context()` can ordinarily use the operating system's configured certificate store. The current fail-open behavior converts a missing optional dependency into a silent loss of transport authentication. This finding is separate from SSRF. Even a request to an intended public host can be intercepted or redirected at the network layer when certificate verification is disabled. ### Attack Path 1. The exporter runs in an environment where `certifi` cannot be imported. 2. An HTML presentation references an HTTPS image. 3. The exporter creates an unverified TLS context. 4. An attacker with control over DNS, routing, a proxy, or the local network intercepts the connection. 5. The attacker presents any TLS certificate; the exporter accepts it. 6. The attacker returns a substituted image or oversized response. 7. The substituted content is processed and may be embedded in the generated presentation. ### Impact Assessment A network-positioned attacker can alter remotely retrieved image content, compromise presentation integrity, inject misleading visual material, or contribute to resource-exhaustion attacks. Confidentiality of requested URLs and image responses is also no longer assured against active interc ...[truncated 210 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Replace the fallback with `ssl.create_default_context()` so the operating system trust store is used when certifi is unavailable. 2. Never use `ssl._create_unverified_context()` for production retrieval. 3. If no usable trust store exists, fail closed and report a clear configuration error. 4. Keep hostname verification enabled and require valid certificate chains. 5. Consider restricting remote assets to approved HTTPS origins. 6. Add automated tests confirming that invalid, expired, self-signed, and hostname-mismatched certificates are rejected. ]]>
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
Content
python3 scripts/export-sandbox-pptx.py <file.html> [output.pptx] [--width 1440] [--height 900]
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
python3 scripts/export-sandbox-pptx.py <file.html> [output.pptx] [--width 1440] [--height 900]
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
python3 scripts/export-sandbox-pptx.py <file.html> [output.pptx] [--width 1440] [--height 900]
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
python3 scripts/export-sandbox-pptx.py <file.html> [output.pptx] [--width 1440] [--height 900]
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
5. Let the script self-bootstrap dependencies first. Skill metadata / `requirements.txt` are optimizations, not assumptions.
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Hidden Instructions

High
Category
Prompt Injection
Content
<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">
Confidence
70% confidence
Finding
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Hidden Instructions

High
Category
Prompt Injection
Content
<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;">
Confidence
70% confidence
Finding
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Intent-Code Divergence

High
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.

Hidden Instructions

High
Category
Prompt Injection
Content
<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;">
Confidence
70% confidence
Finding
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Hidden Instructions

High
Category
Prompt Injection
Content
</div>
    </div>

    <!-- ═══════════════════════════════════════════════════════
         SLIDE 1 — Hero 封面
         ═══════════════════════════════════════════════════════ -->
    <section class="slide title-slide" id="slide-1" data-notes="产品封面页。kai-slide-creator 的产品名和核心主张。使用 Cover/Masthead 布局:左上角期刊印章,黄色横条,超大标题占满底部左侧。" aria-label="Title slide">
Confidence
70% confidence
Finding
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Hidden Instructions

High
Category
Prompt Injection
Content
<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;">
Confidence
70% confidence
Finding
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Hidden Instructions

High
Category
Prompt Injection
Content
</div>
    </div>

    <!-- ══ SLIDE 1: TITLE ══ -->
    <section class="slide" id="slide-1"
        data-notes="Slide Creator: Claude Code 零依赖 HTML 演示文稿生成器,21 种预设样式,三分钟出稿"
        aria-label="Title">
Confidence
70% confidence
Finding
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Hidden Instructions

High
Category
Prompt Injection
Content
</div>
    </div>

    <!-- ══ SLIDE 1: TITLE ══ -->
    <section class="slide" id="slide-1"
        data-notes="Slide Creator: Claude Code 零依赖 HTML 演示文稿生成器,21 种预设样式,三分钟出稿"
        aria-label="Title">
Confidence
70% confidence
Finding
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Hidden Instructions

High
Category
Prompt Injection
Content
</div>
    </div>

    <!-- ═══════════════════════════════════════════════
         SLIDE 1 — Hero 封面
         ═══════════════════════════════════════════════ -->
    <section class="slide" id="slide-1" data-notes="slide-creator 产品自我介绍:一个命令生成精美演示文稿,21 种设计预设,零学习成本。" aria-label="Hero">
Confidence
70% confidence
Finding
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Hidden Instructions

High
Category
Prompt Injection
Content
</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>
Confidence
70% confidence
Finding
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Hidden Instructions

High
Category
Prompt Injection
Content
</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>
Confidence
70% confidence
Finding
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Hidden Instructions

High
Category
Prompt Injection
Content
<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">
Confidence
70% confidence
Finding
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Hidden Instructions

High
Category
Prompt Injection
Content
<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">
Confidence
70% confidence
Finding
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Hidden Instructions

High
Category
Prompt Injection
Content
</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>
Confidence
70% confidence
Finding
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Hidden Instructions

High
Category
Prompt Injection
Content
</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>
Confidence
70% confidence
Finding
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Hidden Instructions

High
Category
Prompt Injection
Content
</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>
Confidence
70% confidence
Finding
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Hidden Instructions

High
Category
Prompt Injection
Content
</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>
Confidence
70% confidence
Finding
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Hidden Instructions

High
Category
Prompt Injection
Content
<div id="stage">
<div id="track">

  <!-- ══════════════════════════════════════════
       01 — COVER
       ══════════════════════════════════════════ -->
  <section class="slide cover" style="overflow:hidden;" data-notes="欢迎!slide-creator 从提示词生成精美的 HTML 演示文稿 — 零依赖,浏览器原生。21 个主题,单文件输出。">
Confidence
70% confidence
Finding
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Hidden Instructions

High
Category
Prompt Injection
Content
<div id="stage">
<div id="track">

  <!-- ══════════════════════════════════════════
       01 — COVER
       ══════════════════════════════════════════ -->
  <section class="slide cover" style="overflow:hidden;" data-notes="欢迎!slide-creator 从提示词生成精美的 HTML 演示文稿 — 零依赖,浏览器原生。21 个主题,单文件输出。">
Confidence
70% confidence
Finding
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Hidden Instructions

High
Category
Prompt Injection
Content
<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">
Confidence
70% confidence
Finding
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Static analysis

Detected: suspicious.dynamic_code_execution, suspicious.insecure_tls_verification

Dynamic code execution detected.

Critical
Code
suspicious.dynamic_code_execution
Location
scripts/run-skill-export.py:107

Dynamic code execution detected.

Critical
Code
suspicious.dynamic_code_execution
Location
scripts/test-export.py:27

HTTPS certificate verification is disabled.

Warn
Code
suspicious.insecure_tls_verification
Location
scripts/export-sandbox-pptx.py:12787