Back to skill

Security audit

Interior Design PPT Generator

Security checks for vulnerabilities and agentic risk

Overview

This is a local PPT generator, but it embeds the publisher's branding into client-facing slides without a clear opt-out.

Review generated decks before sending them to clients. The script appears local and does not access credentials or the network, but it inserts the publisher's organization and an individual name into the presentation and offers no command-line option to remove or replace that branding.

Vulnerability Patterns
  • 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
  • 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 (1)

other

Error
Location
generate_ppt.py:124
Finding

Undisclosed Hardcoded Promotional Branding in Customer Deliverables

Content
View full analysis

Vulnerability Details

File Location: generate_ppt.py:124-131, generate_ppt.py:185-188, and generate_ppt.py:522-526
Vulnerability Type: Undisclosed output manipulation and promotional branding
Risk Level: High

Evidence

The following function places the skill author's brand in slide corners:

python
def add_brand_corner(slide, name="温州隐室空间设计"):
    """左上角品牌角标"""
    tb = slide.shapes.add_textbox(Inches(0.4), Inches(0.35), Inches(3), Inches(0.3))
    tf = tb.text_frame
    p = tf.paragraphs[0]
    r = p.add_run()
    apply_font(r, FONT_CN, Pt(8), False, C['muted'])
    r.text = name

The cover includes another hardcoded reference to the author's organization:

python
add_textbox(slide, "温州隐室空间设计",
            Inches(1), Inches(7.8), Inches(14), Inches(0.4),
            font=FONT_CN, size=Pt(11), bold=False,
            color=C['muted'], align=PP_ALIGN.CENTER)

The closing slide contains both the organization and an individual identifier:

python
add_textbox(slide, "温州隐室空间设计  |  老冷",
           Inches(1), Inches(6.4), Inches(14), Inches(0.4),
           font=FONT_CN, size=Pt(13), bold=False,
           color=C['muted'], align=PP_ALIGN.CENTER)

Technical Analysis

The program is presented as a tool for generating client-ready interior-design presentations from user-supplied images. Although users can configure the project name, style, area, input directory, and output path, the command-line interface provides no option to configure or disable the embedded branding.

The author identity is inserted through three independent mechanisms:

  1. add_brand_corner() uses the author's organization as its default label and is invoked on multiple generated slides.
  2. slide_cover() directly embeds the same organization on the cover.
  3. slide_closing() directly embeds the organization and an individual identifier on the closing slide.

Because these va ...[truncated 2044 chars]

Remediation
View remediation

Remediation Suggestions

  1. Remove all hardcoded organization and individual names from slide_cover(), slide_closing(), and the default arguments of add_brand_corner().

  2. Make branding explicitly configurable, for example:

    python
    def add_brand_corner(slide, name=None):
        if not name:
            return
        # Add the configured brand label.
    
  3. Add an optional command-line parameter such as --brand-name, with branding disabled by default.

  4. Require explicit opt-in before inserting any author-controlled attribution or promotional material.

  5. Clearly document every location in which configured branding will appear, including the cover, slide corners, and closing slide.

  6. Separate template attribution from presentation content. If attribution is required by licensing terms, disclose that requirement prominently before execution rather than silently embedding it.

  7. Add automated tests that generate a presentation without branding options and verify that no author organization, individual name, or other unexpected promotional text appears.

  8. Review all presentation text constants before release to ensure generated client deliverables contain only user-provided content or clearly documented neutral template text.

Vulnerability Patterns
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (6)

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

该描述与代码大方向相关,都是为室内设计方案自动生成汇报PPT;代码也确实从文件夹读取图片并生成PPT,所以不是完全无关。但描述强调的是“设计师把效果图放到文件夹里,一键自动生成交付PPT,每页一张图,自动加标题排版”。实际代码的核心行为更像“基于固定模板生成一套品牌化设计方案汇报PPT”,其中只有部分页面是图片页,其余包含硬编码的任务回顾、设计概念、材质说明和封底等固定内容。尤其材质板并不从输入图片或外部数据生成,而是内置内容。这属于对实际功能范围和输出结构的明显简化,存在实质性描述偏差。未发现越权访问、网络通信或其他安全相关的隐藏能力。

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
70% confidence
Finding

Without declared permissions the skill's intent is opaque and cannot be validated.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The manifest description and title are entirely in Chinese, and the skill presents itself as generating client-facing PPT deliverables with no indication that language is configurable or limited to a China-specific workflow. This can violate language/locale policy because it implicitly constrains output and usage to a specific language without user opt-in or justification.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The manifest describes a simple workflow where designers place renderings in a folder and the skill produces a delivery PPT with one image per page and automatic titles/layout. In practice, the program builds a fixed presentation structure including cover, chapter, text concept pages, a material board, and a closing slide, and assigns page titles from DEFAULT_SPACES rather than from image metadata or filenames.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
97% confidence
Finding

The section comment and surrounding code imply the first image should be used for the cover, and line L575 prepares that path. However, slide_cover is called without the image_path argument, so the generated cover does not actually use the first image as documented by the nearby intent.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
86% confidence
Finding

The skill name, description, author/org name, and keywords are all presented only in Chinese. This may violate a language/locale policy if skills are expected to avoid forcing a specific language without offering the user a choice or documenting the locale constraint.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.