Back to skill

Security audit

guaikei-video2text

Security checks for vulnerabilities and agentic risk

Overview

This video transcription skill mostly matches its stated purpose, but its URL downloading and upload flow are under-scoped and could expose private network data, local path metadata, or consume excessive disk space.

Review before installing. Use this only if you are comfortable sending video files, prompts, task IDs, the API token, and some file metadata to the GuaiKei service and its presigned storage backend. Do not give it internal, localhost, cloud-metadata, or otherwise private URLs; prefer trusted public media URLs or local files. Avoid confidential videos unless you have independently verified the provider's retention and deletion promises, and monitor the skill tmp directory and disk usage for large downloads.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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)

T05 · Unauthorized Access and Privilege Escalation

Error
Location
scripts/utils/validator.js:3
Finding

Arbitrary URL Fetching Enables SSRF and External Disclosure of Internal Responses

Content
View full analysis
this.__opts.maxRedirects) { const err = new Error("Too many redirects"); this.__setState(this.__states.FAILED); this.emit("error", err); return reject(err); } const redirectedURL = /^https?:\/\//.test(response.headers.location) ? response.headers.location : new URL(response.headers.location, this.url).href; this.__isRedirected = true; this.__initProtocol(redirectedURL); this.emit("redirected", redirectedURL, this.url); return this.__start(); } ``` ```js // scripts/video2text/index.js:140-154 const presignedUrl = await video.getPresignedUrl(tokenValue, file); if (!presignedUrl || !presignedUrl?.url || presignedUrl.url === "") { throw new Error("Failed to obtain presigned URL; report this to the developer"); } utils.printInfo("Uploading file to secure storage..."); await upload.uploadFileToOSS(file, presignedUrl.url, presignedUrl. ...[truncated 2610 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/utils/download.js:464
Finding

Unbounded Remote Downloads Permit Disk and Resource Exhaustion

