Back to skill

Security audit

Haixian Ppt Skill

Security checks for vulnerabilities and agentic risk

Overview

This is a coherent presentation-building skill, with the main caution that generated decks can load third-party web scripts and fonts.

Install only if you are comfortable with a deck-generation workflow that reads and writes local presentation files and may open generated HTML in a browser. For sensitive decks, remove or vendor remote dependencies, avoid hosting generated decks on an origin with private app data, and prefer offline/local assets for icons, fonts, animations, and maps.

Vulnerability Patterns
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
Findings (2)

T03 · Remote Payload Retrieval and Execution

Warning
Location
assets/template.html:735
Finding

Mutable Remote JavaScript Execution Through Unpinned Lucide Dependency in Style A Template

Content
View full analysis
``` ### Technical Analysis The template loads and executes Lucide from the mutable `@latest` release channel on unpkg. The dependency is neither pinned to an exact version nor protected by a Subresource Integrity hash. Consequently, the code executed by a generated presentation can change after the Skill package has been reviewed. Compromise of the upstream package, package publishing account, CDN delivery path, or mutable release resolution could cause attacker-controlled JavaScript to run when a presentation is opened with network access. This is a remote payload execution channel rather than evidence that the currently served Lucide package is malicious. ### Attack Path 1. An Agent follows the Skill instructions and copies `assets/template.html` into a generated presentation. 2. A user opens the presentation while connected to the network. 3. The browser requests `lucide@latest` from unpkg. 4. An attacker who has compromised the upstream package or delivery channel supplies modified JavaScript. 5. The browser automatically executes that JavaScript in the presentation's page context. 6. The payload can inspect or modify the presentation DOM and access resources available to that browser origin. ### Impact Assessment The attacker would obtain JavaScript execution within the generated presentation's browser context. Potential effects include: - Reading and modifying slide content and same-origin DOM data. - Accessing non-HttpOnly storage available to the presentation origin. - Making attacker-controlled network requests subject to browser security controls. - Replacing presentation controls or displaying deceptive content. ...[truncated 320 chars]
Remediation
View remediation
``` 4. Add a restrictive Content Security Policy that permits scripts only from explicitly trusted sources and avoids `unsafe-eval`. 5. Provide a static or local icon fallback so the presentation remains usable when external resources are unavailable. 6. Update `references/checklist.md` so generated decks are not instructed to retain the mutable `@latest` dependency. ]]>

T03 · Remote Payload Retrieval and Execution

Warning
Location
assets/template-swiss.html:1600
Finding

Mutable Remote JavaScript Execution Through Unpinned Lucide Dependency in Swiss Template

Content
View full analysis
``` ### Technical Analysis The Swiss template executes JavaScript obtained from the mutable `lucide@latest` endpoint. No exact version or Subresource Integrity verification constrains the downloaded response. The effective runtime payload can therefore change independently of this repository. If the upstream package, publisher account, CDN, or delivery path is compromised, generated Swiss presentations can execute code that was never included in or reviewed with the Skill. ### Attack Path 1. An Agent copies `assets/template-swiss.html` to create a presentation. 2. The presentation is opened with network connectivity. 3. The browser retrieves the current `lucide@latest` response from unpkg. 4. A compromised upstream or CDN response supplies malicious JavaScript. 5. The script executes automatically before `lucide.createIcons()` is invoked. 6. The malicious payload operates with the browser privileges of the presentation page. ### Impact Assessment Successful exploitation provides arbitrary JavaScript execution in the presentation context. The payload could: - Alter presentation content, navigation, or controls. - Read DOM data and browser storage available to the origin. - Send accessible information to an external endpoint. - Load additional remote content. - Interact with other same-origin resources when the deck is hosted on a shared application origin. The issue does not directly provide native code or operating-system execution. Its practical scope depends on whether the presentation is opened locally or hosted on an origin containing additional accessible data. ]]>
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (34)

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

声明描述的是一个面向最终用户的“网页PPT生成/模板”技能,核心应体现页面结构生成、PPT模板、两种视觉风格、横向翻页 deck 等功能。而实际代码仅是第三方前端动画库 assets/motion.min.js,本身不生成 PPT、不创建 HTML 页面结构、不实现所述两种设计风格,也没有看到 WebGL 背景、章节页、数据大字报、图片网格等模板逻辑。虽然动画库可作为该类技能的支撑依赖,但这段代码的直接行为与声明的主要用途相距较大,且包含额外的通用滚动/视口/尺寸观察等能力,属于明显的描述与行为不一致。

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

md
1. 先读完 `SKILL.md`(这个文件)了解整体

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
8. 生成后先运行 `node scripts/validate-swiss-deck.mjs path/to/index.html`,再读 `checklist.md` 自检

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
ts.md` / `layouts-swiss.md` 的骨架在 HTML 里加 `data-anim` / `data-animate` 即可。离线演示靠 `assets/motion.min.js`,断网时自动降级为"无动画但内容可读"。风格 B 模板必须保留 `B` 键低功耗模式:切换后停止 WebGL/ASCI

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 · assets/template-swiss.html (reported line 1221)May include surrounding context.

html
<div id="deck">

<!-- ============================================================
     SLIDES 插入区 · 在此处填充所有 <section class="slide ..."> 页面
     页面骨架参考 references/layouts-swiss.md
     主题色配置参考 references/themes-swiss.md

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 · assets/template.html (reported line 481)May include surrounding context.

html
<div id="deck">

<!-- ============================================================
     SLIDES 插入区 · 在此处填充所有 <section class="slide ..."> 页面
     每页模板参考 references/page-patterns.md
     页面组件参考 references/components.md

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 · references/checklist.md (reported line 97)May include surrounding context.

  • split 模式例外:.slide.split .canvas-card{padding:0},两个 .half 自己定 padding:5.6vh 3.6vw 4.4vh
