Back to skill

Security audit

Tracked Video Analysis

Security checks for vulnerabilities and agentic risk

Overview

This is a coherent local video transcription and summarization skill, with some practical setup and file-handling cautions but no evidence of hidden exfiltration, persistence, privilege escalation, or deceptive behavior.

Install only if you are comfortable with local video/audio content being written into tmp/video_analysis/ as transcript and progress files. Run it in a dedicated private working directory, avoid shared or untrusted folders, review outputs before overwriting prior work, and prefer pinned dependencies/model artifacts if you need stronger reproducibility.

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

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/transcribe_tracked_light.mjs:7
Finding

Predictable Output Files Are Overwritten Without Symlink or Path Validation

Content
View full analysis

Vulnerability Details

File Location: scripts/transcribe_tracked_light.mjs:7-20, 33-35, 53, 65, 67-68; scripts/final_structurer.py:4-8, 24-27, 31-32, 118-120
Vulnerability Type: Unsafe file handling and predictable workspace files
Risk Level: Medium

Vulnerable Code

scripts/transcribe_tracked_light.mjs:7-20:

javascript
const BASE = process.argv[2] || process.cwd();
const VIDEO = `${BASE}/video.mp4`;
const OUTPUT = `${BASE}/transcript.jsonl`;
const STATUS = `${BASE}/status.json`;
const ANALYSIS = `${BASE}/analysis.md`;
const LOG = `${BASE}/progress.log`;
const CHUNK = 15;
const MODEL = 'Xenova/whisper-tiny';

function writeStatus(patch) {
  let current = {};
  try { current = JSON.parse(fs.readFileSync(STATUS, 'utf8')); } catch {}
  fs.writeFileSync(STATUS, JSON.stringify({ ...current, ...patch, updatedAt: new Date().toISOString() }, null, 2));
}
function log(line) { fs.appendFileSync(LOG, line + '\n'); }

scripts/transcribe_tracked_light.mjs:33-35:

javascript
fs.writeFileSync(OUTPUT, '');
fs.writeFileSync(LOG, '');
fs.writeFileSync(ANALYSIS, '# Video analysis\n\n_In progress..._\n');

scripts/final_structurer.py:24-32:

python
def write_status(**patch):
    current = {}
    if STATUS.exists():
        try:
            current = json.loads(STATUS.read_text())
        except Exception:
            current = {}
    current.update(patch)
    current['updatedAt'] = time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime())
    STATUS.write_text(json.dumps(current, ensure_ascii=False, indent=2))

def log(msg):
    with LOG.open('a', encoding='utf-8') as f:
        f.write(msg + '\n')

Technical Analysis

The JavaScript script accepts its base directory directly from a command-line argument and constructs all input and output paths through string concatenation. Neither script validates that its destination paths resolve inside an app ...[truncated 2266 chars]

Remediation
View remediation

Remediation Suggestions

  1. Resolve the requested base directory with realpath and require it to be a descendant of a dedicated, trusted workspace.
  2. Inspect every existing destination with lstat and reject symbolic links, non-regular files, and paths whose resolved parent escapes the approved workspace.
  3. Create a private per-run directory with restrictive permissions rather than relying on fixed filenames in a shared directory.
  4. Write status and analysis artifacts to temporary files in the same directory, flush them, and atomically rename them into place.
  5. Use exclusive creation where replacement is unnecessary and explicitly control file permissions.
  6. Do not truncate existing transcripts or logs automatically. Detect prior output, support deliberate resume behavior, or require an explicit overwrite option.
  7. Validate that video.mp4 is a regular file before creating or truncating any output.
  8. Apply the same checks to temporary chunk files, including chunk_<start>.wav, and clean them up through a protected per-run directory.

T08 · Insecure Dependencies

Warning
Location
scripts/transcribe_tracked_light.mjs:1
Finding

Third-Party Packages and Runtime Model Artifacts Are Not Version or Integrity Pinned

Content
View full analysis

Vulnerability Details

File Location: SKILL.md:31-38; scripts/transcribe_tracked_light.mjs:1-5, 13, 39
Vulnerability Type: Unpinned software dependencies and remotely resolved model artifacts
Risk Level: Medium

