Back to skill

Security audit

Video Proof

Security checks for vulnerabilities and agentic risk

Overview

This skill is a plausible proof-recording tool, but it needs Review because its setup and proof scripts can run broad local commands, install system packages, and save sensitive proof data without enough guardrails.

Install only after reviewing the scripts. Run it in a development or disposable environment, use trusted proof specs only, avoid production or sensitive authenticated pages, and manually inspect or redact videos, screenshots, logs, and API results before committing. Prefer pinning dependencies and handling sudo/system package installation manually.

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

T09 · Insecure Skill Coding Practices

Error
Location
scripts/record-proof.js:42
Finding

Shell Command Injection Through Unvalidated Port Values

Content
View full analysis
Remediation
View remediation
65535) { throw new Error('start_port must be an integer between 1 and 65535'); } ``` ]]>

T09 · Insecure Skill Coding Practices

Error
Location
scripts/record-proof.js:211
Finding

Shell Command Injection Through the Output Directory During FFmpeg Conversion

Content
View full analysis
f.endsWith('.webm')); let hasVideo = false; if (videoFiles.length > 0) { const src = path.join(outputDir, videoFiles[0]); const dest = path.join(outputDir, 'video.webm'); if (src !== dest) fs.renameSync(src, dest); hasVideo = true; console.log(`[proof] Video saved: ${dest}`); try { const mp4 = path.join(outputDir, 'video.mp4'); execSync(`ffmpeg -y -i "${dest}" -c:v libx264 -crf 23 -preset fast -an "${mp4}" 2>/dev/null`); console.log(`[proof] MP4 converted: ${mp4}`); } catch { console.warn('[proof] ffmpeg not available or conversion failed — .webm still available'); } } ``` ### Technical Analysis The `--output` argument controls `outputDir`. Paths derived from it are inserted into an `execSync` command string. Wrapping a value in double quotes is not sufficient shell escaping: an output directory containing a double quote, command substitution, or other shell syntax can terminate or alter the quoted argument. The preceding `mkdirSync` operation does not prevent exploitation because Unix filesystems permit many shell metacharacters in directory names. Once video conversion occurs, the constructed FFmpeg command is interpreted by a shell. ### Attack Path 1. An attacker influences the invocation of `record-proof.js` or provides a malicious `--output` value. 2. The output path contains quote-breaking shell syntax and an injected command. 3. The script creates the output directory and records a WebM video. 4. During finalization, the path is interpolated into the FFmpeg command. 5. `execSync` invokes a shell, which interprets the injected syntax. 6. The attacker-controlled command executes with the proof process's privileges. ### Impact Assessment Exploitation permits arbitrary local command ...[truncated 257 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/record-proof.js:163
Finding

Arbitrary File Write Through Screenshot Name Path Traversal

Content
View full analysis
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
scripts/setup.sh:7
Finding

Mutable and Unlocked Dependency Installation Creates Supply-Chain Exposure

Content
View full analysis
Installing Node dependencies..." cd "$SCRIPT_DIR" if [ ! -f package.json ]; then npm init -y --silent > /dev/null 2>&1 fi npm install --save playwright@latest yaml@latest 2>&1 | tail -3 echo "==> Installing Playwright Chromium..." npx playwright install chromium 2>&1 | tail -3 echo "==> Installing Playwright system dependencies..." npx playwright install-deps chromium 2>&1 | tail -5 ``` ```json "dependencies": { "playwright": "^1.58.2", "yaml": "^2.8.2" } ``` No package lockfile was present in the audited directory structure. ### Technical Analysis The setup script explicitly requests mutable `latest` package releases. The manifest also permits compatible future versions through caret ranges, and the project does not include a lockfile to pin the complete dependency graph and integrity hashes. Consequently, identical setup commands can install different code over time. NPM package installation may also execute package lifecycle scripts. The Playwright setup subsequently downloads browser components and attempts system dependency installation, increasing the consequence of trusting mutable upstream content. This finding does not establish that the named packages are malicious. It identifies a reproducibility and supply-chain control weakness. ### Attack Path 1. A user follows the documented instruction to run `scripts/setup.sh`. 2. NPM resolves the current `latest` versions and a current transitive dependency graph. 3. Package contents and permitted lifecycle behavior execute or become locally available. 4. Playwright downloads browser components and initiates system dependency setup. 5. If an upstream account, release, package, or transitive dependency has been compromised, attacker-controlled code can execute during ins ...[truncated 492 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/api-proof.js:120
Finding

Sensitive API and Browser Data Can Be Persisted and Committed Without Redaction

