Back to skill

Security audit

抖音下载+语义分段

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly performs Douyin download and transcript extraction, but it under-discloses sending transcript text to MiniMax and accepts broad network targets without clear limits.

Review before installing. Use this only for media you are comfortable sending to external transcription services; remove MINIMAX_API_KEY or pass --no-segment to avoid MiniMax transcript segmentation, and run it in a constrained network environment with an output directory you control.

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

T09 · Insecure Skill Coding Practices

Warning
Location
douyin.js:45
Finding

Unrestricted Outbound Requests Permit Blind Server-Side Request Forgery

Content
View full analysis
{ const parsedUrl = new URL(url); const client = parsedUrl.protocol === 'https:' ? https : http; const opts = { method: options.method || 'GET', headers: { ...HEADERS, ...options.headers } }; const req = client.request(url, opts, (res) => { // 处理重定向 if (res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) { httpRequest(res.headers.location, options) .then(resolve) .catch(reject); return; } let data = ''; res.on('data', chunk => data += chunk); res.on('end', () => { resolve({ statusCode: res.statusCode, headers: res.headers, body: data, url: url }); }); }); req.on('error', reject); req.setTimeout(30000, () => { req.destroy(); reject(new Error('Request timeout')); }); if (options.body) { req.write(options.body); } req.end(); }); } ``` ```js async function parseShareUrl(shareText) { const modalIdMatch = shareText.match(/(?:modal_id[=:])?(\d{16,})/); if (modalIdMatch) { const modalId = modalIdMatch[1]; return await getVideoInfoByModalId(modalId); } const urlMatch = shareText.match(/https?:\/\/[^\s]+/); if (!urlMatch) { throw new Error('未找到有效的分享链接'); } const shareUrl = urlMatch[0]; const response1 = await httpRequest(shareUrl); const finalUrl = response1.url; ``` ### Technical Analysis The CLI accepts an arbitrary HTTP or HTTPS URL from the user and passes it directly to `httpRequest()`. The request implementation does not: - Restrict requests to approved Douyin ...[truncated 2390 chars]
Remediation
View remediation

other

Warning
Location
douyin.js:313
Finding

Transcript Content Is Sent to an Undocumented External Provider by Default

Content
View full analysis
{ const { spawn } = require('child_process'); const proc = spawn('curl', [ '-X', 'POST', url, '-H', `Authorization: Bearer ${apiKey}`, '-H', 'Content-Type: application/json', '-d', JSON.stringify(data) ]); ``` ```js let textContent = await transcribeAudio(audioPath, apiKey, showProgress); if (doSegment) { textContent = await semanticSegment(textContent, null, showProgress); } ``` The skill metadata declares only the following environment variable: ```yaml metadata: openclaw: emoji: 🎵 requires: bins: [ffmpeg] env: [SILI_FLOW_API_KEY] ``` The documentation describes segmentation as using the OpenClaw built-in LLM, while the implementation uses MiniMax and the undeclared `MINIMAX_API_KEY` environment variable. ### Te ...[truncated 2462 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (10)

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The documented purpose focuses on watermark-free Douyin download and text extraction, but the actual behavior includes third-party API uploads, LLM-based semantic segmentation, ffmpeg subprocess execution, local file creation/deletion, and automatic writes. This mismatch is dangerous because users may unknowingly expose media content to external services and grant broader operational capabilities than the description suggests.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
93% confidence
Finding

The skill declares required binaries and environment variables but does not declare an explicit tool/permission scope, despite behavior implying shell execution, environment access, network use, and filesystem interaction. This creates an authorization gap where users and hosting platforms cannot accurately understand or constrain what the skill is allowed to do.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The skill advertises transcript extraction without clearly warning that audio/content from the downloaded video is sent to an external ASR provider. This is a privacy and data-governance issue because users may process copyrighted, personal, or sensitive media under the false assumption that transcription happens locally.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill description frames the tool as a Douyin downloader and copy extractor, but the implementation additionally uploads extracted audio/transcript data to third-party AI services for transcription and segmentation. This capability expansion is security-relevant because it changes the trust boundary and exposes user content externally without being clearly disclosed in the stated skill behavior.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
93% confidence
Finding

The code contains built-in external endpoints and transmits data to them as part of normal operation, creating a real data egress path outside the local environment. In this skill context, that matters because the transmitted material includes extracted audio/transcript content from user-provided links, and the outbound sharing is not sufficiently surfaced as a security/privacy-sensitive action.

Content

Scanner excerpt · douyin.js (reported line 39)May include surrounding context.

js
'Accept-Language': 'zh-CN,zh;q=0.9',
};

const SILI_FLOW_BASE_URL = 'https://api.siliconflow.cn/v1/audio/transcriptions';
const SILI_FLOW_MODEL = 'FunAudioLLM/SenseVoiceSmall';
const MINIMAX_BASE_URL = 'https://api.minimaxi.com';
const DEFAULT_DOWNLOAD_PATH = '/tmp/douyin-download/';

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

The skill invokes external binaries such as ffmpeg and curl, which expands its execution surface beyond a simple downloader/parser. While the current calls use spawn without a shell, reducing direct command-injection risk, undisclosed dependence on host executables can enable unexpected network egress, environmental dependence, and abuse in restricted execution environments.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The transcription function uploads extracted audio to SiliconFlow, which may contain sensitive spoken content from user-supplied videos. Because the skill does not provide a clear privacy warning or consent gate before transmission, users may unknowingly disclose third-party or personal data to an external processor.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The semantic segmentation feature sends transcript text to MiniMax, introducing a second external disclosure of potentially sensitive extracted content. This is dangerous because users may assume processing is local after transcription, yet the text is further shared with another vendor without explicit notice or approval.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
89% confidence
Finding

The natural-language instructions and description are entirely in Chinese, which can amount to forcing a specific language without user opt-in. The file does not indicate that the skill is region-specific or provide an alternative language option.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

The transcript metadata timestamp is formatted with toLocaleString('zh-CN'), which forces a specific locale in generated output. This is a natural-language/locale policy concern because the skill does not offer a locale option or explain why Chinese formatting is required.

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
douyin.js:143