Back to skill

Security audit

Crun Agent Skills

Security checks for vulnerabilities and agentic risk

Overview

This is a coherent Crun media-generation skill, but it handles API credentials and external network inputs too broadly for automatic installation without review.

Review before installing. Use only the official Crun API endpoint unless you intentionally trust another endpoint, protect or avoid the persistent ~/.crun/.env API-key file, confirm every credit-spending task, avoid running URL-based promo workflows on internal/private URLs, and watch result downloads from untrusted or custom endpoints.

Vulnerability Patterns
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (4)

T09 · Insecure Skill Coding Practices

Error
Location
runtime/crun_cli.py:199
Finding
API Key Disclosure Through Arbitrary and Insecure API Endpoints<![CDATA[ ## Vulnerability Details **File Location**: `runtime/crun_cli.py:199-241`, `runtime/crun_cli.py:582-592` **Vulnerability Type**: Credential exfiltration through an unvalidated destination **Risk Level**: High ### Technical Analysis The CLI accepts an unrestricted API base URL from either the `--base-url` argument or the `CRUN_BASE_URL` environment variable. It does not validate the scheme, hostname, port, or trust relationship before attaching the user's Crun API key to every request. Relevant code: ```python class CrunClient: def __init__( self, base_url: str, api_key: str, request_timeout: float = 30.0, request_retries: int = DEFAULT_REQUEST_RETRIES, ): if not api_key: raise CrunError("CRUN_API_KEY is required for remote commands") if request_retries < 0: raise CrunError("request_retries must be zero or greater") self.base_url = base_url.rstrip("/") self.api_key = api_key self.request_timeout = request_timeout self.request_retries = request_retries def request( self, method: str, path: str, *, query: Optional[dict[str, Any]] = None, body: Optional[dict[str, Any]] = None, retry: bool = True, ) -> Any: url = f"{self.base_url}{path}" if query: filtered = {key: value for key, value in query.items() if value is not None} if filtered: url = f"{url}?{urlencode(filtered)}" data = json.dumps(body).encode("utf-8") if body is not None else None request = Request( url, data=data, method=method, headers={ "Accept": "application/json", "Content-Type": "application/json", "X-API-KEY": self.api_key, "User-Agent": "crun-agent-skills/1", }, ) attempts = self.request_retries ...[truncated 2607 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Allowlist the official service origins: - `https://api.crun.ai` - `https://api.crunai.com` 2. Require HTTPS for any endpoint that receives an API key. 3. If custom endpoints are genuinely required, require an explicit high-friction option such as `--allow-custom-api-origin`, display the resolved origin, and request user confirmation before sending credentials. 4. Reject URLs containing user information, fragments, unexpected paths, or nonstandard schemes. 5. Compare the parsed hostname rather than relying on string prefixes. 6. Do not attach `X-API-KEY` after a redirect to a different origin. Either disable redirects for authenticated requests or revalidate every redirect target and strip credentials on cross-origin redirects. 7. Separate development credentials from production credentials so custom testing endpoints cannot receive the primary account key. 8. Add tests covering HTTP URLs, lookalike domains, embedded credentials, alternate ports, redirects, IPv4/IPv6 literals, and environment-variable endpoint overrides. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
runtime/crun_cli.py:140
Finding
Plaintext API Key Persistence Without Enforced Restrictive Permissions<![CDATA[ ## Vulnerability Details **File Location**: `runtime/crun_cli.py:140-166`, `runtime/crun_cli.py:630-631` **Vulnerability Type**: Insecure local credential storage **Risk Level**: Medium ### Technical Analysis The recommended configuration command stores the API key as plaintext in `~/.crun/.env`. The code creates the directory and writes the file but does not explicitly enforce owner-only permissions. Relevant code: ```python def set_api_key(api_key: str) -> dict[str, Any]: """Validate the key and persist it into ~/.crun/.env (create or replace).""" api_key = validate_api_key(api_key, "config set-api-key argument") key_line = f"{API_KEY_ENV}={api_key}" lines: list[str] = [] try: lines = HOME_ENV_FILE.read_text(encoding="utf-8-sig").splitlines() except FileNotFoundError: pass except OSError as exc: raise CrunError(f"Cannot read API key configuration file: {HOME_ENV_FILE}") from exc replaced = False for index, raw_line in enumerate(lines): stripped = raw_line.strip() if stripped.startswith("export "): stripped = stripped[7:].lstrip() if stripped.partition("=")[0].strip() == API_KEY_ENV: lines[index] = key_line replaced = True if not replaced: lines.append(key_line) try: HOME_ENV_FILE.parent.mkdir(parents=True, exist_ok=True) HOME_ENV_FILE.write_text("\n".join(lines) + "\n", encoding="utf-8") except OSError as exc: raise CrunError(f"Cannot write API key configuration file: {HOME_ENV_FILE}") from exc ``` The key is also accepted as a positional command-line argument: ```python set_key = config_sub.add_parser( "set-api-key", help="Validate and persist the API key into ~/.crun/.env" ) set_key.add_argument( "api_key", help="Crun API key ('ak_' followed by 32 characters)" ) ``` On POSIX systems, the resulting file mode depends on the user's current `umask`. A permissive `um ...[truncated 1625 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. On POSIX systems, create `~/.crun` with mode `0700` and the credential file with mode `0600`. 2. After replacing an existing file, verify and correct its permissions with `os.chmod`. 3. Use an atomic secure write: - Create a temporary file in the same directory using exclusive creation. - Set mode `0600`. - Write and flush the secret. - Atomically replace the destination. 4. Reject symlink destinations or safely open the destination using platform-appropriate no-follow controls. 5. Prefer the operating system's credential store, such as Keychain, Credential Manager, or Secret Service. 6. Do not accept the key as a positional argument by default. Read it from a non-echoing prompt using `getpass`, or accept it through standard input with clear guidance. 7. Warn users that environment variables can also be visible to child processes and may not be appropriate on shared hosts. 8. Add a `config unset-api-key` command that securely removes the stored credential and explains that the remote key should be revoked if compromise is suspected. 9. Add automated tests that verify owner-only permissions after both creation and replacement. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
` to obtain a Crun `file_url` for image-edit (I2I) or image-to-video (I2V) workflows. 2. **Fallback for Inaccessible URLs**: If fetching the URL directly fails (e.g., anti-scraping or paywall), ask the user for a quick text snippet, screenshot, or product image, and proceed seamlessly without halting the workflow. ``` If the hosting agent's browsing tools can access internal addresses, a malicious user can use this workflow to probe loopback services, cloud metadata endpoints, private network applicati ...[truncated 1741 chars]:59
Finding
Unrestricted URL Retrieval in the Promotional Media Workflow<![CDATA[ ## Vulnerability Details **File Location**: `skills/scenarios/crun-url-promo-generator/SKILL.md:59-73` **Vulnerability Type**: Agent-side server-side request forgery and unintended data retrieval **Risk Level**: Medium ### Technical Analysis The promotional workflow instructs the agent to browse an arbitrary user-provided URL and fetch related images or logos. It does not require validation of the URL scheme, resolved IP address, redirects, destination port, response size, or content type. Relevant instruction: ```markdown ## Step 1 — URL Analysis & Content Extraction 1. **Extract Webpage Information**: Use web browsing or search capabilities (`read_url_content`, `search_web`) to read the target URL's content. - **Product / Brand Name**: Identify the primary subject or service name. - **Core Selling Points**: Extract 2–4 key features, benefits, or value propositions (e.g., "AI-powered", "Ultra lightweight", "24/7 battery life", "Premium organic ingredients"). - **Visual Tone & Theme**: Identify the visual style of the brand/product (e.g. minimalist high-tech, luxury elegance, vibrant energy, eco-friendly natural). - **Product Imagery / Logo**: If product key visual images or logos are present, fetch/upload them via `crun_cli.py upload <file>` to obtain a Crun `file_url` for image-edit (I2I) or image-to-video (I2V) workflows. 2. **Fallback for Inaccessible URLs**: If fetching the URL directly fails (e.g., anti-scraping or paywall), ask the user for a quick text snippet, screenshot, or product image, and proceed seamlessly without halting the workflow. ``` If the hosting agent's browsing tools can access internal addresses, a malicious user can use this workflow to probe loopback services, cloud metadata endpoints, private network applications, or local administrative interfaces. The subsequent instruction to fetch and upload page images compounds the risk: material obtained from a private destination could be sent to Crun's ext ...[truncated 1396 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Permit only `https` and, where strictly necessary, `http` URLs. 2. Reject loopback, link-local, multicast, unspecified, private, reserved, and carrier-grade NAT address ranges for both IPv4 and IPv6. 3. Resolve the hostname before connecting and repeat destination validation after every redirect. 4. Defend against DNS rebinding by ensuring the connection uses the validated address and by validating every new resolution. 5. Block cloud metadata hosts and addresses explicitly, including link-local metadata services. 6. Restrict destination ports to expected web ports unless the user has a justified administrative use case. 7. Set strict connection, read, redirect, response-size, and decompression limits. 8. Validate content types before downloading images or other page assets. 9. Do not upload fetched material until the user has reviewed the public source URL and explicitly authorized external transfer. 10. Treat webpage text as untrusted data, not agent instructions, to prevent prompt injection from fetched content. 11. Prefer a sandboxed browsing proxy with outbound network policy enforcement rather than relying only on Skill text. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
runtime/crun_cli.py:443
Finding
Unbounded Downloads From Untrusted Task Result URLs<![CDATA[ ## Vulnerability Details **File Location**: `runtime/crun_cli.py:443-468` **Vulnerability Type**: Unbounded remote content download and arbitrary network destination access **Risk Level**: Medium ### Technical Analysis Completed task media URLs are downloaded without a destination allowlist, expected content-type validation, `Content-Length` limit, cumulative task-size limit, or streaming byte cap. Relevant code: ```python def download_task_media(task: dict[str, Any], output_dir: Path) -> dict[str, Any]: task_id = str(task.get("task_id") or "unknown-task") task_dir = output_dir.expanduser().resolve() / task_id local_media_paths: list[str] = [] download_errors: list[dict[str, str]] = [] for index, media_url in enumerate(task.get("media_urls") or [], start=1): if not isinstance(media_url, str): download_errors.append({"media_url": str(media_url), "error": "media URL is not a string"}) continue parsed = urlsplit(media_url) if parsed.scheme not in {"http", "https"}: download_errors.append({"media_url": media_url, "error": "media URL is not HTTP(S)"}) continue suffix = Path(parsed.path).suffix or ".bin" target = task_dir / f"{index:02d}{suffix}" temporary = target.with_suffix(f"{target.suffix}.part") try: task_dir.mkdir(parents=True, exist_ok=True) request = Request(media_url, headers={"User-Agent": "crun-agent-skills/1"}) with urlopen(request, timeout=30.0) as response, temporary.open("wb") as destination: while chunk := response.read(CHUNK_SIZE): destination.write(chunk) temporary.replace(target) local_media_paths.append(str(target)) except (OSError, HTTPError, URLError, TimeoutError, ValueError) as exc: temporary.unlink(missing_ok=True) download_errors.append({"media_url": media_url, "error": str(exc)} ...[truncated 1955 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Allowlist expected Crun media-storage origins or validate that result URLs use a documented trusted domain set. 2. Require HTTPS for result downloads. 3. Disable or strictly validate cross-origin redirects. 4. Reject private, loopback, link-local, reserved, and metadata-service destinations after DNS resolution and after every redirect. 5. Define a maximum size for each media file and a cumulative maximum per task. 6. Check `Content-Length` before downloading, while still enforcing a streaming byte counter because the header may be absent or false. 7. Abort and delete the partial file once the configured limit is exceeded. 8. Set an overall transfer deadline in addition to per-operation socket timeouts. 9. Validate response `Content-Type` against expected media types and use server-provided metadata only after validation. 10. Check available disk space before downloading and reserve a safety margin. 11. Limit the number of media URLs processed for a single task. 12. Store downloads in a controlled directory and expose an option to disable automatic downloading when only remote URLs are needed. ]]>
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
  • YARA SignaturesMalware Match, Webshell Match, Cryptominer Match
Findings (84)

Credential Access

High
Category
Privilege Escalation
Content
.env
__pycache__/
*.pyc
.idea
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The declared description presents a general-purpose media workflow runner built around a bundled Crun runtime and capable of handling many media modalities plus orchestration tasks. The supplied code does none of that. It only processes local image files using PIL, computes a grid layout, renders text overlays, and writes a stitched comic image to disk. While this loosely falls under image transformation, the actual code's primary purpose is materially narrower and does not implement the core declared capabilities such as runtime/model execution, multi-modal processing, uploads/downloads, async execution, or inspection/estimation features.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The declared description presents a comprehensive multi-modal Crun runtime skill covering many media-generation and orchestration capabilities. The supplied code chunk does not implement that general runtime behavior. Instead, it performs one specific local image-editing task: adding text overlays to an existing static image using PIL. It does not invoke Crun, route models, inspect schemas, estimate credits, upload media, run async jobs, download generated outputs, preview media inline, or handle video/audio/music. While the code is loosely related to image transformation, the declared purpose materially overstates and misrepresents what this code chunk actually does.

Tp4

High
Category
MCP Tool Poisoning
Confidence
93% confidence
Finding
The declared description presents a general-purpose Crun media orchestration skill spanning many media types and runtime-management capabilities. This code chunk instead implements a specific local post-processing tool for turning a video into a GIF meme with optional text captions. That is related to media transformation, but it is materially narrower and lacks the core declared behaviors around Crun runtime usage and multi-modal workflow support. Therefore the description does not accurately represent what this supplied code chunk actually does.

Vague Triggers

High
Confidence
97% confidence
Finding
The trigger description is extremely broad, instructing invocation whenever the user wants almost any image, video, audio, speech, or music operation, even if they never mention Crun. Over-broad routing can cause unintended activation of a high-capability skill, increasing the chance of unnecessary file uploads, external network actions, or charged task execution in contexts where a narrower skill would be safer.

Ae1

High
Category
analysis-evasion
Content
- `catalog/models.json` is the local routing catalog.
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
relevant child `SKILL.md` before performing that part of the workflow.
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Credential Access

High
Category
Privilege Escalation
Content
DEFAULT_CATALOG = Path(__file__).resolve().parent.parent / "catalog" / "models.json"
DEFAULT_OUTPUT_DIR = Path.home() / ".crun" / "output" / date.today().strftime("%Y-%m-%d")
CLI_SCRIPT_PATH = Path(__file__).resolve()
HOME_ENV_FILE = Path.home() / ".crun" / ".env"


class CrunError(RuntimeError):
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_CATALOG = Path(__file__).resolve().parent.parent / "catalog" / "models.json"
DEFAULT_OUTPUT_DIR = Path.home() / ".crun" / "output" / date.today().strftime("%Y-%m-%d")
CLI_SCRIPT_PATH = Path(__file__).resolve()
HOME_ENV_FILE = Path.home() / ".crun" / ".env"


class CrunError(RuntimeError):
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
def read_dotenv_value(path: Path, name: str) -> Optional[str]:
    """Read one value from a .env file without external dependencies."""
    try:
        lines = path.read_text(encoding="utf-8-sig").splitlines()
    except FileNotFoundError:
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

YARA rule 'backdoor_persistence': Backdoor persistence with malicious payloads (shell commands, SSH key injection, hidden root users) [malware]

High
Category
YARA Match
Content
,
            "recommended": True,
            "commands": {
                "macos_linux": cli_command,
                "windows_cmd": cli_command,
                "windows_powershell": cli_command,
            },
        },
        {
            "method": "environment_variable",
            "location": API_KEY_ENV,
            "commands": {
                "macos_linux": (
                    f"echo 'export {API_KEY_ENV}=<your_api_key>' >> ~/.bashrc"
                    "   # use ~/.zshrc on macOS zsh; open a new terminal to apply"
                ),
                "windows_cmd": f"setx {API_KEY_ENV} <your_api_key>",
                "windows_powershell": (
                    f"[Environment]::SetEnvironmentVariable('{API_KEY_ENV}','<your_api_key>','User')"
                ),
            },
        },
    ]


def set_api_key(api_key: str) -> dict[str, Any]:
    """Validate the key and persist it into ~/.crun/.env (create or replace)."""
    api_key = validate_api_key(api_key, "config
Confidence
75% confidence
Finding
YARA rule matched a known malware signature (reverse shell, backdoor, ransomware, C2 framework, or info stealer).

Credential Access

High
Category
Privilege Escalation
Content
def set_api_key(api_key: str) -> dict[str, Any]:
    """Validate the key and persist it into ~/.crun/.env (create or replace)."""
    api_key = validate_api_key(api_key, "config set-api-key argument")
    key_line = f"{API_KEY_ENV}={api_key}"
Confidence
83% confidence
Finding
This code stores the API key in plaintext in ~/.crun/.env, creating a recoverable local credential artifact. If another local user, backup system, malware, or overly permissive file permissions expose that file, the API key can be stolen and abused for account access and billable operations.

Vague Triggers

High
Confidence
94% confidence
Finding
The trigger is extremely broad and instructs activation for many generic art-related phrases even when the user never mentions Crun or this specific workflow. Overbroad activation can cause the wrong skill to take control, leading to unintended external actions, unnecessary credit-spending flows, or bypass of more appropriate narrower skills.

Vague Triggers

High
Confidence
96% confidence
Finding
The trigger description is extremely broad and can activate on many generic requests involving topics, stories, historical events, coding logic, or explanations even when the user did not ask for a comic workflow. Over-broad routing can cause unintended tool use, unnecessary file/task operations, and surprise generation behavior, especially in agent systems that auto-select skills from descriptions.

Vague Triggers

High
Confidence
97% confidence
Finding
The trigger language is extremely broad and is designed to activate on generic 'URL to media' requests, even when the user does not explicitly invoke Crun. That can cause unintended routing of ordinary browsing or content-transformation requests into a credit-spending, external-media workflow, increasing the risk of surprise actions, unnecessary data handling, and accidental execution of powerful downstream capabilities.

Natural-Language Policy Violations

Medium
Confidence
86% confidence
Finding
该文件整体以中文编写且文件名明确为中文版本,面向用户的安装与使用说明默认采用中文,没有在文内提供语言偏好选择或说明仅适用于中文用户。根据规则,强制特定语言而无用户选择可能构成自然语言政策问题。

Rp1

Medium
Category
MCP Rug Pull
Confidence
92% confidence
Finding
The README instructs users/agents to run `npx skills add CrunTeam/crun-agent-skills --all` without pinning a specific package version or commit. This creates a supply-chain risk: a future compromised or maliciously replaced package version could be fetched and executed automatically, which is more dangerous in an agent-skill context because installation is presented as a copy-paste command for automation.

Rp1

Medium
Category
MCP Rug Pull
Confidence
92% confidence
Finding
This command again uses `npx skills add` without an explicit version pin, allowing the resolved package/tooling to drift over time. If the upstream package or dependency chain is compromised, users or agents following the README could install and execute attacker-controlled code during setup.

Rp1

Medium
Category
MCP Rug Pull
Confidence
92% confidence
Finding
The `--all` installation example relies on unpinned `npx skills`, so the fetched installer/tool may change between runs and environments. In a skill ecosystem, this increases exposure to remote package hijacking or malicious updates because installation is likely to be delegated to an automated agent.

Rp1

Medium
Category
MCP Rug Pull
Confidence
92% confidence
Finding
The global install example also references `npx skills` without pinning, so it inherits the same supply-chain execution risk while potentially affecting a broader user scope via global installation. A compromised upstream package here could lead to persistent malicious tooling on the host.

Whitespace Padding

Medium
Category
Prompt Injection
Content
路由候选来自 [`catalog/models.json`](./catalog/models.json)——本地模型目录,收录 138
个模型的模态、支持的操作、质量/速度档位、参考素材支持、原生音频支持和路由优先级;`models list` 还可以直接调取远程的最新模型列表。概览:

| 模态    | 模型家族                                                                                                                                                        | 操作                                                                                                                   |
|-------|-------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------|
| 图片    | Seedream 5/4.5/4、GPT-Image 2/1.5/1、Nano Banana / Pro / 2、FLUX 1.1/2/Kontext、Qwen-Image 2.0、Wan 2.6/2.7 Image、Grok Imagine、z-image                           | `text-to-image`、`image-edit`                                                                                         |
| 视频    | Seedance 2.0/1.5/1.0、Sora 2 / Sora 2 Pro、Veo 3.1(fast/lite/quality)、Kling v2.x/v3、Vidu Q1–Q3、Wan 2.5–2.7、Hailuo、Runway Gen-4、HappyHorse 1.0/1.1、Gemini Omni | `text-to-video`、`image-to-video`、`reference-to-video`、`first-last-frame-to-video`、`storyboard-to-video`、`video-edit` |
Confidence
70% confidence
Finding
Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.

Whitespace Padding

Medium
Category
Prompt Injection
Content
路由候选来自 [`catalog/models.json`](./catalog/models.json)——本地模型目录,收录 138
个模型的模态、支持的操作、质量/速度档位、参考素材支持、原生音频支持和路由优先级;`models list` 还可以直接调取远程的最新模型列表。概览:

| 模态    | 模型家族                                                                                                                                                        | 操作                                                                                                                   |
|-------|-------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------|
| 图片    | Seedream 5/4.5/4、GPT-Image 2/1.5/1、Nano Banana / Pro / 2、FLUX 1.1/2/Kontext、Qwen-Image 2.0、Wan 2.6/2.7 Image、Grok Imagine、z-image                           | `text-to-image`、`image-edit`                                                                                         |
| 视频    | Seedance 2.0/1.5/1.0、Sora 2 / Sora 2 Pro、Veo 3.1(fast/lite/quality)、Kling v2.x/v3、Vidu Q1–Q3、Wan 2.5–2.7、Hailuo、Runway Gen-4、HappyHorse 1.0/1.1、Gemini Omni | `text-to-video`、`image-to-video`、`reference-to-video`、`first-last-frame-to-video`、`storyboard-to-video`、`video-edit` |
Confidence
70% confidence
Finding
Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.

Whitespace Padding

Medium
Category
Prompt Injection
Content
路由候选来自 [`catalog/models.json`](./catalog/models.json)——本地模型目录,收录 138
个模型的模态、支持的操作、质量/速度档位、参考素材支持、原生音频支持和路由优先级;`models list` 还可以直接调取远程的最新模型列表。概览:

| 模态    | 模型家族                                                                                                                                                        | 操作                                                                                                                   |
|-------|-------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------|
| 图片    | Seedream 5/4.5/4、GPT-Image 2/1.5/1、Nano Banana / Pro / 2、FLUX 1.1/2/Kontext、Qwen-Image 2.0、Wan 2.6/2.7 Image、Grok Imagine、z-image                           | `text-to-image`、`image-edit`                                                                                         |
| 视频    | Seedance 2.0/1.5/1.0、Sora 2 / Sora 2 Pro、Veo 3.1(fast/lite/quality)、Kling v2.x/v3、Vidu Q1–Q3、Wan 2.5–2.7、Hailuo、Runway Gen-4、HappyHorse 1.0/1.1、Gemini Omni | `text-to-video`、`image-to-video`、`reference-to-video`、`first-last-frame-to-video`、`storyboard-to-video`、`video-edit` |
Confidence
70% confidence
Finding
Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.

Whitespace Padding

Medium
Category
Prompt Injection
Content
| 模态    | 模型家族                                                                                                                                                        | 操作                                                                                                                   |
|-------|-------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------|
| 图片    | Seedream 5/4.5/4、GPT-Image 2/1.5/1、Nano Banana / Pro / 2、FLUX 1.1/2/Kontext、Qwen-Image 2.0、Wan 2.6/2.7 Image、Grok Imagine、z-image                           | `text-to-image`、`image-edit`                                                                                         |
| 视频    | Seedance 2.0/1.5/1.0、Sora 2 / Sora 2 Pro、Veo 3.1(fast/lite/quality)、Kling v2.x/v3、Vidu Q1–Q3、Wan 2.5–2.7、Hailuo、Runway Gen-4、HappyHorse 1.0/1.1、Gemini Omni | `text-to-video`、`image-to-video`、`reference-to-video`、`first-last-frame-to-video`、`storyboard-to-video`、`video-edit` |
| 音频与音乐 | Qwen3-TTS(语音合成、声音克隆、音色设计)、Suno(音乐生成/翻唱/续写、音效、人声分离)                                                                                                          | `text-to-speech`、`music-generate`、`sound-effects`、`vocal-separation`                                                 |
| 媒体工具  | 图片超分、背景移除、水印移除、视频增强、口型同步(Vidu)、动作控制(Kling、DreamActor、Wan Animate)、视频模板                                                                                      | `image-upscale`、`background-remove`、`watermark-remove`、`lip-sync`、`motion-control`、`template-to-video`               |
Confidence
70% confidence
Finding
Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.

Whitespace Padding

Medium
Category
Prompt Injection
Content
|-------|-------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------|
| 图片    | Seedream 5/4.5/4、GPT-Image 2/1.5/1、Nano Banana / Pro / 2、FLUX 1.1/2/Kontext、Qwen-Image 2.0、Wan 2.6/2.7 Image、Grok Imagine、z-image                           | `text-to-image`、`image-edit`                                                                                         |
| 视频    | Seedance 2.0/1.5/1.0、Sora 2 / Sora 2 Pro、Veo 3.1(fast/lite/quality)、Kling v2.x/v3、Vidu Q1–Q3、Wan 2.5–2.7、Hailuo、Runway Gen-4、HappyHorse 1.0/1.1、Gemini Omni | `text-to-video`、`image-to-video`、`reference-to-video`、`first-last-frame-to-video`、`storyboard-to-video`、`video-edit` |
| 音频与音乐 | Qwen3-TTS(语音合成、声音克隆、音色设计)、Suno(音乐生成/翻唱/续写、音效、人声分离)                                                                                                          | `text-to-speech`、`music-generate`、`sound-effects`、`vocal-separation`                                                 |
| 媒体工具  | 图片超分、背景移除、水印移除、视频增强、口型同步(Vidu)、动作控制(Kling、DreamActor、Wan Animate)、视频模板                                                                                      | `image-upscale`、`background-remove`、`watermark-remove`、`lip-sync`、`motion-control`、`template-to-video`               |

本地目录只负责路由标签与优先级;某个模型当前的输入 schema 始终以鉴权后的 Models 接口为准(`models describe`)。
Confidence
70% confidence
Finding
Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.

Static analysis

No suspicious patterns detected.