Content
View full analysis
consoleLogs.push(`[${msg.type()}] ${msg.text()}`)); page.on('pageerror', err => consoleLogs.push(`[error] ${err.message}`)); ``` ```js fs.writeFileSync(path.join(outputDir, 'console.log'), consoleLogs.join('\n')); ``` The documented integration guidance states: ```text Commit proof-artifacts/ with your changes. ``` ### Technical Analysis The API proof script stores the first 2,000 characters of every response body in both Markdown and JSON without content classification or redaction. The browser proof script likewise persists browser console messages and page errors verbatim. Applications commonly expose tokens, personal information, internal identifiers, diagnostic details, or other confidential values in API responses and logs. Screenshots and video may also visually capture authenticated or sensitive application state. The documentation then instructs agents to commit the entire artifact directory, which can place captured information into long-lived repository history. # ...[truncated 1098 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Memory PoisoningPersistent Context Injection, Context Window Stuffing, Memory Manipulation
Findings (22)

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The declared description emphasizes visual proof artifacts: screen recordings, screenshots, and demonstrating software working after coding tasks. The supplied code instead implements an API/backend testing/proof script. It optionally launches a server via a shell command, waits for localhost readiness, performs HTTP requests, checks status/body assertions, and saves markdown and JSON summaries. While generating test logs/artifacts loosely aligns with 'proof,' the core purpose is materially different from video demo capture, and key declared capabilities (video recording and screenshots) are absent. The ability to spawn and terminate a server process is also an undeclared capability, though secondary to the main mismatch.

Content

No source excerpt is available for this finding.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 51)May include surrounding context.

md
node scripts/record-proof.js --spec proof-spec.yaml --output ./proof-artifacts

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 57)May include surrounding context.

md
node scripts/record-proof.js --spec proof-spec.yaml --output ./proof-artifacts

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 126)May include surrounding context.

md
For backend/API changes with no UI, use `api-proof.js`:

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 129)May include surrounding context.

md
For backend/API changes with no UI, use `api-proof.js`:

Chaining Abuse

High
Category
Tool Misuse
Confidence
75% confidence
Finding

Tool calls are chained to bypass individual safety checks or escalate capabilities beyond what any single tool call would allow.

Content

Scanner excerpt · scripts/setup.sh (reported line 26)May include surrounding context.

sh
else
  echo "    ffmpeg not found — attempting install..."
  if command -v apt-get &> /dev/null; then
    sudo apt-get update -qq && sudo apt-get install -y -qq ffmpeg
  elif command -v brew &> /dev/null; then
    brew install ffmpeg
  elif command -v dnf &> /dev/null; then

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
88% confidence
Finding

The --noconfirm parameter is a tool-abuse pattern because it suppresses safeguards in a system package manager and can force changes to the host without validation. In this script it is paired with sudo, making accidental or malicious misuse materially more dangerous due to privileged unattended execution.

Content

Scanner excerpt · scripts/setup.sh (reported line 32)May include surrounding context.

sh
elif command -v dnf &> /dev/null; then
    sudo dnf install -y ffmpeg
  elif command -v pacman &> /dev/null; then
    sudo pacman -S --noconfirm ffmpeg
  else
    echo "    ⚠ Could not install ffmpeg automatically. Install manually for mp4 conversion."
    echo "    Video recording still works (produces .webm without ffmpeg)."

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
95% confidence
Finding

The skill clearly instructs the agent to execute shell commands, start local servers, install dependencies, access the network, and produce artifacts, yet it declares no tool scope or allowed-tools restrictions. In an agent environment, this omission weakens policy enforcement and can lead to overbroad execution authority, especially because user-provided start commands are explicitly supported.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The trigger phrases include broad natural-language prompts like 'show me it working' and 'prove it works,' which can cause unintended invocation in unrelated contexts. Because this skill can install software, start services, visit URLs, and capture artifacts, accidental activation materially increases the chance of unnecessary command execution and data exposure.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

This skill records screens, screenshots, and console logs, which can easily capture secrets, tokens, personal data, internal URLs, or other sensitive information visible in the browser or emitted to logs. The absence of a prominent warning or redaction guidance is dangerous because the artifacts are explicitly intended to be committed and shared as PR evidence.

Content

No source excerpt is available for this finding.

Context Window Stuffing

Medium
Category
Memory Poisoning
Confidence
85% confidence
Finding

Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Content

Scanner excerpt · references/proof-spec.md (reported line 24)May include surrounding context.

md
steps:
    - goto: "/path"                   # Navigate (relative or absolute URL)
    - click: "text=Button"            # Playwright selector
    - fill:                           # Clear + fill input
        selector: "#email"
        value: "user@example.com"
    - type:                           # Keystroke-by-keystroke input

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The script executes a user-controlled start_command via spawn('sh', ['-c', spec.start_command]), which gives the skill arbitrary shell execution capability. In the context of an agent skill, this is more dangerous than ordinary local tooling because the command can come from spec/CLI input and the capability exceeds narrowly scoped API proof generation, enabling execution of unintended commands on the host.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
91% confidence
Finding

The script invokes npx playwright without pinning an exact package version for the executed CLI path, which allows the resolved package/code to change over time and creates supply-chain risk during setup. In a setup script that users are likely to run locally with broad system access, this is more dangerous because it directly downloads and executes remote package code before producing artifacts.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
91% confidence
Finding

The second npx playwright call also executes package-provided code without ensuring a fixed, preinstalled version is used, so behavior may drift and a compromised or unexpected package version could run during dependency installation. Because this command installs browser/system components, compromise here can have broad host impact in the context of a developer setup script.

Content

No source excerpt is available for this finding.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
94% confidence
Finding

The script uses sudo apt-get update and sudo apt-get install, which performs privileged system modification from a convenience setup script. Even if intended to help the user, embedding root-level package installation in an agent skill increases blast radius if the script or its dependencies are tampered with, especially since it also installs network-fetched components.

Content

Scanner excerpt · scripts/setup.sh (reported line 26)May include surrounding context.

sh
else
  echo "    ffmpeg not found — attempting install..."
  if command -v apt-get &> /dev/null; then
    sudo apt-get update -qq && sudo apt-get install -y -qq ffmpeg
  elif command -v brew &> /dev/null; then
    brew install ffmpeg
  elif command -v dnf &> /dev/null; then

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
90% confidence
Finding

sudo dnf install -y ffmpeg performs privileged package installation directly from the script, enabling root-level system changes in an automated workflow. In the context of a post-coding proof/demo skill, this functionality is not core to recording proof and therefore expands risk unnecessarily relative to the feature's purpose.

Content

Scanner excerpt · scripts/setup.sh (reported line 30)May include surrounding context.

sh
elif command -v brew &> /dev/null; then
    brew install ffmpeg
  elif command -v dnf &> /dev/null; then
    sudo dnf install -y ffmpeg
  elif command -v pacman &> /dev/null; then
    sudo pacman -S --noconfirm ffmpeg
  else

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
84% confidence
Finding

Using --noconfirm removes an interactive safety check and causes package installation to proceed automatically, reducing user awareness and increasing the chance of unintended system changes. In a skill setup script, autonomous package manager actions are riskier because users may run them as part of an agent workflow without carefully reviewing each privileged side effect.

Content

Scanner excerpt · scripts/setup.sh (reported line 32)May include surrounding context.

sh
elif command -v dnf &> /dev/null; then
    sudo dnf install -y ffmpeg
  elif command -v pacman &> /dev/null; then
    sudo pacman -S --noconfirm ffmpeg
  else
    echo "    ⚠ Could not install ffmpeg automatically. Install manually for mp4 conversion."
    echo "    Video recording still works (produces .webm without ffmpeg)."

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
93% confidence
Finding

sudo pacman -S --noconfirm ffmpeg combines root privilege with unattended package installation, making it easy to alter the host system without meaningful user review. This is especially concerning in an agent-driven setup path where commands may be triggered as part of automation and users may not realize they are authorizing privileged changes.

Content

Scanner excerpt · scripts/setup.sh (reported line 32)May include surrounding context.

sh
elif command -v dnf &> /dev/null; then
    sudo dnf install -y ffmpeg
  elif command -v pacman &> /dev/null; then
    sudo pacman -S --noconfirm ffmpeg
  else
    echo "    ⚠ Could not install ffmpeg automatically. Install manually for mp4 conversion."
    echo "    Video recording still works (produces .webm without ffmpeg)."

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
94% confidence
Finding

The dependency uses a caret range instead of an exact version, which allows different package versions to be installed over time. In a security-sensitive automation skill that records proofs and may run in CI, this reduces build reproducibility and can silently pull in vulnerable or behavior-changing releases.

Content

Scanner excerpt · scripts/package.json (reported line 14)May include surrounding context.

json
"license": "ISC",
  "type": "commonjs",
  "dependencies": {
    "playwright": "^1.58.2",
    "yaml": "^2.8.2"
  }
}

Unverifiable Dependency: playwright has 1 known advisory(ies) (CVE-2025-59288 (Playwright downloads and installs browsers without verifying the authenticity of)), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
80% confidence
Finding

Playwright has a referenced advisory involving browser downloads without authenticity verification, and the manifest does not pin a precise version, so it is impossible to verify whether installations are affected. In this skill's context, Playwright is directly relevant to automated browser recording and may fetch browser binaries during setup, making supply-chain and integrity issues more consequential than in a passive library.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
94% confidence
Finding

The yaml dependency is not pinned to a single exact version, so installs may vary between environments and time. Because YAML parsers often process untrusted or semi-trusted configuration data, drifting to a newly introduced vulnerable version can create avoidable exposure.

Content

Scanner excerpt · scripts/package.json (reported line 15)May include surrounding context.

json
"type": "commonjs",
  "dependencies": {
    "playwright": "^1.58.2",
    "yaml": "^2.8.2"
  }
}

Unverifiable Dependency: yaml has 2 known advisory(ies) (CVE-2026-33532 (yaml is vulnerable to Stack Overflow via deeply nested YAML collections); CVE-2023-2251 (Uncaught Exception in yaml)), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
83% confidence
Finding

The yaml package has known advisories, including denial-of-service conditions such as stack overflow or uncaught exceptions, and the unpinned range prevents confirming whether the installed version is safe. If this skill consumes YAML-based configuration or artifacts, malformed input could crash the process or disrupt automation pipelines.

Content

No source excerpt is available for this finding.

Static analysis

Detected: suspicious.dangerous_exec

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
scripts/api-proof.js:55

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
scripts/record-proof.js:45