Back to skill

Security audit

Douyin Video To Txt

Security checks for vulnerabilities and agentic risk

Overview

The skill has a coherent video-to-transcript purpose, but its instructions include unsafe code templating and silent writes to an Obsidian vault that warrant review before installation.

Review this skill carefully before installing. Use it only with videos and metadata you trust, confirm the Obsidian destination before any write, avoid overwriting existing notes, and prefer a safer implementation that passes metadata through JSON or arguments instead of interpolating it into Python code.

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)

T08 · Insecure Dependencies

Warning
Location
SKILL.md:18
Finding

Unpinned Third-Party Dependency Installation

Content
View full analysis
/dev/null pip3 install faster-whisper 2>&1 | tail -3 ``` ### Technical Analysis The Skill directs users or agents to install `yt-dlp`, `ffmpeg`, and `faster-whisper` without pinning reviewed versions, verifying package hashes, or using a dependency lock file. In particular, `pip3 install faster-whisper` may execute package-controlled installation or build logic with the privileges of the invoking user. The commands rely on the current state of external package repositories and their transitive dependency resolution. Consequently, the code installed during a future invocation may differ from the code that existed when the Skill was reviewed. This does not prove that any named package is malicious. The vulnerability is the absence of controls that would constrain dependency identity and content to reviewed artifacts. ### Attack Path 1. An attacker compromises an upstream package, release account, package repository, distribution channel, or transitive dependency. 2. A user or agent follows the Skill instructions and runs the unpinned Homebrew or pip installation command. 3. The package manager resolves the dependency to the attacker-influenced version. 4. Package installation or subsequent execution runs attacker-controlled code. 5. The code executes with the permissions of the account that invoked the installation or tool. ### Impact Assessment Su ...[truncated 522 chars]
Remediation
View remediation
/dev/null` and `tail -3` can hide warnings relevant to dependency integrity. ]]>

T09 · Insecure Skill Coding Practices

Error
Location
SKILL.md:118
Finding

Python Code Injection Through Unescaped Video Metadata

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:108
Finding

Existing Obsidian Notes Can Be Silently Overwritten Through Filename Collisions

Content
View full analysis
|]/_/g' | cut -c1-60) NOTE_PATH="$TARGET_DIR/${SAFE_TITLE}.md" python3 << 'PYEOF' import os url = "{DOUYIN_URL}" title = """{TITLE}""" uploader = "{UPLOADER}" date = "{UPLOAD_DATE}" duration = "{DURATION}" with open('/tmp/douyin_analysis/{VIDEO_ID}/text_plain.txt', 'r', encoding='utf-8') as f: plain_text = f.read() note = f"""--- source: 抖音 url: {url} author: {uploader} date: {date} duration: {duration}s tags: [抖音转录, {uploader}] --- # {title} **来源:** [抖音]({url}) | **作者:** {uploader} | **时长:** {duration}s --- ## 文字稿 {plain_text} """ with open('{NOTE_PATH}', 'w', encoding='utf-8') as f: f.write(note) PYEOF ``` ### Technical Analysis The destination filename is derived from the video title by replacing a limited set of characters and truncating the result to 60 characters. This transformation is not unique: different titles can produce the same sanitized filename, and titles sharing the same first 60 characters necessarily collide. The file is then opened using Python's `w` mode. That mode truncates an existing file before writing and provides no warning or confirmation. A collision can therefore destroy an existing Obsidian note. The sanitization also does not address empty or ambiguous names, trailing whitespace or dots on relevant filesystems, reserved filenames, normalization collisions, or concurrent invocations. The quoted heredoc means literal shell expansion of `$NOTE_PATH` does not occur in the shown command; nevertheless, the documented design explicitly calls for materializing `{NOTE_PATH}`, and that destina ...[truncated 1254 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (6)

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

L012 states '纯本地运行,不需要任何外部 API Key', which conveys a local-only execution model. However, the documented commands download Douyin videos via yt-dlp and the notes state faster-whisper will download a model from HuggingFace on first run, so the skill is not purely local in operation.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The skill writes derived content into the user's Obsidian vault, a persistent personal knowledge store, without a prominent warning or explicit confirmation step. Because the content comes from external media metadata and transcribed text, this can unexpectedly persist untrusted or sensitive material into user-managed notes and may overwrite existing files if titles collide.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

Appending AI-generated summaries to existing Obsidian notes modifies stored user content without a strong warning or explicit approval flow. This can silently alter curated notes, introduce inaccurate generated text into a trusted knowledge base, and compound damage if the note path was chosen incorrectly or collided with an existing file.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
90% confidence
Finding

The transcription command hard-codes language='zh', which enforces a specific language/locale behavior. The file does not offer a language choice or explain that the skill is intentionally limited to Chinese-only input as a documented regional specialization.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
89% confidence
Finding

The complete example repeats the locale restriction by setting language='zh' in the sample transcription code. Because the skill description does not present this as an optional or explicitly justified regional constraint, it constitutes the same natural-language locale policy issue in the example path.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
92% confidence
Finding

Earlier sections describe writing a per-video Markdown note with metadata and transcript into the Obsidian vault. But the '完整示例' implementation ends by copying text_plain.txt to '$TARGET/video-title.txt', which does not match the documented Markdown note behavior and omits the stated metadata structure.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.