Vulnerable Code and Instructions

SKILL.md:31-38:

markdown
### 2) Prepare local tools without root

Prefer workspace-local packages over system installs.

Useful local tools:

- `ffmpeg-static`
- `ffprobe-static`
- `@xenova/transformers`
- `wavefile`

scripts/transcribe_tracked_light.mjs:1-5, 13, 39:

javascript
import { pipeline } from '@xenova/transformers';
import { execFileSync } from 'child_process';
import ffmpegPath from 'ffmpeg-static';
import fs from 'fs';
import pkg from 'wavefile';

const MODEL = 'Xenova/whisper-tiny';

const transcriber = await pipeline('automatic-speech-recognition', MODEL, { quantized: true });

Technical Analysis

The Skill instructs users or Agents to install several npm packages but supplies no manifest, exact versions, lockfile, approved registry configuration, or integrity hashes. Consequently, installation at different times can resolve materially different package versions from the package registry.

The speech-recognition model is also identified only by the mutable name Xenova/whisper-tiny. The pipeline may retrieve model artifacts at runtime, but the script does not specify an immutable model revision or verify expected artifact hashes. This makes the reviewed source insufficient to guarantee which external artifacts will be used during a future run.

No evidence establishes that the currently named packages or model are malicious. The vulnerability is the absence of reproducible dependency resolution and integrity enforcement, which increases exposure to package-registry compromise, maintainer-account compromise, malicious updates, dependency confusion caused by unsafe registry configuration, and unexpected mode ...[truncated 1506 chars]

Remediation
View remediation

Remediation Suggestions

  1. Add a package manifest and committed lockfile generated by a supported package manager.
  2. Pin every direct dependency to an exact reviewed version rather than a range or latest release.
  3. Use deterministic installation, such as npm ci, and reject lockfile drift in automated workflows.
  4. Configure an explicit approved registry and prevent fallback to untrusted scopes or registries.
  5. Retain and verify package integrity metadata and monitor dependencies for advisories and unexpected ownership changes.
  6. Pin Xenova/whisper-tiny to an immutable reviewed repository revision or commit.
  7. Record and verify hashes for all expected model files before loading them.
  8. Cache reviewed artifacts in a controlled repository where practical and document all required network endpoints.
  9. Run package installation and transcription in a sandbox with minimum filesystem access, no unnecessary credentials, and restricted outbound networking.
  10. Review and update pinned components through a controlled process rather than resolving mutable releases automatically.
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (6)

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
84% confidence
Finding

The skill explicitly instructs reading and writing multiple workspace files but does not declare any tool scope or permissions boundary. That mismatch can cause the agent to invoke file capabilities more broadly than users or orchestration layers expect, increasing the chance of unintended file access or modification in a workflow that handles local files and progress artifacts.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The description contains broad triggers like analyzing local or linked video files, extracting features, organizing summaries, and handling inaccessible media, which can match many ordinary user requests. Over-broad activation is risky because it may cause this skill to engage in contexts where file access and local processing are unnecessary, expanding exposure to local content and increasing the chance of unintended side effects.

Content

No source excerpt is available for this finding.

Ae4

Medium
Category
analysis-evasion
Confidence
80% confidence
Finding

Suspicious Unicode normalization or mixed-script content

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The file embeds Russian-language keywords, section titles, status messages, and output text, which effectively forces a specific language/locale for processing and presentation. There is no natural-language indication that users can choose another language or that the Russian-only behavior is intentionally limited to a region-specific use case.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The script immediately overwrites transcript, log, analysis, and status-related files and later appends extracted speech content to disk. While logging exists, it is internal file logging rather than a user-facing disclosure, and there is no prompt, comment, or docstring warning that audio content and progress data will be persisted.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The code hard-codes language: 'russian' for transcription, which imposes a specific locale without any visible opt-in or explanation. This can violate language/locale policy when users are not offered a choice and the skill is not clearly documented as region- or language-specific.

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/transcribe_tracked_light.mjs:25