Back to skill

Security audit

Dog Slide

Security checks for vulnerabilities and agentic risk

Overview

The skill is a coherent presentation-generation tool, but it needs Review because untrusted documents and configuration can trigger overbroad local-file, network, credential, and file-moving behavior.

Install only if you trust the skill publisher and will use it in trusted workspaces. Avoid running it on untrusted HTML or web captures, do not run it from directories containing untrusted .env files, keep provider API keys scoped, avoid custom BASE_URL values unless you trust the endpoint, and prefer copying source files unless you explicitly want originals relocated.

Vulnerability Patterns
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • 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 (5)

T01 · Skill Instruction Hijacking

Error
Location
SKILL.md:19
Finding

Skill instruction priority and cross-skill control hijacking

Content
View full analysis
**This workflow is a strict serial pipeline. The following rules have the highest priority — violating any one of them constitutes execution failure:** ``` ```markdown ## 🔌 Compatibility With Generic Coding Skills - `dog-slide` is a repository-specific workflow, not a general application scaffold - Do NOT create `.worktrees/`, `tests/`, branch workflows, or generic engineering structure by default - On conflict with a generic coding skill, follow this skill unless the user explicitly says otherwise ``` ### Technical Analysis The Skill declares that its workflow rules have the “highest priority” and explicitly instructs the Agent to prefer this Skill when it conflicts with another skill. Presentation-generation instructions do not need authority over unrelated tools, skills, or host-level safety controls. Although these statements do not directly override system or developer messages, they attempt to alter the Agent's instruction-resolution behavior once the Skill is loaded. This is consistent with skill instruction hijacking because the directives extend beyond the minimum privileges necessary to generate presentations. ### Attack Path 1. The user or host loads the Dog Slide Skill for a presentation task. 2. The Agent reads `SKILL.md` and incorporates its asserted priority rules. 3. A later operation conflicts with another coding, safety, or workflow skill. 4. The Dog Slide instruction tells the Agent to resolve the conflict in favor of Dog Slide. 5. The conflicting skill's safeguards or operating constraints may consequently be disregarded. ### Impact Assessment The issue affects the Agent's current-session decision-making. It may suppress compatible safety checks, coding procedures, or workflow restrictions supplied by other skills. It does not establish ...[truncated 203 chars]
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Error
Location
scripts/source_to_md/doc_to_md.py:484
Finding

Untrusted HTML can copy arbitrary readable local files into project output

Content
View full analysis
str | None: """Copy a local image (relative or file://) into media_dir.""" parsed = urlparse(src) if parsed.scheme in ("http", "https"): return None path_str = unquote(parsed.path if parsed.scheme == "file" else src) candidate = Path(path_str) if not candidate.is_absolute(): candidate = (base_dir / candidate).resolve() if not candidate.is_file(): return None ext = candidate.suffix or ".bin" filename = f"image_{index:03d}{ext}" shutil.copy2(candidate, media_dir / filename) return filename ``` ### Technical Analysis The HTML conversion path treats non-HTTP image sources as local files. It accepts: - Absolute filesystem paths. - `file://` URLs. - Relative paths containing traversal components such as `../../`. - Any readable regular file, regardless of whether it is actually an image. Relative paths are resolved, but the resulting path is not checked to ensure that it remains under `base_dir`. Absolute paths and `file://` paths receive no containment validation at all. No MIME signature, extension allowlist, file-size limit, or sensitive-path blocklist is applied before `shutil.copy2`. Consequently, attacker-controlled HTML can cause the process to copy any file readable under the Agent's operating-system account into the generated media directory. ### Attack Path 1. An attacker supplies an HTML document containing an image reference such as: ```html ``` or: ```html ``` 2. The presentation workflow invokes `doc_to_md.py` on the document. 3. `_process_html_images` passes the attacker-contr ...[truncated 787 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
scripts/source_to_md/doc_to_md.py:500
Finding

Server-side request forgery through unrestricted HTML image downloads

