Back to skill

Security audit

Gpt Image2 Ppt Skills

Security checks for vulnerabilities and agentic risk

Overview

The skill is mostly a real PPT-generation tool, but it needs review because an optional backend delegates untrusted slide text to a full-auto Codex subprocess and a legacy script contradicts the stated credential scoping.

Install only if you are comfortable with the optional Codex backend's broad local authority, or avoid it entirely and use the default direct API/native image path. Prefer a scoped `.env`, review `OPENAI_BASE_URL` and `VISION_BASE_URL` before use, do not run the legacy root `generate_ppt.py`, and consider installing dependencies in a virtual environment.

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 (4)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/codex_backend.py:105
Finding
Untrusted slide content is delegated to an autonomous full-access Codex agent<![CDATA[ ## Vulnerability Details **File Location**: `scripts/codex_backend.py:105-128` **Related Configuration**: `scripts/codex_backend.py:27` **Vulnerability Type**: Indirect prompt injection through an autonomous subprocess **Risk Level**: High ### Vulnerable Code ```python DEFAULT_CODEX_CMD = "codex exec --full-auto" ``` ```python return ( # Other instruction fields are assembled above. f"{prompt}\n" f"-----END PROMPT-----\n" ) ``` ```python instruction = self._build_instruction(prompt, output_path, reference_image_path) argv = shlex.split(self.codex_cmd) + [instruction] print(f"Dispatching scene {scene_index} to codex ({len(instruction)} chars)") try: result = subprocess.run( argv, capture_output=True, text=True, timeout=self.timeout, check=False, ) except subprocess.TimeoutExpired as e: raise RuntimeError(f"codex execution timed out after {self.timeout}s: {e}") from e ``` ### Technical Analysis Slide content from the user-controlled presentation plan is incorporated into `prompt`, embedded verbatim in a natural-language instruction, and sent to `codex exec --full-auto`. Text delimiters such as `BEGIN PROMPT` and `END PROMPT` do not create an enforceable security boundary for a language model. Malicious content can instruct the nested Codex agent to disregard the surrounding image-generation request and instead use its available tools to read files, modify the workspace, execute commands, or perform network operations. The direct use of `subprocess.run()` is not conventional shell injection because the process is invoked through an argument array. The vulnerability instead arises because untrusted data is supplied as instructions to an autonomous tool-using agent operating in full-auto mode. This behavior exceeds the minimum privileges required to generate a slide image. Image generation should not require granting a second autonomous agent broad access to the caller's filesyste ...[truncated 1530 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove the autonomous Codex relay and use a dedicated image-generation API or constrained image-generation tool. 2. If the backend must remain available: - Do not invoke Codex with `--full-auto`. - Require explicit user confirmation before each delegated invocation. - Run Codex in a sandbox with no access to unrelated files. - Restrict writable paths to a newly created output directory. - Disable shell, filesystem-reading, package-management, and unrelated network tools. - Apply outbound network restrictions so only the required image endpoint is reachable. 3. Treat all plan content, template-derived text, and style text as untrusted data. 4. Pass presentation data through a structured interface rather than concatenating it into an agent instruction. 5. Clearly document that the Codex backend delegates content to another autonomous agent and may expose local resources. 6. Add adversarial tests containing prompt-injection instructions and verify that they cannot trigger filesystem, shell, or network actions. ]]>

T09 · Insecure Skill Coding Practices

Error
Location
generate_ppt.py:44
Finding
Legacy entry point performs implicit parent-directory credential loading<![CDATA[ ## Vulnerability Details **File Location**: `generate_ppt.py:44-63` **Vulnerability Type**: Unscoped environment-file discovery and configuration override **Risk Level**: High ### Vulnerable Code ```python def find_and_load_env() -> bool: """ Find and load .env file from multiple locations. Search priority: 1. Current script directory 2. Parent directories up to project root 3. video_workflow project .env """ search_paths = [ Path(__file__).parent / ".env", Path.home() / ".claude" / "skills" / "gpt-image2-ppt-skills" / ".env", ] for env_path in search_paths: if env_path.exists(): load_dotenv(env_path, override=True) print(f"Loaded environment from: {env_path}") return True load_dotenv(override=True) print("Warning: No .env file found, using system environment variables") return False ``` ### Technical Analysis The final call to `load_dotenv(override=True)` does not receive an explicit path. Python Dotenv may search the current execution context and parent directories for a `.env` file. Values loaded from that file override existing process environment variables. This conflicts with the project's documented security assurance that credentials are loaded only from explicitly scoped Skill locations. The safer implementation in `scripts/generate_ppt.py` avoids this fallback, but the vulnerable root-level `generate_ppt.py` remains executable and may be selected accidentally. The loaded variables include `OPENAI_API_KEY` and `OPENAI_BASE_URL`. Consequently, an unrelated or attacker-controlled `.env` file can redirect presentation content and authorization headers to an unintended server. ### Attack Path 1. A user runs the root-level `generate_ppt.py` from a project directory. 2. No `.env` file exists at either explicitly checked location. 3. The script calls `load_dotenv(override=True)` without an explicit path. 4. Python Dotenv discov ...[truncated 855 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove the obsolete root-level `generate_ppt.py` or replace it with a minimal wrapper that imports the maintained implementation from `scripts/generate_ppt.py`. 2. Eliminate the pathless call to `load_dotenv()`. 3. Load environment files only from explicitly enumerated Skill-owned paths or from a user-specified `GPT_IMAGE2_PPT_ENV` path. 4. Default to `override=False`; only override existing process variables when the user explicitly requests it. 5. Validate `OPENAI_BASE_URL` before transmitting content: - Require HTTPS except for explicitly approved local development endpoints. - Display the destination host and request confirmation for non-OpenAI relays. - Consider an endpoint allowlist for managed deployments. 6. Add regression tests that run from directories containing unrelated parent `.env` files and verify that those files are never loaded. 7. Update documentation to identify one authoritative executable and prevent users or agents from invoking the legacy entry point. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
install_as_skill.sh:122
Finding
Installer copies API credentials through a predictable shared temporary path<![CDATA[ ## Vulnerability Details **File Location**: `install_as_skill.sh:122-152` **Vulnerability Type**: Unsafe temporary file handling for plaintext credentials **Risk Level**: Medium ### Vulnerable Code ```bash # Back up the user's environment file. if [ -f "$SKILL_DIR/.env" ]; then cp "$SKILL_DIR/.env" "/tmp/gpt-image2-ppt.env.bak" print_info "Existing environment file backed up" fi rm -rf "$SKILL_DIR" ``` ```bash # Restore the environment-file backup. if [ -f "/tmp/gpt-image2-ppt.env.bak" ]; then mv "/tmp/gpt-image2-ppt.env.bak" "$SKILL_DIR/.env" print_success "Existing environment file restored" fi ``` ### Technical Analysis The installer temporarily copies `.env`, which is expected to contain `OPENAI_API_KEY`, to the fixed path `/tmp/gpt-image2-ppt.env.bak`. A fixed filename in a shared temporary directory creates race and file-substitution risks. The script does not: - Create the file exclusively. - Verify that the destination is a regular file. - Verify ownership. - reject symbolic links. - Explicitly enforce restrictive permissions. - Use a cleanup trap for interrupted installations. On systems where `/tmp` is shared between users, another local process may pre-create, replace, monitor, or race this pathname. Concurrent installations can also overwrite each other's backups. An attacker-controlled backup may subsequently be moved into the Skill directory and loaded as trusted configuration. ### Attack Path 1. A local attacker predicts the fixed path `/tmp/gpt-image2-ppt.env.bak`. 2. The attacker pre-creates or races that path, or runs a process that monitors its creation. 3. The installer copies the existing credential-bearing `.env` through the shared path. 4. Depending on operating-system protections and timing, the attacker obtains the backup or causes it to be redirected or replaced. 5. The installer moves the temporary file back to `$SKILL_DIR/.env`. 6. If the file was replaced, attacker-controlled endpoint and credent ...[truncated 611 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Avoid copying the secret file through `/tmp`; preserve `.env` in place while replacing only non-secret Skill files. 2. If temporary storage is unavoidable: - Create a private directory with `mktemp -d`. - Set `umask 077` before creating any backup. - Ensure backup files have mode `0600`. - Verify that files are regular files owned by the invoking user. - Reject symbolic links. 3. Register a trap that securely removes the temporary directory on normal exit, errors, and signals. 4. Keep the temporary directory on the same filesystem when possible and restore the file with an atomic rename. 5. Abort rather than restoring a backup whose ownership, type, or permissions do not match expectations. 6. Add tests for concurrent installations, interrupted installations, and pre-existing malicious temporary paths. ]]>

T08 · Insecure Dependencies

Warning
Location
requirements.txt:1
Finding
Installer executes dependencies selected by unbounded version ranges<![CDATA[ ## Vulnerability Details **File Location**: `requirements.txt:1-5` **Related Execution Location**: `install_as_skill.sh:161-167` **Vulnerability Type**: Unpinned executable third-party dependencies **Risk Level**: Medium ### Vulnerable Code ```text requests>=2.31 python-dotenv>=1.0 python-pptx>=1.0 jsonschema>=4.0 pymupdf>=1.24 ``` ```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 "Dependencies installed" ``` ### Technical Analysis All dependencies use lower-bound-only version constraints. The installer resolves and installs whichever future versions satisfy those constraints at installation time. There is no lock file, upper bound, package hash verification, or isolated virtual environment. The listed package names are recognizable, and the audit found no evidence of typosquatting or an intentionally malicious package. The risk is that future package releases, package-index compromise, dependency-account compromise, or incompatible transitive dependencies can change the code executed during installation without changing this repository. Python package installation may execute build backends and other installation-time logic with the permissions of the user running the installer. ### Attack Path 1. A dependency account, distribution artifact, package index, or transitive dependency is compromised, or an unsafe future version is published. 2. A user runs `install_as_skill.sh`. 3. Pip resolves the newest package versions satisfying the broad `>=` constraints. 4. The selected package or build backend executes during installation. 5. Malicious or incompatible code runs under the installing user's permissions. 6. The installed package may also affect subsequent Skill runs. ### Impact Assessment A compromised dependency may obtain the permissions of the user executing the installer, po ...[truncated 452 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Pin every direct dependency to a reviewed exact version. 2. Generate and publish a lock file containing resolved transitive dependencies. 3. Use hash verification, such as pip's `--require-hashes`. 4. Install dependencies into a dedicated virtual environment rather than the user's global Python environment. 5. Review dependency updates before changing pinned versions. 6. Use automated vulnerability and provenance scanning for both direct and transitive dependencies. 7. Configure pip to use a trusted package index and reject unexpected alternate sources. 8. Consider publishing a reproducible package or container with immutable dependency versions. ]]>
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (112)

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
The code’s core purpose generally aligns with image-based PPT slide generation and HTML viewer creation, so it is not unrelated or malicious. However, the declared description overstates important capabilities that are absent from the supplied code chunk. Specifically, there is no generation of a PowerPoint .pptx file, no parsing or imitation of a user-supplied .pptx template, and no built-in implementation of the named 10 curated styles beyond loading a provided style text file. Because these are user-visible primary capabilities rather than minor implementation details, this is a material description-behavior mismatch.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The declared purpose focuses on end-user functionality: creating visually styled PPT slides and cloned-template presentations. The actual code shown does not generate slides, call gpt-image-2, create PPTX/HTML output, or implement presentation styles. Instead, it performs setup and deployment tasks for the skill itself. Those behaviors are materially different from the declared primary purpose and include filesystem modification and dependency installation that are not reflected in the description. While installation can support the overall project, this code chunk’s actual function is installer/configuration logic, not PPT generation.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
The declared description presents a complete presentation-generation skill: style selection, template cloning from .pptx, and final outputs including an HTML viewer and a 16:9 PPTX. The actual code chunk is much narrower: it is a helper backend that shells out to `codex exec` to generate one slide image PNG based on an image prompt, with optional reference image guidance. While this could be a supporting component of a larger PPT-generation system, the supplied code itself does not perform the primary advertised functions. Therefore the description materially overstates what this code chunk actually does.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding
The declared description is for a full presentation-generation skill: styled PPT slide creation, template-clone mode for .pptx inputs, and exporting both HTML viewer and .pptx. The supplied code chunk does not do those things. It is narrowly focused on generating and saving one image from a prompt via OpenAI-compatible endpoints, optionally using a reference image for visual style guidance. While this could be a supporting component of a larger PPT generator, on its own it materially under-delivers relative to the declared primary purpose. There are no obvious unrelated malicious capabilities, but the implementation shown is only an image-generation module, not a PowerPoint generation pipeline.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The declared description promises a full presentation-generation capability centered on styled slide rendering, image generation, template mimicry, and production of final deliverables like HTML and .pptx files. The actual code shown does none of that. It only reads a markdown slide plan, parses frontmatter and slide headings, assigns page/layout metadata, and emits a JSON plan file. This is a supporting preprocessing utility at most, not the described end-user PPT generation system. Therefore the description does not accurately represent the behavior of this code chunk.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding
The declared description presents a full presentation-generation skill centered on gpt-image-2 image synthesis and stylized PPT creation. The supplied code chunk instead performs a narrow preprocessing/rendering task: taking an existing PPTX file, converting it to PDF, and rasterizing each page to PNG images. While this could support a template-clone pipeline, the chunk itself does not generate slides, mimic templates in output decks, invoke any OpenAI model, or create HTML/PPT deliverables described in the declaration. Therefore the actual behavior is materially different from the declared primary purpose.

Credential Access

High
Category
Privilege Escalation
Content
bash install_as_skill.sh --target claude   # Claude Code
# 或
bash install_as_skill.sh --target codex    # Codex
# 仅当你走 API 直连模式时,再编辑对应目录下的 .env 填入 API_KEY
```

## 必需的环境变量
Confidence
83% confidence
Finding
The skill explicitly instructs users to place API keys in .env files and describes runtime loading of credentials from several skill-related filesystem locations. In a skill that also uses shell, file access, and network operations, handling secrets this way increases the risk of accidental disclosure, misuse by downstream scripts, or unintended transmission to external endpoints if execution is not tightly bounded.

Natural-Language Policy Violations

High
Confidence
98% confidence
Finding
The skill instructs that all text 'must' be in Simplified Chinese and explicitly forbids English except proper nouns. This is a language-policy constraint imposed by default, with no user choice or opt-in, which is a natural-language policy violation.

Credential Access

High
Category
Privilege Escalation
Content
default_prompt: "Make me a 5-slide deck about [topic] using gpt-image2-ppt; pick a fitting style from styles/."

# Trust surface (what the user agrees to when installing this skill):
#   - Reads scoped .env files only (skill dir, ~/.claude/skills/.../, ~/skills/.../)
#     and never walks parent project directories.
#   - Hits exactly the OPENAI_BASE_URL endpoint you set, plus optional
#     VISION_BASE_URL endpoint you set (template-clone mode only).
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
default_prompt: "Make me a 5-slide deck about [topic] using gpt-image2-ppt; pick a fitting style from styles/."

# Trust surface (what the user agrees to when installing this skill):
#   - Reads scoped .env files only (skill dir, ~/.claude/skills/.../, ~/skills/.../)
#     and never walks parent project directories.
#   - Hits exactly the OPENAI_BASE_URL endpoint you set, plus optional
#     VISION_BASE_URL endpoint you set (template-clone mode only).
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
default_prompt: "Make me a 5-slide deck about [topic] using gpt-image2-ppt; pick a fitting style from styles/."

# Trust surface (what the user agrees to when installing this skill):
#   - Reads scoped .env files only (skill dir, ~/.claude/skills/.../, ~/skills/.../)
#     and never walks parent project directories.
#   - Hits exactly the OPENAI_BASE_URL endpoint you set, plus optional
#     VISION_BASE_URL endpoint you set (template-clone mode only).
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
default_prompt: "Make me a 5-slide deck about [topic] using gpt-image2-ppt; pick a fitting style from styles/."

# Trust surface (what the user agrees to when installing this skill):
#   - Reads scoped .env files only (skill dir, ~/.claude/skills/.../, ~/skills/.../)
#     and never walks parent project directories.
#   - Hits exactly the OPENAI_BASE_URL endpoint you set, plus optional
#     VISION_BASE_URL endpoint you set (template-clone mode only).
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
default_prompt: "Make me a 5-slide deck about [topic] using gpt-image2-ppt; pick a fitting style from styles/."

# Trust surface (what the user agrees to when installing this skill):
#   - Reads scoped .env files only (skill dir, ~/.claude/skills/.../, ~/skills/.../)
#     and never walks parent project directories.
#   - Hits exactly the OPENAI_BASE_URL endpoint you set, plus optional
#     VISION_BASE_URL endpoint you set (template-clone mode only).
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
default_prompt: "Make me a 5-slide deck about [topic] using gpt-image2-ppt; pick a fitting style from styles/."

# Trust surface (what the user agrees to when installing this skill):
#   - Reads scoped .env files only (skill dir, ~/.claude/skills/.../, ~/skills/.../)
#     and never walks parent project directories.
#   - Hits exactly the OPENAI_BASE_URL endpoint you set, plus optional
#     VISION_BASE_URL endpoint you set (template-clone mode only).
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
default_prompt: "Make me a 5-slide deck about [topic] using gpt-image2-ppt; pick a fitting style from styles/."

# Trust surface (what the user agrees to when installing this skill):
#   - Reads scoped .env files only (skill dir, ~/.claude/skills/.../, ~/skills/.../)
#     and never walks parent project directories.
#   - Hits exactly the OPENAI_BASE_URL endpoint you set, plus optional
#     VISION_BASE_URL endpoint you set (template-clone mode only).
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
default_prompt: "Make me a 5-slide deck about [topic] using gpt-image2-ppt; pick a fitting style from styles/."

# Trust surface (what the user agrees to when installing this skill):
#   - Reads scoped .env files only (skill dir, ~/.claude/skills/.../, ~/skills/.../)
#     and never walks parent project directories.
#   - Hits exactly the OPENAI_BASE_URL endpoint you set, plus optional
#     VISION_BASE_URL endpoint you set (template-clone mode only).
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
default_prompt: "Make me a 5-slide deck about [topic] using gpt-image2-ppt; pick a fitting style from styles/."

# Trust surface (what the user agrees to when installing this skill):
#   - Reads scoped .env files only (skill dir, ~/.claude/skills/.../, ~/skills/.../)
#     and never walks parent project directories.
#   - Hits exactly the OPENAI_BASE_URL endpoint you set, plus optional
#     VISION_BASE_URL endpoint you set (template-clone mode only).
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
default_prompt: "Make me a 5-slide deck about [topic] using gpt-image2-ppt; pick a fitting style from styles/."

# Trust surface (what the user agrees to when installing this skill):
#   - Reads scoped .env files only (skill dir, ~/.claude/skills/.../, ~/skills/.../)
#     and never walks parent project directories.
#   - Hits exactly the OPENAI_BASE_URL endpoint you set, plus optional
#     VISION_BASE_URL endpoint you set (template-clone mode only).
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
default_prompt: "Make me a 5-slide deck about [topic] using gpt-image2-ppt; pick a fitting style from styles/."

# Trust surface (what the user agrees to when installing this skill):
#   - Reads scoped .env files only (skill dir, ~/.claude/skills/.../, ~/skills/.../)
#     and never walks parent project directories.
#   - Hits exactly the OPENAI_BASE_URL endpoint you set, plus optional
#     VISION_BASE_URL endpoint you set (template-clone mode only).
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
default_prompt: "Make me a 5-slide deck about [topic] using gpt-image2-ppt; pick a fitting style from styles/."

# Trust surface (what the user agrees to when installing this skill):
#   - Reads scoped .env files only (skill dir, ~/.claude/skills/.../, ~/skills/.../)
#     and never walks parent project directories.
#   - Hits exactly the OPENAI_BASE_URL endpoint you set, plus optional
#     VISION_BASE_URL endpoint you set (template-clone mode only).
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
default_prompt: "Make me a 5-slide deck about [topic] using gpt-image2-ppt; pick a fitting style from styles/."

# Trust surface (what the user agrees to when installing this skill):
#   - Reads scoped .env files only (skill dir, ~/.claude/skills/.../, ~/skills/.../)
#     and never walks parent project directories.
#   - Hits exactly the OPENAI_BASE_URL endpoint you set, plus optional
#     VISION_BASE_URL endpoint you set (template-clone mode only).
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
default_prompt: "Make me a 5-slide deck about [topic] using gpt-image2-ppt; pick a fitting style from styles/."

# Trust surface (what the user agrees to when installing this skill):
#   - Reads scoped .env files only (skill dir, ~/.claude/skills/.../, ~/skills/.../)
#     and never walks parent project directories.
#   - Hits exactly the OPENAI_BASE_URL endpoint you set, plus optional
#     VISION_BASE_URL endpoint you set (template-clone mode only).
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
default_prompt: "Make me a 5-slide deck about [topic] using gpt-image2-ppt; pick a fitting style from styles/."

# Trust surface (what the user agrees to when installing this skill):
#   - Reads scoped .env files only (skill dir, ~/.claude/skills/.../, ~/skills/.../)
#     and never walks parent project directories.
#   - Hits exactly the OPENAI_BASE_URL endpoint you set, plus optional
#     VISION_BASE_URL endpoint you set (template-clone mode only).
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
default_prompt: "Make me a 5-slide deck about [topic] using gpt-image2-ppt; pick a fitting style from styles/."

# Trust surface (what the user agrees to when installing this skill):
#   - Reads scoped .env files only (skill dir, ~/.claude/skills/.../, ~/skills/.../)
#     and never walks parent project directories.
#   - Hits exactly the OPENAI_BASE_URL endpoint you set, plus optional
#     VISION_BASE_URL endpoint you set (template-clone mode only).
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
default_prompt: "Make me a 5-slide deck about [topic] using gpt-image2-ppt; pick a fitting style from styles/."

# Trust surface (what the user agrees to when installing this skill):
#   - Reads scoped .env files only (skill dir, ~/.claude/skills/.../, ~/skills/.../)
#     and never walks parent project directories.
#   - Hits exactly the OPENAI_BASE_URL endpoint you set, plus optional
#     VISION_BASE_URL endpoint you set (template-clone mode only).
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Static analysis

No suspicious patterns detected.