{"data":{"skill":{"slug":"agentspace-so-image-to-video","name":"image-to-video","icon":"📦","repo":"https://github.com/agentspace-so/runcomfy-agent-skills/tree/main/image-to-video/","status":"approved","author":"agentspace-so","authorVersion":null,"skillstoreRevision":2},"audit":{"id":"25c5068b-56a6-49d9-a7d4-3525e330963c","skill_id":"55c9e98f-1651-4b1d-8e24-c4a02c08358e","version":5,"content_hash":"v3:181fdefcafd96b041926e61c4b2e306ca7e7820e:7a97ff688209d3cad39a9d84b284b209c3b3cdcc775fb91b4711b2eb1555ad7b:9c50b2b32907fb02cb6ae3b02f8a7328ca6eaf4054b376100afa5591b5492007:736b696c6c732f6167656e7473706163652d736f2f696d6167652d746f2d766964656f:57be4bbb51435f99c08544463eda8002","risk_level":"high","is_blocked":false,"safe_to_publish":false,"analysis_status":"ok","agent_auto_install_policy":"confirmation_required","manual_install_policy":"allowed","summary":"The static alerts for backtick execution, path traversal, hidden-file access, hardcoded URLs, and reconnaissance are false positives caused by Markdown and documentation examples. The skill still presents shell interpolation, unpinned package installation, and third-party media disclosure risks. No prompt injection attempt was found.","remediation":[{"issue":"CLI examples place user-authored JSON inside shell-quoted command arguments.","severity":"high","suggestion":"Pass arguments without a shell, or use a protected input file or standard input. Never interpolate user text into a shell command."},{"issue":"The prerequisite installs an unpinned third-party CLI globally.","severity":"medium","suggestion":"Pin an audited CLI version and integrity value. Prefer a project-local installation with restricted permissions."},{"issue":"Prompts and referenced media are processed by an external RunComfy service.","severity":"medium","suggestion":"Require user consent before submission. Warn against private or credential-bearing URLs and disclose remote retention policies."}],"risk_factor_evidence":[{"factor":"external_commands","evidence":[{"file":"SKILL.md","line_end":9,"line_start":9},{"file":"SKILL.md","line_end":13,"line_start":13},{"file":"SKILL.md","line_end":29,"line_start":27},{"file":"SKILL.md","line_end":38,"line_start":29},{"file":"SKILL.md","line_end":39,"line_start":38},{"file":"SKILL.md","line_end":39,"line_start":39},{"file":"SKILL.md","line_end":49,"line_start":48},{"file":"SKILL.md","line_end":50,"line_start":49},{"file":"SKILL.md","line_end":57,"line_start":50},{"file":"SKILL.md","line_end":63,"line_start":57},{"file":"SKILL.md","line_end":64,"line_start":63},{"file":"SKILL.md","line_end":65,"line_start":64},{"file":"SKILL.md","line_end":65,"line_start":65},{"file":"SKILL.md","line_end":67,"line_start":66},{"file":"SKILL.md","line_end":68,"line_start":67},{"file":"SKILL.md","line_end":74,"line_start":68},{"file":"SKILL.md","line_end":81,"line_start":74},{"file":"SKILL.md","line_end":93,"line_start":81},{"file":"SKILL.md","line_end":95,"line_start":93},{"file":"SKILL.md","line_end":95,"line_start":95},{"file":"SKILL.md","line_end":104,"line_start":103},{"file":"SKILL.md","line_end":105,"line_start":104},{"file":"SKILL.md","line_end":105,"line_start":105},{"file":"SKILL.md","line_end":106,"line_start":106},{"file":"SKILL.md","line_end":107,"line_start":107},{"file":"SKILL.md","line_end":109,"line_start":108},{"file":"SKILL.md","line_end":113,"line_start":109},{"file":"SKILL.md","line_end":122,"line_start":113},{"file":"SKILL.md","line_end":127,"line_start":122},{"file":"SKILL.md","line_end":128,"line_start":127},{"file":"SKILL.md","line_end":128,"line_start":128},{"file":"SKILL.md","line_end":135,"line_start":129},{"file":"SKILL.md","line_end":143,"line_start":135},{"file":"SKILL.md","line_end":144,"line_start":143},{"file":"SKILL.md","line_end":144,"line_start":144},{"file":"SKILL.md","line_end":145,"line_start":145},{"file":"SKILL.md","line_end":146,"line_start":146},{"file":"SKILL.md","line_end":147,"line_start":147},{"file":"SKILL.md","line_end":149,"line_start":148},{"file":"SKILL.md","line_end":149,"line_start":149},{"file":"SKILL.md","line_end":151,"line_start":150},{"file":"SKILL.md","line_end":155,"line_start":151},{"file":"SKILL.md","line_end":165,"line_start":155},{"file":"SKILL.md","line_end":169,"line_start":165},{"file":"SKILL.md","line_end":169,"line_start":169},{"file":"SKILL.md","line_end":180,"line_start":170},{"file":"SKILL.md","line_end":180,"line_start":180},{"file":"SKILL.md","line_end":197,"line_start":197},{"file":"SKILL.md","line_end":201,"line_start":201},{"file":"SKILL.md","line_end":204,"line_start":202}]},{"factor":"network","evidence":[{"file":"SKILL.md","line_end":17,"line_start":17},{"file":"SKILL.md","line_end":23,"line_start":23},{"file":"SKILL.md","line_end":77,"line_start":77},{"file":"SKILL.md","line_end":117,"line_start":117},{"file":"SKILL.md","line_end":159,"line_start":159},{"file":"SKILL.md","line_end":160,"line_start":160},{"file":"SKILL.md","line_end":161,"line_start":161},{"file":"SKILL.md","line_end":193,"line_start":193}]},{"factor":"filesystem","evidence":[{"file":"SKILL.md","line_end":77,"line_start":77},{"file":"SKILL.md","line_end":117,"line_start":117},{"file":"SKILL.md","line_end":159,"line_start":159},{"file":"SKILL.md","line_end":160,"line_start":160},{"file":"SKILL.md","line_end":161,"line_start":161},{"file":"SKILL.md","line_end":201,"line_start":201},{"file":"SKILL.md","line_end":201,"line_start":201}]}],"critical_findings":[],"high_findings":[{"title":"Shell Injection Risk in CLI Examples","locations":[{"file":"SKILL.md","line_end":81,"line_start":74},{"file":"SKILL.md","line_end":122,"line_start":113},{"file":"SKILL.md","line_end":165,"line_start":155}],"confidence":0.91,"description":"Examples place JSON containing user-authored prompts inside single-quoted shell arguments. An unescaped apostrophe can terminate quoting and permit injected shell commands.","review_kind":"security","source_category":"semantic","source_severity":"high","confidence_reasoning":"All three examples pass inline JSON through a shell command, and line 78 already requires manual apostrophe escaping. Safe behavior depends on reliable quoting not specified by the skill."}],"medium_findings":[{"title":"Unpinned Global CLI Installation","locations":[{"file":"SKILL.md","line_end":48,"line_start":48}],"confidence":0.96,"description":"The prerequisite installs the latest third-party RunComfy CLI globally without a version or integrity pin. Package lifecycle code receives the installing user's permissions.","review_kind":"security","source_category":"semantic","source_severity":"medium","confidence_reasoning":"Line 48 explicitly uses a global npm install with no version. This creates a clear supply-chain exposure even without evidence that the current package is malicious."},{"title":"Third-Party Media and Prompt Disclosure","locations":[{"file":"SKILL.md","line_end":197,"line_start":197},{"file":"SKILL.md","line_end":204,"line_start":202}],"confidence":0.98,"description":"The workflow submits prompts and media URLs to RunComfy, whose servers fetch referenced content. Private media or signed URL credentials may leave the user's trust boundary.","review_kind":"security","source_category":"semantic","source_severity":"medium","confidence_reasoning":"The skill explicitly states that the CLI posts inputs to the Model API and that remote model servers fetch supplied URLs. The privacy impact follows directly from that workflow."}],"low_findings":[],"dangerous_patterns":[],"files_scanned":1,"total_lines":206,"audit_model":"codex","audited_at":"2026-07-23T08:57:55.627+00:00","created_at":"2026-07-24T04:59:38.889241+00:00","static_findings":[{"id":"external_commands:SKILL.md:9:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`audio_url` for custom-voiceover lip-sync, or Seedance 2.0 Pro for","category":"external_commands","line_end":9,"severity":"medium","line_start":9},{"id":"external_commands:SKILL.md:13:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"model. Calls `runcomfy run <vendor>/<model>/image-to-video` (or","category":"external_commands","line_end":13,"severity":"medium","line_start":13},{"id":"external_commands:SKILL.md:27:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":29,"severity":"medium","line_start":27},{"id":"external_commands:SKILL.md:29:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":38,"severity":"medium","line_start":29},{"id":"external_commands:SKILL.md:38:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| Animate **and** lip-sync to a **custom voiceover track** | **Wan 2.7 + `audio_url`** | Accepts you","category":"external_commands","line_end":39,"severity":"medium","line_start":38},{"id":"external_commands:SKILL.md:39:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| Multi-language dub variants (same image, different audio per call) | **Wan 2.7 + `audio_url`** | S","category":"external_commands","line_end":39,"severity":"medium","line_start":39},{"id":"external_commands:SKILL.md:48:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"1. **RunComfy CLI** — `npm i -g @runcomfy/cli`","category":"external_commands","line_end":49,"severity":"medium","line_start":48},{"id":"external_commands:SKILL.md:49:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"2. **RunComfy account** — `runcomfy login` opens a browser device-code flow.","category":"external_commands","line_end":50,"severity":"medium","line_start":49},{"id":"external_commands:SKILL.md:50:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"3. **CI / containers** — set `RUNCOMFY_TOKEN=<token>`.","category":"external_commands","line_end":57,"severity":"medium","line_start":50},{"id":"external_commands:SKILL.md:57:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"**Model**: `happyhorse/happyhorse-1-0/image-to-video` · **Arena rank**: #1 (Elo 1392)","category":"external_commands","line_end":63,"severity":"medium","line_start":57},{"id":"external_commands:SKILL.md:63:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `image_url` | string | yes | — | JPEG/JPG/PNG/WEBP. Min 300px. Aspect 1:2.5–2.5:1. ≤10MB. |","category":"external_commands","line_end":64,"severity":"medium","line_start":63},{"id":"external_commands:SKILL.md:64:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `prompt` | string | yes | — | ≤5000 non-CJK or 2500 CJK chars. **Motion / camera / lighting** desc","category":"external_commands","line_end":65,"severity":"medium","line_start":64},{"id":"external_commands:SKILL.md:65:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `resolution` | enum | no | `1080P` | `720P` or `1080P`. |","category":"external_commands","line_end":65,"severity":"medium","line_start":65},{"id":"external_commands:SKILL.md:66:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `duration` | int | no | 5 | 3–15 seconds. |","category":"external_commands","line_end":67,"severity":"medium","line_start":66},{"id":"external_commands:SKILL.md:67:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `seed` | int | no | 0 | Reuse for variant comparisons. |","category":"external_commands","line_end":68,"severity":"medium","line_start":67},{"id":"external_commands:SKILL.md:68:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `watermark` | bool | no | true | Provider watermark toggle. |","category":"external_commands","line_end":74,"severity":"medium","line_start":68},{"id":"external_commands:SKILL.md:74:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":81,"severity":"medium","line_start":74},{"id":"external_commands:SKILL.md:81:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":93,"severity":"medium","line_start":81},{"id":"external_commands:SKILL.md:93:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"## Route 2: Wan 2.7 + `audio_url` — when the user has a custom voiceover","category":"external_commands","line_end":95,"severity":"medium","line_start":93},{"id":"external_commands:SKILL.md:95:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"**Model**: `wan-ai/wan-2-7/text-to-video` (NOT `/image-to-video` — Wan 2.7's t2v endpoint accepts an","category":"external_commands","line_end":95,"severity":"medium","line_start":95},{"id":"external_commands:SKILL.md:103:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `prompt` | string | yes | — | Up to ~5000 chars. Describe the talking-head shot: framing, lighting","category":"external_commands","line_end":104,"severity":"medium","line_start":103},{"id":"external_commands:SKILL.md:104:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `audio_url` | string | yes (for lip-sync) | — | WAV/MP3, 3–30s, ≤15MB. **Drives lip-sync.** |","category":"external_commands","line_end":105,"severity":"medium","line_start":104},{"id":"external_commands:SKILL.md:105:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `aspect_ratio` | enum | no | `16:9` | `16:9`, `9:16`, `1:1`, `4:3`, `3:4`. |","category":"external_commands","line_end":105,"severity":"medium","line_start":105},{"id":"external_commands:SKILL.md:106:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `resolution` | enum | no | `1080p` | `720p` or `1080p`. |","category":"external_commands","line_end":106,"severity":"medium","line_start":106},{"id":"external_commands:SKILL.md:107:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `duration` | enum | no | `5` | 2–15 (whole seconds). Match your audio length. |","category":"external_commands","line_end":107,"severity":"medium","line_start":107},{"id":"external_commands:SKILL.md:108:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `negative_prompt` | string | no | — | Concrete issues to avoid (e.g. \"no subtitles, no flicker\"). ","category":"external_commands","line_end":109,"severity":"medium","line_start":108},{"id":"external_commands:SKILL.md:109:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `seed` | int | no | — | Reproducibility. |","category":"external_commands","line_end":113,"severity":"medium","line_start":109},{"id":"external_commands:SKILL.md:113:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":122,"severity":"medium","line_start":113},{"id":"external_commands:SKILL.md:122:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":127,"severity":"medium","line_start":122},{"id":"external_commands:SKILL.md:127:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **Match `duration` to audio length** — clip will be silent past the audio if too long.","category":"external_commands","line_end":128,"severity":"medium","line_start":127},{"id":"external_commands:SKILL.md:128:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **Use `negative_prompt` for issues**: `\"no subtitles, no flicker, no distorted hands\"`.","category":"external_commands","line_end":128,"severity":"medium","line_start":128},{"id":"external_commands:SKILL.md:129:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **For multi-language dubs** — same prompt, swap `audio_url` per call. Lock seed for visual consist","category":"external_commands","line_end":135,"severity":"medium","line_start":129},{"id":"external_commands:SKILL.md:135:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"**Model**: `bytedance/seedance-v2/pro`","category":"external_commands","line_end":143,"severity":"medium","line_start":135},{"id":"external_commands:SKILL.md:143:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `prompt` | string | yes | — | CN ≤500 chars OR EN ≤1000 words. |","category":"external_commands","line_end":144,"severity":"medium","line_start":143},{"id":"external_commands:SKILL.md:144:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `image_url` | array | yes (for i2v) | `[]` | 0–9 images. **First is the primary subject.** |","category":"external_commands","line_end":144,"severity":"medium","line_start":144},{"id":"external_commands:SKILL.md:145:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `video_url` | array | no | `[]` | 0–3 reference clips (MP4/MOV), 2–15s each. |","category":"external_commands","line_end":145,"severity":"medium","line_start":145},{"id":"external_commands:SKILL.md:146:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `audio_url` | array | no | `[]` | 0–3 reference audio (WAV/MP3), 2–15s, < 15MB each. |","category":"external_commands","line_end":146,"severity":"medium","line_start":146},{"id":"external_commands:SKILL.md:147:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `aspect_ratio` | enum | no | `adaptive` | `adaptive`, `16:9`, `9:16`, `4:3`, `3:4`, `1:1`, `21:9`.","category":"external_commands","line_end":147,"severity":"medium","line_start":147},{"id":"external_commands:SKILL.md:148:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `duration` | int | no | 5 | 4–15 (whole seconds). |","category":"external_commands","line_end":149,"severity":"medium","line_start":148},{"id":"external_commands:SKILL.md:149:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `resolution` | enum | no | `720p` | `480p` or `720p`. |","category":"external_commands","line_end":149,"severity":"medium","line_start":149},{"id":"external_commands:SKILL.md:150:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `generate_audio` | bool | no | true | In-pass synchronized speech / SFX / music. |","category":"external_commands","line_end":151,"severity":"medium","line_start":150},{"id":"external_commands:SKILL.md:151:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `seed` | int | no | — | Reproducibility. |","category":"external_commands","line_end":155,"severity":"medium","line_start":151},{"id":"external_commands:SKILL.md:155:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":165,"severity":"medium","line_start":155},{"id":"external_commands:SKILL.md:165:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":169,"severity":"medium","line_start":165},{"id":"external_commands:SKILL.md:169:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **Image vs text division** — use `image_url` for what must stay stable (face, costume, brand); use","category":"external_commands","line_end":169,"severity":"medium","line_start":169},{"id":"external_commands:SKILL.md:170:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **Number the refs** in the prompt: `\"subject from image 1, lighting from video 1, voice from audio","category":"external_commands","line_end":180,"severity":"medium","line_start":170},{"id":"external_commands:SKILL.md:180:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **Brand-specific overrides** — if the user named a specific model variant not listed (e.g. Wan 2.6","category":"external_commands","line_end":180,"severity":"medium","line_start":180},{"id":"external_commands:SKILL.md:197:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"The skill picks one of HappyHorse 1.0 I2V / Wan 2.7 t2v+audio / Seedance 2.0 Pro based on user inten","category":"external_commands","line_end":197,"severity":"medium","line_start":197},{"id":"external_commands:SKILL.md:201:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **Token storage**: `runcomfy login` writes the API token to `~/.config/runcomfy/token.json` with m","category":"external_commands","line_end":201,"severity":"medium","line_start":201},{"id":"external_commands:SKILL.md:202:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **Input boundary**: the user prompt is passed as a JSON string to the CLI via `--input`. The CLI d","category":"external_commands","line_end":204,"severity":"medium","line_start":202},{"id":"external_commands:SKILL.md:204:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **Outbound endpoints**: only `model-api.runcomfy.net` (request submission) and `*.runcomfy.net` / ","category":"external_commands","line_end":204,"severity":"medium","line_start":204},{"id":"network:SKILL.md:17:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"homepage: https://www.runcomfy.com","category":"network","line_end":17,"severity":"low","line_start":17},{"id":"network:SKILL.md:23:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"[runcomfy.com](https://www.runcomfy.com/?utm_source=skills.sh&utm_medium=skill&utm_campaign=image-to","category":"network","line_end":23,"severity":"low","line_start":23},{"id":"network:SKILL.md:77:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"\"image_url\": \"https://.../portrait.jpg\",","category":"network","line_end":77,"severity":"low","line_start":77},{"id":"network:SKILL.md:117:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"\"audio_url\": \"https://.../voiceover-en.mp3\",","category":"network","line_end":117,"severity":"low","line_start":117},{"id":"network:SKILL.md:159:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"\"image_url\": [\"https://.../subject.jpg\"],","category":"network","line_end":159,"severity":"low","line_start":159},{"id":"network:SKILL.md:160:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"\"video_url\": [\"https://.../cafe-locked-shot.mp4\"],","category":"network","line_end":160,"severity":"low","line_start":160},{"id":"network:SKILL.md:161:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"\"audio_url\": [\"https://.../voice-tone.mp3\"],","category":"network","line_end":161,"severity":"low","line_start":161},{"id":"network:SKILL.md:193:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"Full reference: [docs.runcomfy.com/cli/troubleshooting](https://docs.runcomfy.com/cli/troubleshootin","category":"network","line_end":193,"severity":"low","line_start":193},{"id":"filesystem:SKILL.md:77:path-traversal-sequence","file":"SKILL.md","pattern":"Path traversal sequence","snippet":"\"image_url\": \"https://.../portrait.jpg\",","category":"filesystem","line_end":77,"severity":"high","line_start":77},{"id":"filesystem:SKILL.md:117:path-traversal-sequence","file":"SKILL.md","pattern":"Path traversal sequence","snippet":"\"audio_url\": \"https://.../voiceover-en.mp3\",","category":"filesystem","line_end":117,"severity":"high","line_start":117},{"id":"filesystem:SKILL.md:159:path-traversal-sequence","file":"SKILL.md","pattern":"Path traversal sequence","snippet":"\"image_url\": [\"https://.../subject.jpg\"],","category":"filesystem","line_end":159,"severity":"high","line_start":159},{"id":"filesystem:SKILL.md:160:path-traversal-sequence","file":"SKILL.md","pattern":"Path traversal sequence","snippet":"\"video_url\": [\"https://.../cafe-locked-shot.mp4\"],","category":"filesystem","line_end":160,"severity":"high","line_start":160},{"id":"filesystem:SKILL.md:161:path-traversal-sequence","file":"SKILL.md","pattern":"Path traversal sequence","snippet":"\"audio_url\": [\"https://.../voice-tone.mp3\"],","category":"filesystem","line_end":161,"severity":"high","line_start":161},{"id":"filesystem:SKILL.md:201:hidden-file-in-home-directory","file":"SKILL.md","pattern":"Hidden file in home directory","snippet":"- **Token storage**: `runcomfy login` writes the API token to `~/.config/runcomfy/token.json` with m","category":"filesystem","line_end":201,"severity":"high","line_start":201},{"id":"filesystem:SKILL.md:201:hidden-file-access","file":"SKILL.md","pattern":"Hidden file access","snippet":"- **Token storage**: `runcomfy login` writes the API token to `~/.config/runcomfy/token.json` with m","category":"filesystem","line_end":201,"severity":"medium","line_start":201},{"id":"blocker:SKILL.md:108:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"| `negative_prompt` | string | no | — | Concrete issues to avoid (e.g. \"no subtitles, no flicker\"). ","category":"blocker","line_end":108,"severity":"low","line_start":108}],"finding_verdicts":[{"id":"external_commands:SKILL.md:9:ruby-shell-backtick-execution","reason":"The backticks delimit the audio_url field name in Markdown. They are not Ruby syntax and do not execute a shell command.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:13:ruby-shell-backtick-execution","reason":"The backticks format a RunComfy command pattern in Markdown metadata. No Ruby interpreter or executable backtick expression is present.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:27:ruby-shell-backtick-execution","reason":"This is the opening marker of a fenced Bash example. Markdown fence characters do not execute the enclosed command.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:29:ruby-shell-backtick-execution","reason":"This is the closing marker of a fenced installation example. It is documentation syntax, not Ruby shell execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:38:ruby-shell-backtick-execution","reason":"The backticks format the audio_url parameter inside a model-selection table. No executable expression exists.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:39:ruby-shell-backtick-execution","reason":"The backticks format the audio_url parameter in prose. They do not invoke Ruby or a shell.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:48:ruby-shell-backtick-execution","reason":"The npm command is shown as inline Markdown documentation and is not executed by backticks. The separate risk from installing an unpinned package is recorded semantically.","verdict":"false_positive","confidence":0.96},{"id":"external_commands:SKILL.md:49:ruby-shell-backtick-execution","reason":"The runcomfy login text is an inline prerequisite command. The surrounding Markdown backticks have no runtime behavior.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:50:ruby-shell-backtick-execution","reason":"The backticks format an environment variable assignment example. No command substitution or shell execution occurs in the document.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:57:ruby-shell-backtick-execution","reason":"The backticks format a static model identifier. This is documentation, not an executable backtick expression.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:63:ruby-shell-backtick-execution","reason":"The backticks mark parameter names and values in a Markdown schema table. They do not run commands.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:64:ruby-shell-backtick-execution","reason":"The backticks mark a prompt field name in a Markdown table. No executable Ruby or shell construct is present.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:65:ruby-shell-backtick-execution","reason":"The backticks format resolution field values in documentation. They are not command substitutions.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:66:ruby-shell-backtick-execution","reason":"The backticks format the duration field name in a schema table. No command execution is defined.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:67:ruby-shell-backtick-execution","reason":"The backticks format the seed parameter in Markdown. They have no execution semantics.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:68:ruby-shell-backtick-execution","reason":"The backticks format the watermark parameter in a documentation table. No shell or Ruby execution occurs.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:74:ruby-shell-backtick-execution","reason":"This is the opening marker for a fenced Bash example, not Ruby backtick execution. Shell interpolation risk within the example is recorded separately.","verdict":"false_positive","confidence":0.96},{"id":"external_commands:SKILL.md:81:ruby-shell-backtick-execution","reason":"This is the closing marker for a documented CLI example. The fence itself cannot execute a command.","verdict":"false_positive","confidence":0.96},{"id":"external_commands:SKILL.md:93:ruby-shell-backtick-execution","reason":"The backticks format the audio_url parameter in a section heading. No executable code is present.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:95:ruby-shell-backtick-execution","reason":"The backticks format model paths and a parameter name in prose. They do not invoke a shell.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:103:ruby-shell-backtick-execution","reason":"The backticks format the prompt field name in a Markdown table. This is not executable syntax.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:104:ruby-shell-backtick-execution","reason":"The backticks format the audio_url field name. No shell command or command substitution exists.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:105:ruby-shell-backtick-execution","reason":"The backticks mark aspect-ratio field values in a schema table. They have no runtime effect.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:106:ruby-shell-backtick-execution","reason":"The backticks format documented resolution values. No Ruby or shell expression is present.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:107:ruby-shell-backtick-execution","reason":"The backticks format a duration field and its default value. This is Markdown documentation only.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:108:ruby-shell-backtick-execution","reason":"The backticks format the negative_prompt field name. They do not execute its text.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:109:ruby-shell-backtick-execution","reason":"The backticks format the seed field name in a schema table. No command execution is involved.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:113:ruby-shell-backtick-execution","reason":"This is a Markdown fence opening a Bash example, not an executable Ruby backtick. Shell interpolation risk inside the example is recorded separately.","verdict":"false_positive","confidence":0.96},{"id":"external_commands:SKILL.md:122:ruby-shell-backtick-execution","reason":"This is the closing Markdown fence for a CLI example. It does not execute the documented command.","verdict":"false_positive","confidence":0.96},{"id":"external_commands:SKILL.md:127:ruby-shell-backtick-execution","reason":"The backticks format the duration parameter in prompting guidance. No command substitution occurs.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:128:ruby-shell-backtick-execution","reason":"The backticks format a parameter and a quoted example value. The prose cannot execute the value.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:129:ruby-shell-backtick-execution","reason":"The backticks format the audio_url parameter in workflow guidance. They are not an executable construct.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:135:ruby-shell-backtick-execution","reason":"The backticks format a static Seedance model identifier. No interpreter evaluates this Markdown.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:143:ruby-shell-backtick-execution","reason":"The backticks format the prompt field name in a schema table. They do not run code.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:144:ruby-shell-backtick-execution","reason":"The backticks format image_url and an empty array in documentation. No shell expansion is possible from the table.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:145:ruby-shell-backtick-execution","reason":"The backticks format video_url and an empty array in a Markdown table. They are not executable.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:146:ruby-shell-backtick-execution","reason":"The backticks format audio_url and an empty array in documentation. No command execution occurs.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:147:ruby-shell-backtick-execution","reason":"The backticks format aspect-ratio options in a schema table. They have no runtime semantics.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:148:ruby-shell-backtick-execution","reason":"The backticks format a duration field name. The Markdown table is not executable.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:149:ruby-shell-backtick-execution","reason":"The backticks format resolution values in documentation. They are not shell command substitutions.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:150:ruby-shell-backtick-execution","reason":"The backticks format the generate_audio parameter. No code evaluates this Markdown.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:151:ruby-shell-backtick-execution","reason":"The backticks format the seed parameter in a table. No shell or Ruby execution is present.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:155:ruby-shell-backtick-execution","reason":"This is the opening Markdown marker for a Bash example. Shell interpolation risk within that example is recorded separately.","verdict":"false_positive","confidence":0.96},{"id":"external_commands:SKILL.md:165:ruby-shell-backtick-execution","reason":"This is the closing marker for a fenced CLI example. The backticks themselves do not execute code.","verdict":"false_positive","confidence":0.96},{"id":"external_commands:SKILL.md:169:ruby-shell-backtick-execution","reason":"The backticks format image_url and prompt field names in prose. They do not invoke commands.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:170:ruby-shell-backtick-execution","reason":"The backticks delimit an example prompt string in Markdown. The text is not evaluated by a shell.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:180:ruby-shell-backtick-execution","reason":"The backticks format related skill names in routing guidance. No command execution is defined.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:197:ruby-shell-backtick-execution","reason":"The backticks format a CLI command pattern and domain suffixes in explanatory prose. They are not Ruby shell backticks.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:201:ruby-shell-backtick-execution","reason":"The backticks format a login command, configuration path, and environment variable. The security note does not execute them.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:202:ruby-shell-backtick-execution","reason":"The backticks format the --input option in explanatory prose. No executable backtick expression exists.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:204:ruby-shell-backtick-execution","reason":"The backticks format documented endpoint patterns. They do not execute network or shell operations by themselves.","verdict":"false_positive","confidence":0.99},{"id":"network:SKILL.md:17:hardcoded-url","reason":"This URL is the declared public homepage for the named RunComfy service. It is metadata, not a hidden callback or data transfer.","verdict":"false_positive","confidence":0.99},{"id":"network:SKILL.md:23:hardcoded-url","reason":"These are visible links to RunComfy model pages and the source repository. Their destinations match the documented skill purpose.","verdict":"false_positive","confidence":0.98},{"id":"network:SKILL.md:77:hardcoded-url","reason":"The value uses an ellipsis as a placeholder for a user-supplied image URL. It is not a concrete hardcoded endpoint.","verdict":"false_positive","confidence":0.99},{"id":"network:SKILL.md:117:hardcoded-url","reason":"The value is a placeholder for a user-supplied audio URL. It does not identify a real host or covert endpoint.","verdict":"false_positive","confidence":0.99},{"id":"network:SKILL.md:159:hardcoded-url","reason":"The image URL contains an ellipsis placeholder and no real destination. It documents the expected input format.","verdict":"false_positive","confidence":0.99},{"id":"network:SKILL.md:160:hardcoded-url","reason":"The video URL is a nonresolving placeholder in an example. It is not a hardcoded network destination.","verdict":"false_positive","confidence":0.99},{"id":"network:SKILL.md:161:hardcoded-url","reason":"The audio URL is a placeholder for user content. No real external host is hardcoded here.","verdict":"false_positive","confidence":0.99},{"id":"network:SKILL.md:193:hardcoded-url","reason":"This is a visible troubleshooting link on the documented RunComfy domain. It does not transmit skill data.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:77:path-traversal-sequence","reason":"The three dots are an ellipsis inside an HTTPS placeholder, not a ../ filesystem traversal segment. No local path is accessed.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:117:path-traversal-sequence","reason":"The ellipsis is part of a placeholder audio URL. It is not a relative path traversal sequence.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:159:path-traversal-sequence","reason":"The apparent sequence is an ellipsis in a placeholder HTTPS URL. It does not reference the local filesystem.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:160:path-traversal-sequence","reason":"The apparent traversal is an ellipsis inside a placeholder video URL. No ../ path component or file operation exists.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:161:path-traversal-sequence","reason":"The dots occur in a placeholder audio URL and are not a filesystem traversal. The example performs no local file lookup.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:201:hidden-file-in-home-directory","reason":"The line documents where the external CLI stores its token with mode 0600. The skill does not create, read, or modify that path.","verdict":"false_positive","confidence":0.98},{"id":"filesystem:SKILL.md:201:hidden-file-access","reason":"The hidden configuration path appears only in a security disclosure. No file-access instruction targets the stored token.","verdict":"false_positive","confidence":0.98},{"id":"blocker:SKILL.md:108:system-reconnaissance","reason":"The phrase no subtitles, no flicker is a video-generation negative prompt. It does not inspect the host system or collect system information.","verdict":"false_positive","confidence":1}],"semantic_findings":[{"title":"Shell Injection Risk in CLI Examples","severity":"high","locations":[{"file":"SKILL.md","line_end":81,"line_start":74},{"file":"SKILL.md","line_end":122,"line_start":113},{"file":"SKILL.md","line_end":165,"line_start":155}],"confidence":0.91,"description":"Examples place JSON containing user-authored prompts inside single-quoted shell arguments. An unescaped apostrophe can terminate quoting and permit injected shell commands.","confidence_reasoning":"All three examples pass inline JSON through a shell command, and line 78 already requires manual apostrophe escaping. Safe behavior depends on reliable quoting not specified by the skill."},{"title":"Unpinned Global CLI Installation","severity":"medium","locations":[{"file":"SKILL.md","line_end":48,"line_start":48}],"confidence":0.96,"description":"The prerequisite installs the latest third-party RunComfy CLI globally without a version or integrity pin. Package lifecycle code receives the installing user's permissions.","confidence_reasoning":"Line 48 explicitly uses a global npm install with no version. This creates a clear supply-chain exposure even without evidence that the current package is malicious."},{"title":"Third-Party Media and Prompt Disclosure","severity":"medium","locations":[{"file":"SKILL.md","line_end":197,"line_start":197},{"file":"SKILL.md","line_end":204,"line_start":202}],"confidence":0.98,"description":"The workflow submits prompts and media URLs to RunComfy, whose servers fetch referenced content. Private media or signed URL credentials may leave the user's trust boundary.","confidence_reasoning":"The skill explicitly states that the CLI posts inputs to the Model API and that remote model servers fetch supplied URLs. The privacy impact follows directly from that workflow."}],"subject_marketplace_commit_sha":"181fdefcafd96b041926e61c4b2e306ca7e7820e","subject_content_hash":"7a97ff688209d3cad39a9d84b284b209c3b3cdcc775fb91b4711b2eb1555ad7b","subject_tree_hash":"9c50b2b32907fb02cb6ae3b02f8a7328ca6eaf4054b376100afa5591b5492007","subject_plugin_path":"skills/agentspace-so/image-to-video","audit_payload_hash":"57be4bbb51435f99c08544463eda8002","confirmed_risk_level":"high","scanner_version":"3.0.0","policy_version":"skillstore-security-audit-policy-v1","subject":{"marketplaceCommitSha":"181fdefcafd96b041926e61c4b2e306ca7e7820e","contentHash":"7a97ff688209d3cad39a9d84b284b209c3b3cdcc775fb91b4711b2eb1555ad7b","treeHash":"9c50b2b32907fb02cb6ae3b02f8a7328ca6eaf4054b376100afa5591b5492007","pluginPath":"skills/agentspace-so/image-to-video","auditPayloadHash":"57be4bbb51435f99c08544463eda8002"},"scannerVersion":"3.0.0","policyVersion":"skillstore-security-audit-policy-v1"},"auditTranslation":null,"localization":{"requestedLocale":"en","contentLocale":"en","availableLocales":["en"],"fallbackToEnglish":false},"attestation":{"availability":"issued","url":"/api/skills/agentspace-so-image-to-video/audits/5/attestation","status":"active"},"trust":{"publicState":"public","auditState":"complete","auditCurrentness":null,"confirmedRiskLevel":"high","confirmedFindingCount":3,"capabilityReviewCount":0,"needsReviewCount":0,"falsePositiveCount":0,"agentAutoInstallPolicy":"confirmation_required","manualInstallPolicy":"allowed","artifactSignatureState":"available","attestationState":"active","verificationState":"not_verified"},"isLatest":true}}