Content
View full analysis
str | None: """Best-effort download of a remote image. Silent on failure.""" try: import requests except ImportError: return None try: resp = requests.get(url, timeout=10, stream=True) resp.raise_for_status() except Exception: return None content_type = resp.headers.get("Content-Type", "").split(";")[0].strip() ext = mimetypes.guess_extension(content_type) if content_type else None if not ext: ext = Path(urlparse(url).path).suffix or ".bin" if ext == ".jpe": ext = ".jpg" filename = f"image_{index:03d}{ext}" (media_dir / filename).write_bytes(resp.content) return filename ``` The caller accepts every HTTP or HTTPS image source: ```python elif urlparse(src).scheme in ("http", "https"): filename = _download_remote_image(src, media_dir, index) ``` ### Technical Analysis A URL taken directly from an untrusted HTML `` attribute is fetched by the Agent. The implementation does not reject: - Loopback destinations. - Private network ranges. - Link-local addresses. - Cloud instance metadata services. - Reserved or multicast addresses. - Redirects from a public host to a restricted address. - Hostnames that resolve or rebind to internal addresses. The code also fails to enforce an image content type or a maximum response size. Although `stream=True` is requested, accessing `resp.content` buffers the complete response in memory and writes it to disk. This provides an SSRF primitive and a resource-exhaustion opportunity. ### Attack Path 1. An attacker supplies HTML containing: ```html ``` ...[truncated 1090 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
scripts/config.py:48
Finding

Working-directory environment configuration can redirect authenticated provider requests

Content
View full analysis
list[Path]: """Return the supported .env lookup order.""" return [ Path.cwd() / '.env', PROJECT_ROOT / '.env', REPO_ROOT / '.env', USER_ENV_FILE, ] ``` The backend accepts a configurable base URL and sends the API key to it: ```python def _submit_task(api_key: str, base_url: str, prompt: str, aspect_ratio: str, resolution: str, model: str) -> str: """Submit an image generation task and return the task_id.""" url = f"{base_url.rstrip('/')}/images/generations" headers = { "Authorization": f"Bearer {api_key}", "Content-Type": "application/json", } payload = { "model": model, "prompt": prompt, "size": aspect_ratio, "resolution": resolution, "n": 1, } print(f" [..] Submitting task...", end="", flush=True) resp = requests.post(url, headers=headers, json=payload, timeout=60, proxies={"http": None, "https": None}) ``` ```python api_key = os.environ.get("OPENAI_API_KEY") base_url = os.environ.get("OPENAI_BASE_URL", DEFAULT_BASE_URL) ``` ### Technical Analysis The configuration loader selects the first `.env` file found, starting with the process's current working directory. A working directory may be a user project, extracted archive, or otherwise less trusted location. The loader uses `os.environ.setdefault`, so an existing process API key remains active while an attacker-controll ...[truncated 1539 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:154
Finding

Presentation workflow mandates destructive relocation of user source files

Content
View full analysis
--move` | | User provided text directly in conversation | No import needed — content is already in conversation context; subsequent steps can reference it directly | > ⚠️ **MUST use `--move`** (not copy): all source files — Step 1's generated Markdown, original PDFs / MDs / images — go into `sources/` via `import-sources --move`. After execution they no longer exist at the original location. Intermediate artifacts (e.g., `_files/`) are handled automatically. ``` The implementation performs an actual move when directed: ```python def _copy_or_move_file(self, source: Path, destination: Path, move: bool) -> Path: try: if source.resolve() == destination.resolve(): return destination except FileNotFoundError: pass destination = self._ensure_unique_path(destination) if move: shutil.move(str(source), str(destination)) else: shutil.copy2(source, destination) return destination ``` ### Technical Analysis Importing presentation sources only requires read access and a project-local copy. The Skill nevertheless mandates `--move`, causing original files to disappear from their existing locations. This is destructive behavior and is not required to convert documents or generate a presentation. The implementation supports the safer `--copy` behavior, but the Skill explicitly prohibits using it. There is no documented transactional rollback, destination integrity verification, or explicit informed user confirmation immediately before moving ...[truncated 866 chars]
Remediation
View remediation
Vulnerability Patterns
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • 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
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (962)

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 · README.md (reported line 83)May include surrounding context.

