Back to skill

Security audit

VN SKill for Windows

Security checks for vulnerabilities and agentic risk

Overview

This media-processing skill is mostly purpose-aligned, but it automatically downloads and silently installs an unverified Windows MSI without asking first.

Review before installing. Only use this skill if you are comfortable with it downloading and installing VN Tools CLI from GitHub and downloading some caption models on first use. Prefer a version that asks before installation and verifies the MSI hash and publisher signature.

Vulnerability Patterns
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (2)

T03 · Remote Payload Retrieval and Execution

Error
Location
scripts/vn-tools-cli-install.ps1.txt:89
Finding
Unverified Remote MSI Is Downloaded and Silently Executed<![CDATA[ ## Vulnerability Details **File Location**: `scripts/vn-tools-cli-install.ps1.txt:16, 89-119`; installation is automatically initiated by `SKILL.md:149-168` **Vulnerability Type**: Remote binary retrieval and execution without integrity or publisher verification **Risk Level**: High ### Vulnerable Code ```powershell $MsiVersion = '0.1.0.0' $MsiFilename = "vn-tools-cli_${MsiVersion}_windows_x64.msi" $MsiUrl = "https://github.com/cawcut/skill-vn/releases/download/0.1.0/${MsiFilename}" ``` ```powershell if (-not (Test-Path -LiteralPath $MsiPath)) { Write-Host "Downloading $MsiFilename ..." try { $curl = Get-Command 'curl.exe' -CommandType Application -ErrorAction SilentlyContinue | Select-Object -First 1 if (-not $curl) { throw 'curl.exe was not found on PATH.' } & $curl.Source '--location' '--fail' '--retry' '3' '--retry-all-errors' '--connect-timeout' $DownloadConnectTimeoutSeconds '--max-time' $DownloadMaxTimeSeconds '--retry-max-time' $DownloadRetryMaxTimeSeconds '--progress-bar' '--output' $MsiPath $MsiUrl if ($LASTEXITCODE -ne 0) { throw "curl.exe failed with exit code $LASTEXITCODE" } Write-Host '' } catch { Remove-Item -LiteralPath $MsiPath -ErrorAction SilentlyContinue Write-Error "Download failed: $_" exit 1 } Write-Host "Download complete." } else { Write-Host "MSI already downloaded: $MsiFilename" } Write-Host '' Write-Host 'Installing MSI (silent) ...' Remove-Item -LiteralPath $MsiLogPath -ErrorAction SilentlyContinue & msiexec.exe '/i' $MsiPath 'ALLUSERS=2' 'MSIINSTALLPERUSER=1' '/qn' '/l*v' $MsiLogPath ``` The corresponding automatic installation instruction is: ```powershell $src = "<skill-dir>\scripts\vn-tools-cli-install.ps1.txt" $dst = Join-Path $env:TEMP "vn-tools-cli-install.ps1" Copy-Item -LiteralPath $src -Destination $dst -Force powershell -NoProfile -ExecutionPolicy Bypass -File $dst ``` ...[truncated 2817 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Publish a trusted SHA-256 digest for the exact MSI and embed that expected value in the audited installer script. 2. After download and before execution, calculate the file digest with `Get-FileHash -Algorithm SHA256` and abort if it differs from the pinned value. 3. Validate the MSI's Authenticode signature with `Get-AuthenticodeSignature`. 4. Require a valid signature chain and compare the certificate identity or public-key fingerprint against a pinned expected publisher. 5. Perform both hash and publisher checks even when a previously downloaded MSI is present. 6. Download to a newly created private temporary directory rather than a reusable path. 7. Request explicit user approval before downloading and installing executable dependencies, showing the source, version, signer, and requested installation scope. 8. Avoid `ExecutionPolicy Bypass` unless it is strictly required. Sign the PowerShell installer or execute reviewed commands directly under the environment's normal policy. 9. Fail closed on redirects to unexpected hosts, signature-validation errors, digest mismatches, or unavailable verification services. 10. Consider packaging the reviewed binary with the skill or using a trusted package channel that provides immutable versions and cryptographic provenance. ]]>

T09 · Insecure Skill Coding Practices

Error
Location
scripts/vn-tools-cli-install.ps1.txt:22
Finding
Predictable Temporary MSI Path Permits Package Substitution<![CDATA[ ## Vulnerability Details **File Location**: `scripts/vn-tools-cli-install.ps1.txt:22-24, 89-119` **Vulnerability Type**: Unsafe temporary-file reuse and unvalidated cached executable content **Risk Level**: High ### Vulnerable Code ```powershell $DownloadDir = Join-Path $env:TEMP 'vn-tools-cli-install' $MsiPath = Join-Path $DownloadDir $MsiFilename $MsiLogPath = Join-Path $DownloadDir 'vn-tools-cli-install-msi.log' ``` ```powershell if (-not (Test-Path -LiteralPath $MsiPath)) { Write-Host "Downloading $MsiFilename ..." try { $curl = Get-Command 'curl.exe' -CommandType Application -ErrorAction SilentlyContinue | Select-Object -First 1 if (-not $curl) { throw 'curl.exe was not found on PATH.' } & $curl.Source '--location' '--fail' '--retry' '3' '--retry-all-errors' '--connect-timeout' $DownloadConnectTimeoutSeconds '--max-time' $DownloadMaxTimeSeconds '--retry-max-time' $DownloadRetryMaxTimeSeconds '--progress-bar' '--output' $MsiPath $MsiUrl if ($LASTEXITCODE -ne 0) { throw "curl.exe failed with exit code $LASTEXITCODE" } Write-Host '' } catch { Remove-Item -LiteralPath $MsiPath -ErrorAction SilentlyContinue Write-Error "Download failed: $_" exit 1 } Write-Host "Download complete." } else { Write-Host "MSI already downloaded: $MsiFilename" } Write-Host '' Write-Host 'Installing MSI (silent) ...' Remove-Item -LiteralPath $MsiLogPath -ErrorAction SilentlyContinue & msiexec.exe '/i' $MsiPath 'ALLUSERS=2' 'MSIINSTALLPERUSER=1' '/qn' '/l*v' $MsiLogPath ``` ### Technical Analysis The MSI is stored under a fixed directory and filename beneath `%TEMP%`. If a file already exists at that path, the installer skips downloading and treats the existing file as a trusted cached installer. No digest, digital signature, ownership, access-control, file-type, or reparse-point validation is performed before passing the file to `msi ...[truncated 2271 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Create a unique temporary directory for every installation using a cryptographically unpredictable name. 2. Apply restrictive ACLs so only the current user and necessary system principals can access the directory. 3. Create the destination with non-overwrite semantics and abort if an unexpected file already exists. 4. Do not reuse an MSI merely because a file with the expected name is present. 5. Verify a pinned SHA-256 digest and the expected Authenticode publisher immediately before installation. 6. Reject files or parent directories that are reparse points, symbolic links, or junctions. 7. Confirm that the temporary file is a regular file owned by the expected principal. 8. Minimize the interval between verification and execution, and prevent untrusted writers from modifying the file during that interval. 9. Remove temporary installation files in a `finally` block on both success and failure. 10. If caching is required, use an access-controlled cache and authenticate every cached artifact before each use. ]]>
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
Findings (16)

Description-Behavior Mismatch

High
Confidence
97% confidence
Finding
The skill advertises fully local, on-device processing and says URLs/cloud files are unsupported, but elsewhere instructs the agent to download installers, Whisper models, and user-provided files. This is a trust-boundary mismatch that can mislead users and downstream systems about network activity and data handling.

Context-Inappropriate Capability

High
Confidence
99% confidence
Finding
The skill instructs the agent to copy and execute a PowerShell installer script using ExecutionPolicy Bypass, and to do so automatically without user confirmation. This introduces arbitrary code execution and system modification behavior unrelated to merely analyzing media files, greatly expanding the attack surface if the bundled script or its supply chain is compromised.

Vague Triggers

Medium
Confidence
93% confidence
Finding
Broad triggers like 'edit video', 'process video', or reusing any referenced local media file can cause the skill to activate for requests outside its intended scope. In this skill, overbroad activation is more dangerous because activation can lead to automatic installation, downloads, and file processing side effects.

Intent-Code Divergence

Medium
Confidence
94% confidence
Finding
The skill says non-local inputs are not supported, but later instructs the agent to download files from URLs or chat attachments into a local working directory and reuse them. Such contradictory guidance can cause the agent to process remote content unexpectedly and undermines safe activation constraints.

Missing User Warnings

Medium
Confidence
98% confidence
Finding
The skill directs automatic installation and execution of a local script without a prominent safety warning or explicit consent, despite making persistent system changes. This weakens user awareness and approval for privileged actions, increasing the risk of unsafe execution in environments that assume skills are limited to task-specific processing.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
- **No file identified:** If the user requests an action but neither attaches a
file nor mentions a specific file, ask which file to process. If the user
clearly references a previous file (e.g. "compress the video I just sent"),
reuse it without asking.

### 1.4 Command quick reference
Confidence
75% confidence
Finding
Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Whitespace Padding

Medium
Category
Prompt Injection
Content
CLI binary: `& ${vn-tools-cli}` (resolved in § 1.1)


| Command          | Required args             | Key options                                                                                                                |
| ---------------- | ------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| `extract-audio`  | `<video>`                 | `-o <dir>` `-f mp3`                                                                                                        |
| `extract-frame`  | `<video>`                 | `-p first`                                                                                                                 |
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
| Command          | Required args             | Key options                                                                                                                |
| ---------------- | ------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| `extract-audio`  | `<video>`                 | `-o <dir>` `-f mp3`                                                                                                        |
| `extract-frame`  | `<video>`                 | `-p first`                                                                                                                 |
| `auto-captions`  | `<video>`                 | `-e <engine>` `-l <lang>` `-j <threads>` `[style flags]` `-o <dir>`                                                        |
| `add-caption`    | `<video> --srt <srt>`     | `--font-family` `--font-size` `--text-color` `--stroke-color` `--stroke-width` `--background-color` `--opacity` `-o <dir>` |
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
| Command          | Required args             | Key options                                                                                                                |
| ---------------- | ------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| `extract-audio`  | `<video>`                 | `-o <dir>` `-f mp3`                                                                                                        |
| `extract-frame`  | `<video>`                 | `-p first`                                                                                                                 |
| `auto-captions`  | `<video>`                 | `-e <engine>` `-l <lang>` `-j <threads>` `[style flags]` `-o <dir>`                                                        |
| `add-caption`    | `<video> --srt <srt>`     | `--font-family` `--font-size` `--text-color` `--stroke-color` `--stroke-width` `--background-color` `--opacity` `-o <dir>` |
| `compress-video` | `<video>`                 | `-r <resolution>` `--fps <fps>` `-b <kbps>` `--hdr` `-o <dir>`                                                             |
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
| Command          | Required args             | Key options                                                                                                                |
| ---------------- | ------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| `extract-audio`  | `<video>`                 | `-o <dir>` `-f mp3`                                                                                                        |
| `extract-frame`  | `<video>`                 | `-p first`                                                                                                                 |
| `auto-captions`  | `<video>`                 | `-e <engine>` `-l <lang>` `-j <threads>` `[style flags]` `-o <dir>`                                                        |
| `add-caption`    | `<video> --srt <srt>`     | `--font-family` `--font-size` `--text-color` `--stroke-color` `--stroke-width` `--background-color` `--opacity` `-o <dir>` |
| `compress-video` | `<video>`                 | `-r <resolution>` `--fps <fps>` `-b <kbps>` `--hdr` `-o <dir>`                                                             |
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
| `auto-captions`  | `<video>`                 | `-e <engine>` `-l <lang>` `-j <threads>` `[style flags]` `-o <dir>`                                                        |
| `add-caption`    | `<video> --srt <srt>`     | `--font-family` `--font-size` `--text-color` `--stroke-color` `--stroke-width` `--background-color` `--opacity` `-o <dir>` |
| `compress-video` | `<video>`                 | `-r <resolution>` `--fps <fps>` `-b <kbps>` `--hdr` `-o <dir>`                                                             |
| `compress-image` | `<image>`                 | `-f jpeg`                                                                                                                  |
| `concat-video`   | `<video1> <video2> [...]` | `-o <dir>`                                                                                                                 |
| `denoise`        | `<audio \| video>`        |                                                                                                                            |
| `cutout-video`   | `<video>`                 | `--feather <0-100>` `--expand <-20..20>` `-f mp4`                                                                          |
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
| `compress-video` | `<video>`                 | `-r <resolution>` `--fps <fps>` `-b <kbps>` `--hdr` `-o <dir>`                                                             |
| `compress-image` | `<image>`                 | `-f jpeg`                                                                                                                  |
| `concat-video`   | `<video1> <video2> [...]` | `-o <dir>`                                                                                                                 |
| `denoise`        | `<audio \| video>`        |                                                                                                                            |
| `cutout-video`   | `<video>`                 | `--feather <0-100>` `--expand <-20..20>` `-f mp4`                                                                          |
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.

Context-Inappropriate Capability

Medium
Confidence
91% confidence
Finding
The skill presents itself as a local tool with no cloud/API requirements, yet it depends on network downloads for software installation and Whisper model retrieval. While not inherently malicious, this hidden network dependency can surprise users, fail in restricted environments, and create supply-chain exposure.

Description-Behavior Mismatch

Medium
Confidence
97% confidence
Finding
The documentation states that all processing runs locally and implies no cloud/network involvement, but the auto-captions feature requires one-time downloads for several Whisper engines. This can mislead users operating in offline, restricted, or privacy-sensitive environments into invoking a command that unexpectedly makes network requests, violating deployment assumptions and potentially exposing metadata such as IP address or download activity.

Description-Behavior Mismatch

Medium
Confidence
95% confidence
Finding
The script downloads an MSI from GitHub at runtime even though the skill is described as local-only processing with no cloud/API dependency. This creates a supply-chain and transparency risk: users or downstream systems may trust the skill as purely local while it performs network retrieval and executes newly downloaded software without any integrity verification such as a pinned hash or signature check.

Context-Inappropriate Capability

Medium
Confidence
90% confidence
Finding
The script silently installs software via msiexec using a downloaded MSI, which expands the skill from media processing into code acquisition and execution on the host. In this context, that is security-relevant because installation is a privileged persistence-enabling action and, if the download source or release artifact is compromised, it can lead to arbitrary code execution under the user context.

Static analysis

No suspicious patterns detected.