Back to skill

Security audit

gpt-image2-ppt

Security checks for vulnerabilities and agentic risk

Overview

The skill appears to do what it claims, but its install/update and image-download paths create enough credential, dependency, and network-boundary risk to require Review before use.

Install only if you are comfortable sending slide text, templates, and reference images to the configured model endpoints. Prefer trusted provider URLs, use a dedicated virtual environment or pinned dependencies, avoid the optional `codex` backend unless you accept a child full-auto agent, and do not keep API keys in a skill `.env` when updating because the installer temporarily backs it up under `/tmp`.

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/image_generator.py:110
Finding

Unrestricted retrieval of server-provided image URLs enables SSRF

Content
View full analysis
None: # Security note: only accept HTTP/HTTPS; print the host before downloading; # enforce a maximum 50 MB size limit. from urllib.parse import urlparse parsed = urlparse(url) if parsed.scheme not in ("http", "https"): raise ValueError(f"Refusing to download a non-HTTP(S) URL: {parsed.scheme}") print(f"Downloading image host={parsed.netloc} path={parsed.path[:80]}") resp = requests.get(url, stream=True, timeout=REQUEST_TIMEOUT_SECS) resp.raise_for_status() ctype = resp.headers.get("content-type", "") if ctype and not ctype.startswith("image/"): print(f"Non-image Content-Type: {ctype} (still attempting to write it)") MAX_BYTES = 50 * 1024 * 1024 written = 0 with open(output_path, "wb") as f: for chunk in resp.iter_content(chunk_size=8192): written += len(chunk) if written > MAX_BYTES: f.close() os.remove(output_path) raise ValueError( f"Download exceeded the {MAX_BYTES}-byte limit and was discarded: {url[:80]}" ) f.write(chunk) ``` ### Technical Analysis The image generator accepts image URLs extracted from a remote image-generation response. It verifies only that the URL uses the `http` or `https` scheme. It does not reject destinations resolving to loopback, private, link-local, reserved, multicast, or cloud metadata addresses. The `requests` library follows redirects by default for GET requests. Consequently, validating only the initial URL would remain insufficient even if the initial hostname appeared trustworthy: an external endpoint could redirect the request to an int ...[truncated 1719 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
requirements.txt:1
Finding

Mutable dependencies and automatic runtime package installation create supply-chain exposure