快速开始:

bash
cp .env.example .env
# 编辑 .env,填入你的 API 密钥

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description presents a full presentation-generation pipeline: ingesting source documents, generating SVG pages, and exporting to PPTX. The supplied code instead performs image analysis only. It reads files from an images folder, optionally consumes image_manifest.json metadata, computes aspect ratios and conditional side-by-side layout dimensions, prints console and Markdown reports, and writes image_analysis.csv. While it references PPT canvas formats and layout dimensions, those are only for reporting/helper calculations, not for generating SVG or PPTX output. Therefore the code’s primary purpose is materially different from the declared purpose.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The declared description presents a full presentation-generation pipeline: ingesting multiple document formats, producing SVG pages, and exporting to PPTX. The supplied code chunk does none of that. It is a narrow CLI helper for animation configuration management, specifically creating a scaffold file and validating animation references against existing SVG outputs. While it is tangentially related to PPTX/SVG workflows, its primary purpose is materially different and much narrower than the declared skill description.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The supplied code does not generate SVGs, convert documents, create presentations, or export PPTX files. Instead, it validates existing Dog Slide project directories by checking structure, README/spec presence, SVG viewBox issues, and producing console/text reports. This is a materially different primary purpose from the declared presentation-generation system, so the description does not accurately represent the code chunk.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The declared description presents a broad presentation-generation system that converts multiple document formats into SVG pages and exports to PPTX. The supplied code chunk does something much narrower and different: it parses existing SVG files, looks for data-edit-target/data-edit-annotation attributes, and reports them to stdout. It uses only local filesystem access and XML parsing, with no document conversion, no AI orchestration, no PPT creation/export, and no trigger-related behavior. This is a materially different primary purpose, so the description does not accurately represent this code chunk.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The supplied code chunk does not implement the declared presentation-generation workflow. Instead, it is a supporting config module: it stores design constants, validates SVG element allow/deny lists, resolves project paths, loads prefixed environment variables from .env files, and offers CLI commands to list/export configuration. While some constants relate to SVG/PPT-friendly formats, that is only supportive infrastructure, not the declared primary capability of converting source content into SVG pages and exporting PPTX. The undeclared .env loading and config-export CLI are additional behaviors absent from the description. Therefore the description materially overstates and misrepresents what this code chunk actually does.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding

