Back to skill

Security audit

Video Summary

Security checks for vulnerabilities and agentic risk

Overview

The skill is mostly a video transcription and summary helper, but it under-discloses cookie use and leaves sensitive transcript data in unsafe temporary paths.

Review before installing if you may process private videos, meeting recordings, or account-restricted content. Use cookies only when necessary, assume matching platform cookies may be sent to those platforms by yt-dlp, and avoid running this on shared systems until the temporary-file handling is fixed with private mktemp directories and reliable recursive cleanup.

Vulnerability Patterns
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (3)

T09 · Insecure Skill Coding Practices

Error
Location
video-summary.sh:374
Finding

Predictable Temporary Transcript Path Allows Symlink-Based File Overwrite

Content
View full analysis
"$temp_file" TEMP_FILES+=("$temp_file") ``` ### Technical Analysis The script writes potentially sensitive transcript content to a predictable path based only on the process ID. It does not use atomic temporary-file creation, exclusive-open semantics, a private temporary directory, or a symlink check. On systems that do not enforce protections such as `fs.protected_symlinks`, another local user can predict or observe the process ID and create the expected path as a symbolic link before the redirection occurs. Shell redirection follows the link and writes the transcript into the linked destination. The permissions of the created file are also governed only by the caller's current `umask`. The script does not ensure that transcripts are readable only by the current user. ### Attack Path 1. A local attacker predicts or observes the PID of an upcoming `video-summary.sh` process. 2. The attacker creates `/tmp/video-summary-transcript-` as a symbolic link to a file writable by the victim. 3. The victim invokes the Skill and requests a summary. 4. `call_llm` executes `echo "$transcript" > "$temp_file"`. 5. The shell follows the attacker-created symbolic link. 6. The linked target is truncated and overwritten with transcript content. Modern operating-system symlink protections may block this attack in some configurations, but the script must not rely on optional host-level mitigation. ### Impact Assessment A local attacker may overwrite or corrupt an arbitrary file that the victim account is authorized to write. The attack does not directly grant root privileges unless the Skill is already running with elevated privileges, but its impact inherits all filesystem permissions of t ...[truncated 145 chars]
Remediation
View remediation
"$temp_file" ``` Additional hardening should include: 1. Use one `mktemp -d` workspace for all temporary artifacts. 2. Ensure the directory has mode `0700` and files have mode `0600`. 3. Never construct temporary paths from only `$$`, timestamps, or other predictable values. 4. Do not follow user-controlled symbolic links. 5. Use `printf` instead of `echo` when writing untrusted or arbitrary transcript data. 6. Remove the private workspace recursively during exit handling. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
video-summary.sh:35
Finding

Whisper Transcript Directories and Sensitive Files Persist After Exit

Content
View full analysis
/dev/null || true fi } trap cleanup EXIT ``` Remote-video transcription creates and registers a directory: ```bash local output_dir="/tmp/video-summary-$$" mkdir -p "$output_dir" TEMP_FILES+=("$output_dir") ``` Local-file transcription does the same: ```bash local output_dir="/tmp/video-summary-local-$$" mkdir -p "$output_dir" TEMP_FILES+=("$output_dir") ``` ### Technical Analysis Whisper writes plaintext transcript files into the output directories. Those directories are added to `TEMP_FILES`, but the exit handler invokes `rm -f`, which does not remove directories or their contents. Because errors are redirected and suppressed with `|| true`, this cleanup failure is silent. As a result, directories such as `/tmp/video-summary-` and `/tmp/video-summary-local-` can remain after both successful and failed executions. The directories are created with ordinary `mkdir -p`, without explicitly enforcing mode `0700`. Their effective permissions depend on the user's `umask`. On a shared host, this can make private transcripts accessible to other local accounts. This behavior also contradicts the documentation's claim of automatic cleanup with no temporary-file leakage. ### Attack Path 1. A victim transcribes a private local file or an authenticated remote video. 2. Whisper creates one or more plaintext transcript files under a predictable directory in `/tmp`. 3. The Skill exits and invokes `cleanup`. 4. `rm -f` receives the directory path and fails to remove it. 5. The failure is discarded because stderr is redirected and the command is followed by `|| true`. 6. A local attacker enumerates predictable `/tmp ...[truncated 546 chars]
Remediation
View remediation

other

Warning
Location
SKILL.md:9
Finding

Cookie Security Declaration Misrepresents Outbound Session-Cookie Use