html
<!-- ❌ 错:主体多缩了 5vw,左右对不齐 -->
<div class="canvas-card">
  <div class="chrome-min">...</div>
  <div style="flex:1;padding:5vh 5vw 4vh;...">主体</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 · references/components.md (reported line 29)May include surrounding context.

每一页都是一个 <section class="slide ...">。必须包含 data-theme 属性(light 或 dark),JS 翻页时会根据这个属性切换背景。

html
<section class="slide light" data-theme="light">   <!-- 浅色页 -->
<section class="slide dark" data-theme="dark">     <!-- 深色页 -->
<section class="slide light hero" data-theme="light">  <!-- Hero 页:浅色 + 薄遮罩透出 WebGL -->
<section class="slide dark hero" data-theme="dark">    <!-- 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 · references/components.md (reported line 29)May include surrounding context.

每一页都是一个 <section class="slide ...">。必须包含 data-theme 属性(light 或 dark),JS 翻页时会根据这个属性切换背景。

html
<section class="slide light" data-theme="light">   <!-- 浅色页 -->
<section class="slide dark" data-theme="dark">     <!-- 深色页 -->
<section class="slide light hero" data-theme="light">  <!-- Hero 页:浅色 + 薄遮罩透出 WebGL -->
<section class="slide dark hero" data-theme="dark">    <!-- 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 · references/components.md (reported line 318)May include surrounding context.

html
<i data-lucide="compass" class="ico-lg"></i>     <!-- 大图标(pillar 用) -->
<i data-lucide="target" class="ico-md"></i>      <!-- 中图标(列表项用) -->
<i data-lucide="check-circle" class="ico-sm"></i>  <!-- 小图标(inline 用) -->

常用 Lucide 图标名(按含义分组):

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 · references/components.md (reported line 318)May include surrounding context.

html
<i data-lucide="compass" class="ico-lg"></i>     <!-- 大图标(pillar 用) -->
<i data-lucide="target" class="ico-md"></i>      <!-- 中图标(列表项用) -->
<i data-lucide="check-circle" class="ico-sm"></i>  <!-- 小图标(inline 用) -->

常用 Lucide 图标名(按含义分组):

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 · references/layouts-swiss.md (reported line 101)May include surrounding context.

如果在主体那层再写 padding:5vh 5vw 4vh,水平方向就变成 5vw + 5vw = 10vw,主体比 chrome-min 多内缩一圈,左右对不齐。

html
<!-- ❌ 错:主体多缩了 5vw -->
<div class="canvas-card">
  <div class="chrome-min">...</div>
  <div style="flex:1;padding:5vh 5vw 4vh;...">主体内容</div>

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The trigger phrases are generic enough that normal user requests like 'make me a Swiss-style deck' or 'generate a horizontal swipe deck' could activate the skill unintentionally in agent environments that rely on loose prompt matching. Unintended activation can cause the agent to apply this skill's workflow, file creation, or template logic when the user did not explicitly consent to using this package.

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 root sets lang="zh-CN", which establishes a fixed Simplified Chinese locale for the document. Under the policy, forcing a specific language/locale without user opt-in or a documented region-specific justification is a natural-language policy violation.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The template is presented as a single-file HTML deck, but it depends on external Google Fonts and later external/local JS assets to function as intended. This creates undeclared network and supply-chain dependencies, which can leak user IP/UA data and cause rendering or behavior changes outside the author’s control.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The template loads executable code from external CDNs and falls back to a remote ESM import from jsDelivr without user disclosure. That is a genuine supply-chain risk: whoever controls or tampers with the remote resource can run arbitrary JavaScript in the context of the generated presentation.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

A remote script from unpkg is executed in the page without warning the user. Executing third-party script in a generated artifact increases supply-chain and privacy risk because the script runs with full DOM access and can change over time.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The fallback dynamic import from jsDelivr executes remote module code if the local asset is unavailable, again without user disclosure. This is particularly risky because failure of a local file silently escalates into fetching and running third-party code.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The document title and throughout the checklist prescribe presentation-writing conventions specifically for Chinese text, including explicit Chinese typography rules. This imposes a language/locale expectation without offering the user a choice or documenting that the skill is limited to Chinese-language decks.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The document explicitly states that top titles should default to Chinese, which imposes a language preference as a baseline behavior. The file does not offer a user choice or clearly justify this locale restriction as region-specific, so it conflicts with the language/locale policy requirement.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

This file contains user-facing operational instructions exclusively in Chinese, and nowhere indicates that the user can choose another language or locale. That creates a natural-language policy concern because it effectively forces a specific language without documented opt-in or justification.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The instruction requires that the top title be a Chinese title by default, which imposes a language/locale constraint in the skill guidance. The file does not indicate user opt-in, a language choice mechanism, or a clearly documented regional/compliance justification for forcing Chinese.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

This skill file contains all user-facing instructions in Chinese and does not indicate that the language is optional, user-selectable, or limited to a China-specific workflow. Under the stated policy, forcing a specific language without user opt-in is a natural-language policy violation.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

Line L161 instructs the agent to tell the user a fixed Chinese phrase after theme selection. This imposes a specific language on user-facing communication without indicating that the user can choose another language, which fits the locale/language policy violation criteria.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
78% confidence
Finding

The README states that the skill works in environments with filesystem access and shell execution, but it does not clearly warn users that the agent may create, modify, or validate local files as part of its workflow. In agentic environments, lack of disclosure increases the chance that users will unknowingly permit local changes or command execution they did not expect.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.