The declared description presents a broad end-to-end presentation generation system that transforms various source document types into SVG and exports to PPTX. The supplied code chunk is much narrower: it is a local SVG finalization/post-processing script operating on files already present in svg_output. Its functions are limited to filesystem copying and SVG transformations such as embedding icons/images, flattening text, and converting rounded rectangles. While this supports a larger SVG-to-PPT workflow and mentions native PPTX conversion in comments, the code itself does not implement the declared document conversion, AI orchestration, or PPTX export capabilities. Therefore the description materially overstates and misrepresents what this code chunk actually does.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description says this skill generates SVG presentation content from documents and exports to PPTX. The supplied code does none of that: it does not parse PDFs, DOCX, URLs, or Markdown; does not generate SVG pages; does not create or export PPTX; and does not implement any multi-role collaboration flow. Instead, its sole purpose is removing a Gemini watermark from images using a reverse blending algorithm. This is a materially different primary purpose and an undeclared capability, so the description does not accurately represent the code.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description presents a presentation-generation skill whose core function is transforming source materials into SVG slides and PPTX outputs. The supplied code chunk does none of that. It is a standalone indexing script for example projects: it reads project metadata via helper functions, groups and sorts projects, composes markdown content, and writes examples/README.md. Its primary purpose is repository documentation/housekeeping, not slide generation. While it belongs to the broader 'Dog Slide' project, this code chunk's actual behavior is materially different from the declared skill purpose, so this is a clear mismatch.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description is a full presentation-generation system with document ingestion, SVG page creation, and PPTX export. The supplied code chunk, however, is only an init.py file containing a docstring: 'Internal backend implementations for image_gen.py.' This suggests the module is associated with image generation internals, not the described end-to-end PPT/SVG conversion workflow. Because the observed code does not substantiate the declared primary purpose and instead points to a different area (image generation backends), this is a material description-behavior mismatch.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description is about generating SVG-based presentation content from documents and exporting to PPTX. This code chunk does something materially different: it is a standalone image-generation backend that calls APIMart's image API, polls for async completion, downloads a raster image result, and saves it to disk. There is no logic for parsing documents, creating SVG pages, assembling presentations, or exporting PPTX. The code's primary purpose is image generation, not presentation generation, so this is a clear description-behavior mismatch.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The declared description presents a document-to-SVG-to-PPTX presentation generation system. In contrast, this code chunk is narrowly focused on one image backend: it accepts a prompt, calls the Black Forest Labs API, polls for generation status, and downloads a PNG image. That is a materially different primary purpose from document conversion and presentation export. While image generation could potentially be a supporting component of a larger presentation system, the described system emphasizes multi-format document conversion to SVG/PPTX, whereas this code exposes undeclared image-generation capability and lacks the declared presentation-related behavior.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The declared description centers on transforming source documents into SVG pages and exporting PPTX presentations. This code chunk does not implement those functions. Instead, it is an internal utility module for image backends, handling file naming, image byte format detection, Pillow-based transcoding, downloading remote images, polling remote JSON job endpoints, and reading API keys from environment variables. While such helpers could support a larger media-generation system, the actual behavior in this chunk is materially different from the declared primary purpose and includes undeclared network/auth-related capabilities.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The declared description presents a presentation-generation pipeline focused on converting documents into SVG pages and exporting PPTX files. The supplied code chunk instead is a narrow image-generation backend: it accepts a prompt, calls the fal.ai API, obtains a generated image URL, and downloads a PNG file. This is a materially different primary purpose and includes an undeclared external image-generation capability. While it could be a supporting component in a larger presentation system, the behavior in this chunk does not match the declared document-to-SVG/PPT functionality.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description centers on end-to-end presentation generation: ingesting source documents in multiple formats, producing SVG pages, and exporting to PPTX. The supplied code chunk does something materially different: it is a standalone backend for text-to-image generation using the Gemini API. It accepts a prompt, validates aspect ratio and image size, streams generated image data, and saves the final result as a .png file. There is no document parsing, SVG generation, slide assembly, PPT/PPTX export, or multi-role collaboration logic in this code. The code’s primary purpose is therefore not accurately represented by the declared description.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The declared description presents a document-to-SVG-to-PPT presentation generation system. The supplied code instead is a narrow backend for text-to-image generation using the Ideogram API. It validates model/aspect ratio, posts a prompt to a remote service, receives an image URL, and downloads a PNG locally with retry logic. This is materially different from the stated primary purpose and introduces an undeclared capability: external image generation/download. While such a backend could be part of a larger presentation pipeline, this code chunk itself does not perform document ingestion, SVG generation, or PPTX export, so the description does not accurately represent the code shown.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The supplied code chunk does not implement a presentation-generation pipeline. Instead, it narrowly implements a backend for generating a single image from a prompt via the MiniMax API. It resolves image dimensions from aspect ratio and size, posts to an image_generation endpoint, decodes returned base64 image bytes, detects an image extension, and saves the result. There is no handling of source documents, no SVG generation, no slide assembly, and no PPTX export. While image generation could be a supporting component in a larger presentation system, the declared description presents the skill primarily as a document-to-SVG/PPT system, which this code chunk does not accurately represent.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared purpose describes a document-to-SVG-to-PPT generation system for creating presentations. This code chunk instead performs a narrowly scoped image generation task using the ModelScope API. It accepts a text prompt, resolves image size/aspect ratio, submits an async image generation request, polls task status, and downloads the resulting PNG. There is no evidence of document ingestion, SVG page generation, PPT/PPTX export, presentation construction, or trigger handling related to presentation requests. This is a material mismatch in primary purpose and capabilities.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description presents a presentation-generation pipeline that ingests documents/URLs/Markdown, creates SVG slide pages, and exports PPTX. The supplied code does none of that. It is specifically an OpenAI-compatible image generation backend: it reads OPENAI_* environment variables, calls client.images.generate(), maps aspect ratios to image sizes, optionally configures output format/compression/background/moderation, retries on errors, and saves the returned image bytes or downloaded image URL to disk. While such an image backend could be a supporting component inside a larger presentation system, this code chunk's actual purpose is materially different from the declared purpose and exposes an undeclared capability (remote image generation API usage). Therefore this is a clear description-behavior mismatch.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The supplied code chunk does not implement the declared presentation-generation pipeline. Instead, it is a narrow image-generation backend that sends a prompt to OpenRouter, requests image+text modalities, extracts returned image data, and saves a PNG. This is materially different from converting documents into SVG pages and exporting PPTX. The external network access to OpenRouter and local PNG output are also specific operational capabilities not reflected in the declared purpose. Therefore the description does not accurately represent this code chunk.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The declared description centers on document-to-SVG conversion and PPT/PPTX creation through a multi-role presentation pipeline. In contrast, this code chunk is narrowly focused on generating a single image from a text prompt via Alibaba Cloud Qwen, then downloading the resulting PNG. There is no logic for ingesting source documents, parsing PDFs/DOCX/URLs/Markdown, generating SVG, composing slides, or exporting PowerPoint files. The external network/API usage may be a supporting implementation detail in some systems, but here the actual function is materially different from the declared presentation-generation purpose, so this is a clear mismatch.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description presents a presentation-generation pipeline focused on transforming documents into SVG pages and exporting PPTX. This code chunk does something materially different: it is a standalone image-generation backend for Replicate. It accepts a prompt, calls the Replicate model API, polls prediction status, extracts an output URL, and downloads a PNG. While image generation could be a supporting component in a presentation system, the supplied description does not accurately represent this code chunk’s concrete behavior, and the core advertised capabilities (document ingestion, SVG generation, PPTX export, collaboration) are absent here.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The declared description presents a presentation-generation system focused on transforming source documents into SVG pages and exporting to PPTX. The supplied code does not implement any of those core functions. Instead, it is a narrow backend for calling SiliconFlow's image generation endpoint, choosing image sizes, handling retries, and saving a PNG image from a returned URL. While image generation could be a supporting component inside a larger presentation system, this chunk's actual purpose is materially different from the declared primary purpose and exposes an undeclared external image-generation capability.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description describes a presentation-generation pipeline that transforms documents into SVG slide pages and exports them to PPTX. The supplied code does something materially different: it is a Stability AI image-generation backend that sends a prompt to an external API and saves the returned image as a PNG. There is no evidence of document conversion, SVG rendering, slide assembly, PPTX export, or collaboration logic in this code chunk. While image generation could be a supporting component of a presentation system, the code's concrete behavior here is a standalone image backend with external API access, which is an undeclared and materially different capability from the declared purpose.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The declared description centers on document-to-SVG/PPTX presentation generation. The supplied code does not parse PDFs, DOCX, URLs, or Markdown, does not generate SVG content, and does not export PPTX. Instead, it is a standalone backend for text-to-image generation using Volcengine Seedream, including API-key handling, remote HTTP requests, response parsing, and image download. This is a materially different purpose, not merely a supporting implementation detail of presentation creation, so the description does not accurately represent this code chunk.

Content

No source excerpt is available for this finding.

Static analysis

Detected: suspicious.exposed_secret_literal, suspicious.insecure_tls_verification

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
example.env:16

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
README.md:113

HTTPS certificate verification is disabled.

Warn
Code
suspicious.insecure_tls_verification
Location
scripts/source_to_md/web_to_md.py:131