Content
View full analysis
{ this.__response = response; if (!this.__isResumed) { this.__total = parseInt(response.headers["content-length"]) || null; this.__resetStats(); } if (this.__isResumed && response.statusCode === 200) { this.__isResumed = false; this.__total = parseInt(response.headers["content-length"]) || null; this.__resetStats(); } ``` ```js // scripts/utils/download.js:547-574 this.__fileStream = fs.createWriteStream(this.__filePath, {}); } else { this.__fileStream = fs.createWriteStream(this.__filePath, { flags: "a" }); } this.emit("download", { fileName: this.__fileName, filePath: this.__filePath, totalSize: this.__total, isResumed: this.__isResumed, downloadedSize: this.__downloaded, }); this.__retryCount = 0; this.__isResumed = false; this.__isRedirected = false; this.__setState(this.__states.DOWNLOADING); this.__statsEstimate.time = new Date(); this.__statsEstimate.throttleTime = new Date(); readable.on("data", (chunk) => this.__calculateStats(chunk.length)); this.__pipes.forEach((pipe) => { readable.pipe(pipe.stream, pipe.options); readable = pipe.stream; }); readable.pipe(this.__fileStream); readable.on("error", this.__onError(resolve, reject)); this.__fileStream.on("finish", this.__onFinished(resolve, reject)); ...[truncated 1861 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Note
Location
scripts/api/video.js:11
Finding

Full Local File Paths Are Unnecessarily Disclosed to the Remote API

Content
View full analysis
Remediation
View remediation
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
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (21)

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

声明描述的是一个视频转文字/文案生成技能,核心能力应包括视频输入处理、音视频转写、内容清洗、总结改写或结构化输出。但给出的代码仅实现了通用 CLI 参数解析器:识别命令行选项、处理默认值、布尔值、--flag=value 语法、位置参数、帮助文本生成及报错逻辑。该代码既未体现任何视频下载/读取、音频提取、语音识别、大模型调用,也没有文案生成相关行为。因此,这段代码的实际行为与声明用途存在明显且实质性的不一致。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

声明描述聚焦于视频转文字、内容提取和文案生成能力;而这段代码并未体现任何视频解析、音视频转写、字幕提取、调用大模型、文本清洗、总结改写或翻译逻辑。相反,它是一个独立的下载组件,会对外部 URL 发起网络请求并将响应内容保存到本地文件系统,还支持重试、续传、暂停/恢复等下载能力。这属于与声明主用途明显不同的实际行为,并且涉及未在描述中体现的通用文件下载与本地文件管理能力。因此应判定为描述与代码行为不一致。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

声明描述的是一个以视频转写和文案生成为核心的技能,但提供的代码片段只是一个辅助工具:读取并缓存 package.json 中的名称字段。该代码没有体现任何与视频输入、模型调用、文本清洗、摘要、改写、翻译或结构化文案生成相关的行为。虽然读取 package.json 可能属于内部支持性实现,但当前所给代码片段本身与声明的主要用途明显不一致,因此应判定为描述与实际行为不匹配。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

声明描述的是视频转写与内容生成类能力,但提供的代码片段只实现了 token 格式校验和控制台提示,且包含明显的商业推广信息。该行为与视频转文字、字幕提取、总结分析等核心功能没有直接对应关系。虽然 token 校验可能属于配套基础设施,但当前代码片段的实际可见功能与声明的主要用途严重不一致,因此应判定为描述与行为不匹配。

Content

No source excerpt is available for this finding.

Whitespace Padding

Medium
Category
Prompt Injection
Confidence
70% confidence
Finding

Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.

Content

Scanner excerpt · README.md (reported line 99)May include surrounding context.

md
4. 同时传入文件路径与任务ID,优先执行 `--id`,忽略 `--file`
5. 无自定义 prompt 时,默认完整转录视频全部文字

| 用户自然语言指令                                         | 自动生成命令                                                                                                |
| -------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- |
| 视频提取 https://example.com/video.mp4 中的文字          | `node scripts/video2text/index.js --file "https://example.com/video.mp4"`                                   |
| 把本地 /path/to/your/video.mp4 改成小红书风格的文案      | `node scripts/video2text/index.js --file "/path/to/your/video.mp4" --prompt "改写成小红书风格的文案"`       |

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
70% confidence
Finding

Without declared permissions the skill's intent is opaque and cannot be validated.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The trigger text includes broad requests like '会议纪要' and '内容分析' without requiring a video or audio input, which can cause the agent to invoke this skill for unrelated user content. In context, that increases the chance of unnecessary transmission of user data to a third-party service and misrouting of tasks outside the intended media-processing scope.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The activation guidance explicitly tells the AI to prioritize this skill for broad intent categories, but it does not strictly require a video/audio source. That can lead to overbroad invocation, causing sensitive text-only tasks to be inappropriately routed to an external service and increasing privacy and data-governance risk.

Content

No source excerpt is available for this finding.

Whitespace Padding

Medium
Category
Prompt Injection
Confidence
70% confidence
Finding

Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.

Content

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

md
当用户用自然语言下达指令时,按以下映射生成命令,保证识别与执行一致:

| 用户自然语言指令                                     | 生成的命令                                                                                                  |
| ---------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- |
| 提取 https://example.com/video.mp4 里的文字          | `node scripts/video2text/index.js --file "https://example.com/video.mp4"`                                   |
| 总结这个视频的核心观点 https://example.com/video.mp4 | `node scripts/video2text/index.js --file "https://example.com/video.mp4" --prompt "总结这个视频的核心观点"` |

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
86% confidence
Finding

The package description is entirely in Chinese and states the skill produces outputs such as summaries, rewrites, and Chinese-English translation, but the metadata does not indicate any user-selectable language or locale option. This can be a language-policy concern because it implies a fixed language/locale experience without explicit opt-in or documented limitation.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

This JavaScript file hardcodes user-facing comments, error messages, and help output in Chinese, including thrown errors and CLI help text. Because there is no visible mechanism for language selection or documented locale constraint, the skill appears to enforce a specific language, which matches the policy-violation category for language/locale restrictions.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

This file contains natural-language comments and runtime messages entirely in Chinese, including user-facing notices about deletion and disk usage. Under the stated policy, forcing a specific language without user opt-in or documented locale justification is a language-policy violation.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The stop path deletes the partially downloaded file with fs.unlink when removeOnStop is enabled, and similar cleanup deletion occurs on failure, yet the file provides no visible warning, confirmation, or user-facing message about this destructive behavior. Silent deletion is safety-relevant because it can remove user-visible artifacts unexpectedly.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

This code performs a safety-relevant operation by fetching data from a remote URL and writing it to a local file via createWriteStream, but the file contains no confirmation prompt, print/log statement, or explanatory comment/docstring warning users about that behavior. For a reusable utility, silently persisting network-retrieved content to disk can affect user data and system state without visible disclosure.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

This file contains natural-language comments and runtime status/error messages exclusively in Chinese, such as the doc comment and download progress strings. Because the skill does not offer any language choice or document that it is intentionally limited to a Chinese-speaking context, it creates a language-policy issue under the requirement to avoid forcing a specific language without user opt-in.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The code builds and sends an HTTPS POST request containing serialized request data and a TOKEN header, which transmits user or system data to a remote service. Within this file there is no confirmation prompt, user-facing notice, or explanatory comment/docstring describing that outbound network transmission and credential use occur.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The skill emits all user-facing status and warning messages exclusively in Chinese, including critical configuration guidance. This imposes a language choice on users without opt-in or justification, which fits the policy category for language/locale violations.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The comment makes strong privacy and data-handling promises ('not leaked, not retained, automatically deleted after processing') that are not implemented or enforced anywhere in this function. In a video-to-text skill that handles potentially sensitive user videos, this creates a security/privacy gap: operators or downstream services may retain or reuse uploaded content despite the code suggesting otherwise, leading to user deception and potential policy or compliance violations.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
89% confidence
Finding

This README presents all instructions, warnings, and examples only in Chinese, which can amount to a language/locale policy issue when the skill implicitly forces a specific language for all users. The file does not offer an alternative language, opt-in, or justification that the skill is limited to a Chinese-only audience or region.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
95% confidence
Finding

Multiple hard-coded natural-language strings in this file are only in Chinese, including operational and error messages. That imposes a specific language on users without any visible locale choice or justification, which conflicts with the language/locale policy criteria.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
95% confidence
Finding

The banner text is hard-coded in Chinese, which imposes a specific language on users without any visible opt-in or localization mechanism. Under the natural-language policy rules, forcing a locale or language without user choice is a policy concern even if it is only used in console output.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.