Content
View full analysis
/dev/null) ``` The same cookie argument is also used for subtitle and media downloads. ### Technical Analysis The script does not upload the cookie file as a standalone file. However, `yt-dlp --cookies` reads that file and attaches applicable cookie values to outbound HTTP requests according to cookie domain, path, security, and expiry rules. Consequently, session tokens from the cookie file are transmitted over the network to matching video-platform endpoints. This network use can be legitimate and necessary to access restricted content, but the categorical statement that cookies are “never transmitted externally” is inaccurate. The script also builds cookie arguments as a single unquoted string. Subsequent unquoted expansion applies shell word splitting and pathname expansion, so cookie paths containing whitespace or wildcard characters may be misparsed. Argument arrays shoul ...[truncated 1188 chars]
Remediation
View remediation
The script passes the selected cookie file to `yt-dlp`. Applicable cookie values may be included in requests to matching video-platform domains. The cookie file is not intentionally uploaded as a standalone file. Harden cookie handling as follows: ```bash cookie_args=() if [[ -n "$COOKIE_FILE" ]]; then [[ -f "$COOKIE_FILE" ]] || { printf 'Cookie file not found\n' >&2 exit 1 } cookie_args=(--cookies "$COOKIE_FILE") fi yt-dlp "${cookie_args[@]}" --dump-json --no-download "$url" ``` Additional controls should include: 1. Keep cookie use explicitly opt-in. 2. Warn users that browser exports contain active session credentials. 3. Recommend short-lived, minimally privileged, platform-specific cookies. 4. Require HTTPS for remote inputs before using cookies. 5. Validate remote URLs against explicitly supported platform hosts. 6. Document redirect and third-party downloader behavior accurately. 7. Use shell arrays for every optional argument to prevent word splitting and pathname expansion. 8. Avoid claiming that sensitive values remain local when a dependency uses them for authenticated network requests. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Rogue AgentSelf-Modification, Session Persistence
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (10)

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The code largely aligns with the stated domain of video transcription/summarization across the listed platforms, but there are material differences. Most importantly, the script does not itself perform AI summarization: its call_llm function only writes the transcript to a temp file and prints a structured request for an external agent/tool to send to an API later. That is meaningfully different from a direct 'extract insights through transcription and summarization' capability. It also supports local file transcription/summarization, which is an undeclared capability, and includes a transcript-only extraction mode. These are not merely implementation details because they change the user-visible behavior and scope of the skill.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The manual trigger phrase 'help me configure video-summary' is broad enough to overlap with ordinary support dialogue, which can cause the skill to activate unexpectedly. Unintended activation matters here because the skill can access URLs, local files, optional cookie files, and produce outputs that may lead an agent into networked summarization workflows.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The invocation guidance 'Summarize this video: [URL]' is generic and may match normal user requests that were not intended to invoke this specific skill. In an agent environment, ambiguous routing can trigger downloads, transcript extraction, or downstream external summarization without sufficiently explicit user intent.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

md
# Optional: Custom API endpoint (for non-OpenAI providers)
export OPENAI_BASE_URL=https://open.bigmodel.cn/api/paas/v4  # Zhipu
# export OPENAI_BASE_URL=https://api.deepseek.com/v1        # DeepSeek
# export OPENAI_BASE_URL=https://api.moonshot.cn/v1          # Moonshot

# Optional: Model selection

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

md
# Optional: Custom API endpoint (for non-OpenAI providers)
export OPENAI_BASE_URL=https://open.bigmodel.cn/api/paas/v4  # Zhipu
# export OPENAI_BASE_URL=https://api.deepseek.com/v1        # DeepSeek
# export OPENAI_BASE_URL=https://api.moonshot.cn/v1          # Moonshot

# Optional: Model selection
export OPENAI_MODEL=gpt-4o-mini

Session Persistence

Medium
Category
Rogue Agent
Confidence
60% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

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

Custom Summary Prompt

Create ~/.video-summary/prompt.txt:

markdown
# Summary Template

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

md
| Variable | Default | Description |
|----------|---------|-------------|
| `OPENAI_API_KEY` | - | **Optional** - API key for LLM summarization (used by agent, not this script) |
| `OPENAI_BASE_URL` | `https://api.openai.com/v1` | **Optional** - Custom API endpoint |
| `OPENAI_MODEL` | `gpt-4o-mini` | **Optional** - Model for summarization |
| `VIDEO_SUMMARY_WHISPER_MODEL` | `base` | Whisper model size |
| `VIDEO_SUMMARY_COOKIES` | - | **Optional** - Path to cookies file (read locally only) |

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The estimated-time output is emitted only in Chinese ("约 ... 分钟"), and several operational status/error messages elsewhere are also Chinese-only. The file does not provide any user opt-in or locale-selection mechanism for interface language, which creates a language policy concern for a general-purpose skill.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Low
Category
Not specified by scanner
Confidence
83% confidence
Finding

The manifest describes a skill for summarizing videos from specific online platforms, but the script explicitly accepts local files as input and can output raw transcript text without summarization. Those behaviors extend beyond the manifest's stated scope of extracting insights through transcription and summarization for the named platforms.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Low
Category
Not specified by scanner
Confidence
71% confidence
Finding

Instead of only producing a summary workflow artifact, the code emits the full API endpoint and model selection into the output request template. While related to implementation, exposing LLM backend routing details is not necessary to the user-facing purpose of video summarization and broadens the skill's capability surface.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.