Content
View full analysis
=2.31 python-dotenv>=1.0 python-pptx>=1.0 jsonschema>=4.0 pymupdf>=1.24 pillow>=10.0 openai>=1.83,<2 ``` `install_as_skill.sh`: ```bash print_info "Installing Python dependencies..." if command_exists pip3; then pip3 install -q -r "$SKILL_DIR/requirements.txt" else pip install -q -r "$SKILL_DIR/requirements.txt" fi print_success "Dependency installation completed" ``` `scripts/render_template.py`: ```python except ImportError: print("pywin32 is not installed; installing it automatically...") result = subprocess.run( [sys.executable, "-m", "pip", "install", "pywin32"], check=False, capture_output=True, text=True, ) if result.returncode != 0: print("pywin32 installation failed; falling back to LibreOffice") return None ``` ### Technical Analysis All declared dependencies use open-ended minimum-version constraints, except for an upper bound on the major OpenAI package version. No lock file, exact version set, or package hashes are supplied. Therefore, the effective code installed by the Skill can change after the Skill itself has been reviewed. The installer invokes whichever `pip3` or `pip` executable is available and does not create or require a dedicated virtual environment. Packages may consequently be installed into the user's active environment, where they can affect unrelated projects or agent tooling. On Windows, the rendering path automatically invokes pip to install `pywin32` at runtime. This package is not pinned and the installation occurs as a side effect of attempting to render a presentation, without a separate approval step. No evidence establi ...[truncated 1620 chars]
Remediation
View remediation
Vulnerability Patterns
  • 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
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Taint TrackingDirect Taint Flow, Variable-Mediated Taint Flow, Credential Exfiltration Chain
Findings (196)

Tainted flow: 'VISION_TIMEOUT_SECS' from os.getenv (line 29, credential/environment) → requests.post (network output)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Content

Scanner excerpt · scripts/template_analyzer.py (reported line 241)May include surrounding context.

python
last_err: Optional[Exception] = None
        for attempt in range(1, VISION_MAX_RETRIES + 1):
            try:
                resp = requests.post(
                    self.endpoint, headers=headers, json=payload, timeout=VISION_TIMEOUT_SECS
                )
                if resp.status_code != 200:

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

This finding highlights an undeclared network-related behavior: downloading arbitrary image URLs returned by a model. If accurate, that exposes the agent to SSRF-like access paths, retrieval of untrusted content, and unexpected outbound requests not implied by the skill's description, which is especially sensitive in automated agent environments.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

This finding highlights an undeclared network-related behavior: downloading arbitrary image URLs returned by a model. If accurate, that exposes the agent to SSRF-like access paths, retrieval of untrusted content, and unexpected outbound requests not implied by the skill's description, which is especially sensitive in automated agent environments.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

This finding highlights an undeclared network-related behavior: downloading arbitrary image URLs returned by a model. If accurate, that exposes the agent to SSRF-like access paths, retrieval of untrusted content, and unexpected outbound requests not implied by the skill's description, which is especially sensitive in automated agent environments.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

This finding highlights an undeclared network-related behavior: downloading arbitrary image URLs returned by a model. If accurate, that exposes the agent to SSRF-like access paths, retrieval of untrusted content, and unexpected outbound requests not implied by the skill's description, which is especially sensitive in automated agent environments.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

This finding highlights an undeclared network-related behavior: downloading arbitrary image URLs returned by a model. If accurate, that exposes the agent to SSRF-like access paths, retrieval of untrusted content, and unexpected outbound requests not implied by the skill's description, which is especially sensitive in automated agent environments.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

This finding highlights an undeclared network-related behavior: downloading arbitrary image URLs returned by a model. If accurate, that exposes the agent to SSRF-like access paths, retrieval of untrusted content, and unexpected outbound requests not implied by the skill's description, which is especially sensitive in automated agent environments.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
93% confidence
Finding

This finding highlights an undeclared network-related behavior: downloading arbitrary image URLs returned by a model. If accurate, that exposes the agent to SSRF-like access paths, retrieval of untrusted content, and unexpected outbound requests not implied by the skill's description, which is especially sensitive in automated agent environments.

Content

No source excerpt is available for this finding.

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
81% confidence
Finding

The documented use of a non-interactive package-manager flag (--noconfirm) lowers safeguards around software installation. In an agent context, normalizing non-interactive installs can lead to unreviewed dependency changes or silent execution of risky commands if later embedded into automated flows.

Content

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

md
| macOS | `brew install --cask libreoffice` |
| Linux (Debian/Ubuntu) | `sudo apt-get install -y libreoffice` |
| Linux (Fedora/RHEL) | `sudo dnf install -y libreoffice` |
| Linux (Arch) | `sudo pacman -S --noconfirm libreoffice-fresh` |

装完再次检查,确认存在可用渲染后端再继续后续流程。

Agent Config Directory Access

High
Category
Agent Snooping
Confidence
91% confidence
Finding

The skill instructs use of agent configuration paths such as ~/.claude/settings.json and project .claude settings for environment injection. Accessing or modifying agent config directories is sensitive because those files can contain secrets, trust settings, and execution policies beyond the presentation task, increasing risk of credential exposure or persistent configuration tampering.

Content

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

md
不要把本 skill 的密钥写进调用者业务项目根目录的 `.env`,也不要为了出图去读取用户项目里的通用 `.env`。环境变量建议按 agent 框架的标准方式注入:

- **通用 / CI / 服务器**:用系统环境变量、Docker Compose `environment` / `env_file`、Kubernetes Secret、CI Secret 等注入。
- **Claude Code**:用用户级 `~/.claude/settings.json` 或项目级 `.claude/settings.local.json` 注入环境变量;命令行环境变量优先级最高。
- **OpenClaw / 自定义 Agent**:用框架配置里的 `apiKey` / env reference 引用系统环境变量,避免把 key 明文写进项目配置。
- **本地 standalone CLI fallback**:可以设置 `GPT_IMAGE2_PPT_ENV=/path/to/private.env`,或使用 skill 安装目录下的 `.env`;这只是备用方式,不是业务项目 `.env`。

Natural-Language Policy Violations

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The skill forces Simplified Chinese output and font constraints regardless of user intent. In a presentation-generation skill, hardcoded language transformation can silently alter user content, misrepresent material, or corrupt safety-critical text such as legal, medical, financial, or brand-specific wording.

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

md
- 文字和独立图片对象必须从 `clean-plate.png` 中移除;移动对象后不能露出第二份相同对象。

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
|---- docs/README.en.md # 英文 README

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · agents/openclaw.yaml (reported line 8)May include surrounding context.

yaml
# Trust surface (what the user agrees to when installing this skill):
#   - Reads process env, platform-injected env, explicit GPT_IMAGE2_PPT_ENV,
#     and skill-owned .env fallback only; never walks parent project directories.
#   - Hits exactly the OPENAI_BASE_URL endpoint you set, plus optional
#     VISION_BASE_URL endpoint you set (only when the caller agent is text-only).
#   - Downloads images returned by the model API; URLs are printed before

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/generate_ppt.py (reported line 76)May include surrounding context.

python
# Trust surface (what the user agrees to when installing this skill):
#   - Reads process env, platform-injected env, explicit GPT_IMAGE2_PPT_ENV,
#     and skill-owned .env fallback only; never walks parent project directories.
#   - Hits exactly the OPENAI_BASE_URL endpoint you set, plus optional
#     VISION_BASE_URL endpoint you set (only when the caller agent is text-only).
#   - Downloads images returned by the model API; URLs are printed before

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/generate_ppt.py (reported line 78)May include surrounding context.

python
# Trust surface (what the user agrees to when installing this skill):
#   - Reads process env, platform-injected env, explicit GPT_IMAGE2_PPT_ENV,
#     and skill-owned .env fallback only; never walks parent project directories.
#   - Hits exactly the OPENAI_BASE_URL endpoint you set, plus optional
#     VISION_BASE_URL endpoint you set (only when the caller agent is text-only).
#   - Downloads images returned by the model API; URLs are printed before

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/generate_ppt.py (reported line 113)May include surrounding context.

python
# Trust surface (what the user agrees to when installing this skill):
#   - Reads process env, platform-injected env, explicit GPT_IMAGE2_PPT_ENV,
#     and skill-owned .env fallback only; never walks parent project directories.
#   - Hits exactly the OPENAI_BASE_URL endpoint you set, plus optional
#     VISION_BASE_URL endpoint you set (only when the caller agent is text-only).
#   - Downloads images returned by the model API; URLs are printed before

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/template_analyzer.py (reported line 895)May include surrounding context.

python
# Trust surface (what the user agrees to when installing this skill):
#   - Reads process env, platform-injected env, explicit GPT_IMAGE2_PPT_ENV,
#     and skill-owned .env fallback only; never walks parent project directories.
#   - Hits exactly the OPENAI_BASE_URL endpoint you set, plus optional
#     VISION_BASE_URL endpoint you set (only when the caller agent is text-only).
#   - Downloads images returned by the model API; URLs are printed before

Agent Config Directory Access

High
Category
Agent Snooping
Confidence
90% confidence
Finding

Skill reads from agent configuration directories (.claude/, .codex/, .gemini/). These directories may contain API keys, personal settings, and other credentials that the skill has no legitimate need to access.

Content

Scanner excerpt · README.md (reported line 192)May include surrounding context.

md
If you use direct API mode, inject environment variables through your agent
framework instead of writing secrets into the caller project's root `.env`:

- Claude Code: user-level `~/.claude/settings.json`, or project-level `.claude/settings.local.json`
- OpenClaw / custom agents: reference system env vars from `apiKey` / env config
- CI / servers: system env vars, Docker Compose, Kubernetes Secrets, or CI Secrets
- Standalone CLI: set `GPT_IMAGE2_PPT_ENV=/path/to/private.env`, or use the skill install directory `.env` as a fallback

Agent Config Directory Access

High
Category
Agent Snooping
Confidence
90% confidence
Finding

Skill reads from agent configuration directories (.claude/, .codex/, .gemini/). These directories may contain API keys, personal settings, and other credentials that the skill has no legitimate need to access.

Content

Scanner excerpt · docs/README.en.md (reported line 191)May include surrounding context.

md
If you use direct API mode, inject environment variables through your agent
framework instead of writing secrets into the caller project's root `.env`:

- Claude Code: user-level `~/.claude/settings.json`, or project-level `.claude/settings.local.json`
- OpenClaw / custom agents: reference system env vars from `apiKey` / env config
- CI / servers: system env vars, Docker Compose, Kubernetes Secrets, or CI Secrets
- Standalone CLI: set `GPT_IMAGE2_PPT_ENV=/path/to/private.env`, or use the skill install directory `.env` as a fallback

Agent Config Directory Access

High
Category
Agent Snooping
Confidence
90% confidence
Finding

The instructions direct the agent to modify sensitive agent configuration locations such as ~/.claude/settings.json to inject API credentials. A skill that encourages automated writes to user-level config can expose secrets, alter trusted agent behavior, or persist changes outside the project boundary, which is especially risky because the document is explicitly written for autonomous agent execution.

Content

Scanner excerpt · docs/install.md (reported line 56)May include surrounding context.

md
优先通过当前 agent 框架或运行环境注入,不要写进调用者业务项目根目录 `.env`:

- Claude Code:用户级 `~/.claude/settings.json`,或项目级 `.claude/settings.local.json`
- OpenClaw / 自定义 Agent:用 `apiKey` / env reference 引用系统环境变量,避免明文写进项目配置
- CI / 服务器:用系统环境变量、Docker Compose、Kubernetes Secret 或 CI Secret
- standalone CLI fallback:设置 `GPT_IMAGE2_PPT_ENV=/path/to/private.env`,或使用 skill 安装目录下的 `.env`

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
90% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · docs/install.md (reported line 88)May include surrounding context.

5.(可选)清理临时目录

bash
rm -rf /tmp/gpt-image2-ppt-skills

冒烟测试(用户重启 agent 后)

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
90% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · docs/install.md (reported line 88)May include surrounding context.

5.(可选)清理临时目录

bash
rm -rf /tmp/gpt-image2-ppt-skills

冒烟测试(用户重启 agent 后)

Ae3

High
Category
analysis-evasion
Confidence
90% confidence
Finding

Text artifact contains embedded NUL bytes

Content

No source excerpt is available for this finding.

Concealed Executable Artifact

High
Category
Supply Chain
Confidence
100% confidence
Finding

An executable nested in a document or hidden/disguised artifact can evade ordinary extension-based review while still being available to the skill at runtime.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.