Back to skill

Security audit

manga-animation

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly matches its manga-animation purpose, but it needs Review because it can upload an arbitrary local file referenced in storyboard.json to an external Ark API and it encourages unsafe API-key storage.

Install only if you are comfortable sending story text, prompts, images, and generated media requests to Volcengine Ark. Use an environment variable for ARK_API_KEY, do not paste keys into the scripts, and only run video generation on storyboard.json files you created or reviewed carefully; check every reference_image path before running because the script can upload that file's contents.

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

T09 · Insecure Skill Coding Practices

Error
Location
scripts/call_video_api.py:101
Finding

Unrestricted Local File Upload Through Storyboard Reference Paths

Content
View full analysis
str: suffix = Path(image_path).suffix.lower().lstrip(".") mime = {"png": "image/png", "jpg": "image/jpeg", "jpeg": "image/jpeg", "webp": "image/webp"}.get(suffix, "image/png") with open(image_path, "rb") as f: b64 = base64.b64encode(f.read()).decode() return f"data:{mime};base64,{b64}" ``` ```python image_url = image_to_data_uri(image_path) print(f" → 提交任务(时长 {actual_duration}s,模型 {ARK_VIDEO_MODEL})...") try: task = client.content_generation.tasks.create( model=ARK_VIDEO_MODEL, content=[ {"type": "text", "text": text_with_flags}, {"type": "image_url", "image_url": {"url": image_url}}, ], ) ``` ```python ref_img = shot.get("reference_image") print(f"\n━━━ [{shot_id}] ({duration}s) ━━━") # 1. 优先用 storyboard.json 里记录的路径 if ref_img and Path(ref_img).exists(): print(f" 🖼 参考图: {ref_img}") ``` ### Technical Analysis The Base64 operation is necessary for the documented image-to-video API workflow and is not, by itself, evidence of a covert exfiltration channel. However, the source file selected for encoding is not sufficiently constrained. The `reference_image` field is read from an externally supplied storyboard JSON file. The script only verifies that the referenced path exists. It does not: - Restrict the path to an approved storyboard frames directory. - Reject absolute paths or traversal paths. - Resolve and validate symlinks. - Verify image file signatures. - Enforce a maximum input size. - Ask the user to confirm the exact file before transmitting it. The fallback MIME type is `image/png`, so a file wi ...[truncated 1352 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:37
Finding

Documentation Encourages Storing API Credentials in Source Files

Content
View full analysis
Remediation
View remediation

T08 · Insecure Dependencies

Note
Location
README.md:8
Finding

Third-Party Runtime Dependencies Are Installed Without Version or Integrity Pinning

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Taint TrackingDirect Taint Flow, Variable-Mediated Taint Flow, Credential Exfiltration Chain
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (15)

Tainted flow: 'url' from os.getenv (line 100, credential/environment) → requests.get (network output)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

The script downloads whatever URL is returned by the external image-generation API and passes it directly to requests.get without validating scheme, host, or IP range. If that upstream response is tampered with or the service returns attacker-controlled URLs, the script can be turned into an SSRF primitive that makes network requests to internal services or unexpected endpoints from the machine running the skill.

Content

Scanner excerpt · scripts/call_image_api.py (reported line 116)May include surrounding context.

python
# ──────────────────────────────────────────────────────
def download_image(url: str, out_path: str) -> bool:
    try:
        r = requests.get(url, timeout=60)
        r.raise_for_status()
        Path(out_path).parent.mkdir(parents=True, exist_ok=True)
        with open(out_path, "wb") as f:

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding

The declared description presents a full end-to-end 漫剧/动画漫画 workflow skill with multiple creative stages and required pause-for-confirmation behavior between stages. The supplied code chunk is much narrower: it is a local CLI image-generation helper focused on Ark text-to-image calls, downloading outputs, and updating storyboard metadata. It supports character image generation and storyboard frame generation only, assuming prompts and storyboard data already exist. There is no script-writing, no interactive confirmation flow, no orchestration across all stages, and no video generation capability despite the description explicitly including that stage. Therefore the description materially overstates the implemented behavior and primary purpose.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
84% confidence
Finding

