Back to skill

Security audit

Youtube Transcriber

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly matches its YouTube transcription purpose, but its script has unsafe path handling that can let a crafted output filename run local code or overwrite files.

Install only if you are comfortable reviewing or fixing the shell script first. Avoid using untrusted or unusual --out paths, do not run it on sensitive videos unless you accept audio being sent to OpenAI during fallback, and prefer pinned, verified dependency installs.

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

T09 · Insecure Skill Coding Practices

Error
Location
scripts/transcribe.sh:117
Finding

Python Code Injection Through the User-Controlled Output Path

Content
View full analysis
', '', line) # Remove HTML tags line = re.sub(r'<[^>]+>', '', line) # Deduplicate if line not in seen: seen.add(line) lines.append(line) text = ' '.join(lines) # Clean up whitespace text = re.sub(r'\s+', ' ', text).strip() with open('$OUT_FILE', 'w') as f: f.write(text + '\n') print(f'Transcript saved ({len(text)} chars)', file=sys.stderr) " 2>&1 ``` ### Technical Analysis The `--out` option is accepted as user-controlled input and stored in `OUT_FILE`. The value is subsequently interpolated directly into the source text passed to `python3 -c`. Shell quoting does not make this value safe in the generated Python program. An output path containing a single quote and additional Python syntax can terminate the string literal in: ```python with open('$OUT_FILE', 'w') as f: ``` The remainder of the supplied value can then introduce arbitrary Python statements. The injected Python runs with the same operating-system identity, filesystem permissions, environment, and network access as the transcription script. The vulnerability is reached when the subtitle fast path successfully downloads a nonempty VTT file. It does not require the OpenAI fallback path. ### ...[truncated 1016 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/transcribe.sh:228
Finding

Predictable Shared Temporary Paths Allow Symlink-Based File Overwrites

Content
View full analysis
>> Audio ${AUDIO_SIZE} bytes, compressing to mono ${AUDIO_BITRATE}kbps..." >&2 $FFMPEG -i "$AUDIO_ACTUAL" -b:a "${AUDIO_BITRATE}k" -ac 1 "$AUDIO_COMPRESSED" -y 2>/dev/null WHISPER_INPUT="$AUDIO_COMPRESSED" else WHISPER_INPUT="$AUDIO_ACTUAL" fi FINAL_SIZE=$(stat -f%z "$WHISPER_INPUT" 2>/dev/null || stat -c%s "$WHISPER_INPUT" 2>/dev/null) if [[ "$FINAL_SIZE" -gt "$MAX_SIZE" ]]; then echo ">>> Still too large, compressing to 32kbps..." >&2 $FFMPEG -i "$AUDIO_ACTUAL" -b:a 32k -ac 1 "${AUDIO_COMPRESSED}.low.m4a" -y 2>/dev/null WHISPER_INPUT="${AUDIO_COMPRESSED}.low.m4a" fi ``` ```bash echo "$RESULT" > "$OUT_FILE" if [[ "$KEEP_AUDIO" == false ]]; then rm -f "$AUDIO_RAW" "$AUDIO_ACTUAL" "$AUDIO_COMPRESSED" "${AUDIO_COMPRESSED}.low.m4a" 2>/dev/null else echo ">>> Audio kept at: ${WHISPER_INPUT}" >&2 fi ``` ### Technical Analysis Temporary and default output names are derived deterministically from the public YouTube video ID and placed directly in the shared `/tmp` directory. The script does not create these files atomically, verify ownership, reject symbolic links, or isolate them in a private temporary directory. A local attacker who can write to `/tmp` can predict the filenames before execution and create symbolic links at those locations. The shell redirection used to save the transcript follows symbolic links. The `ffmpeg -y` operations also explicitly permit replacing existing destinations. This is a time-of-check/time-of-use and unsafe-temporary-file flaw. ...[truncated 1362 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
README.md:15
Finding

Unpinned Package Installation Commands Create Supply-Chain Exposure

Content
View full analysis
Remediation
View remediation
--hash=sha256: ``` 3. Avoid recommending unconditional `pip install -U` as a troubleshooting step. Specify a known-good minimum or exact version instead. 4. Pin the ClawHub package version where the package manager supports version selection. 5. Document trusted package sources and advise installation in an isolated virtual environment. 6. Maintain a dependency update process that reviews release notes, provenance, integrity metadata, and transitive dependency changes before updating the pinned versions. ]]>
Vulnerability Patterns
  • 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
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (8)

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The README states that when subtitles are unavailable, the skill downloads audio and sends it to the OpenAI Whisper API, but it does not give a clear privacy or data-transmission warning near the workflow description. Users may unknowingly upload potentially sensitive audio content or copyrighted material to a third-party service, creating confidentiality, compliance, or policy risks. This skill's purpose makes the issue more significant because external transmission is a core fallback behavior, not an edge case.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
88% confidence
Finding

The README instructs users to run npx clawhub install youtube-transcriber without pinning a specific version. This can cause users to execute whatever package version is current at install time, increasing supply-chain risk if the package is compromised, typosquatted, or publishes a malicious update. In the context of an install command, this is more dangerous because it directly encourages code execution on the user's machine.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
84% confidence
Finding

The skill advertises shell, file read, and file write behavior but does not declare any tool scope or permission boundaries. That creates an authorization and review gap: users and orchestrators cannot clearly see what capabilities the skill may exercise, increasing the chance of unintended command execution, file access, or unsafe composition with other agent behaviors.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The invocation text uses broad trigger phrases such as 'transcribe this video' and 'what does this video say,' which can overlap with ordinary conversation and cause the skill to activate unexpectedly. In context, unexpected activation is risky because the skill can invoke shell commands, download remote content, write files, and potentially send audio to a third-party API without a deliberate, informed user action.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The description says the skill transcribes with OpenAI Whisper API but does not clearly foreground that audio content may be uploaded to a third party when captions are unavailable. This is a real privacy and data-handling risk because users may assume transcription is local, while the skill can transmit potentially sensitive spoken content from arbitrary videos to an external service.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The script uploads audio content to the OpenAI Whisper API, but the help text does not clearly warn users that video audio may be transmitted to a third-party service. In an agent setting, this can cause unintentional disclosure of sensitive spoken content, especially if users assume processing is local or are not aware of fallback behavior when subtitles are unavailable.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
88% confidence
Finding

This code performs external transmission of downloaded audio to https://api.openai.com/v1/audio/transcriptions. While expected for a Whisper-based transcription feature, it is security-relevant because the transmitted media may contain sensitive personal, confidential, or regulated content, and in this skill context the transfer is automatic once subtitle fallback occurs.

Content

Scanner excerpt · scripts/transcribe.sh (reported line 209)May include surrounding context.

sh
CURL_ARGS=(
  -s
  -X POST
  "https://api.openai.com/v1/audio/transcriptions"
  -H "Authorization: Bearer ${OPENAI_API_KEY}"
  -F "file=@${WHISPER_INPUT}"
  -F "model=whisper-1"

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
78% confidence
Finding

The script defaults to saving a transcript under /tmp and later writes to the user-specified output path, but the usage text only describes the option names and does not warn that a local file will be created or overwritten. Although stderr progress messages exist, they do not disclose this behavior until execution is already underway, so the user lacks clear advance notice.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.