描述宣称的是端到端漫剧生成工作流 skill,但代码片段的实际职责明显更窄:它只处理“已有 storyboard + 已有/可定位参考图 → 调用视频API生成镜头视频”。代码中没有任何剧本写作、分镜规划、人设设计、画风配置、参考图生成、对话式阶段推进或等待用户确认的实现。虽然该脚本属于声明流程中的“视频生成(方舟图生视频)”子步骤,因此与整体主题相关,但不足以支撑“完整工作流”这一声明,且主要用途与声明范围存在实质性缩窄,因此应判定为描述与行为不匹配。

Content

No source excerpt is available for this finding.

Vague Triggers

High
Category
Not specified by scanner
Confidence
95% confidence
Finding

The activation criteria are extremely broad and mandatory, causing the skill to trigger on many ordinary creative requests. Overbroad routing can unnecessarily expose user content to file/network-capable workflows and can bypass more appropriate, narrower skills or normal assistant behavior.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The user-facing instructions are entirely in Chinese and explicitly tell the user what to say to Claude in Chinese, implying the skill is intended to operate in that language only. There is no indication that other languages are supported or that the user may choose their preferred language, which is a natural-language policy concern under the locale/language rule.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
84% confidence
Finding

The skill declares no explicit tool restrictions while its documented workflow relies on environment variables, file creation/modification, and outbound API calls. In a skill ecosystem, missing scope declarations can allow broader-than-necessary access and make it harder for users or the platform to understand and constrain what the skill may do.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
77% confidence
Finding

The skill description and operational guidance are written entirely in Chinese and include mandatory-use language, but there is no indication that the user can choose another language or locale. For a general-purpose creative workflow, this can function as a language constraint without explicit opt-in.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The README explicitly suggests placing the API key directly in a script, which risks accidental source control commits, log exposure, screen sharing leaks, and reuse by unauthorized parties. Credential exposure is especially dangerous here because the key authorizes paid external image/video generation actions.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The skill instructs users to send storyboards, prompts, and reference images to external APIs without clearly warning that potentially sensitive creative content and uploaded images leave the local environment. Users may unknowingly disclose proprietary, personal, or confidential material to third-party services.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

This markdown guidance forces a specific language/locale for the skill content and examples, and there is no indication that users may choose another language or that the restriction is required for a China-specific workflow. Under the stated policy, a fixed language without user opt-in is a natural-language policy violation.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The manifest says each stage of the manga-animation workflow must pause for user confirmation before continuing. This script processes all shots in batch, submits remote generation jobs, downloads outputs, and even rewrites storyboard.json and saves logs without any confirmation gate, so the implemented behavior is more automatic than the declared workflow.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

This code overwrites the input storyboard.json to update reference_image paths, which is a file-modifying operation. While the write is logged after completion, there is no prior warning or confirmation in the CLI help/docstring that the input file itself will be modified, so users may not expect their source metadata to be changed.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
81% confidence
Finding

This file sets Chinese as the default instructional language throughout the document while embedding English prompt fragments as required output, but it does not indicate that users may choose another language or locale. Under the policy rule, forcing a specific language without opt-in can be a natural-language policy concern.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
89% confidence
Finding

The template explicitly requires '画面内容(中文)' and '视频生成Prompt(英文)', which imposes Chinese for scene descriptions and English for prompts. The document does not mention any user opt-in, alternatives, or justification for this language constraint.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
79% confidence
Finding

The script creates generation_log.json as a side effect, which is a file write operation. Although the final summary prints the log location, the usage documentation and argument help do not disclose beforehand that an extra log file will be created alongside the input JSON.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.