Back to skill

Security audit

gotitvideo

Security checks for vulnerabilities and agentic risk

Overview

The skill largely matches its video-to-text purpose, but needs Review because it can fetch arbitrary URLs and upload media or fetched content to third-party services with incomplete and contradictory disclosure.

Install only if you are comfortable sending selected videos, prompts, task IDs, the API token, and some file metadata to the provider. Do not use it on confidential, regulated, copyrighted, internal-network, localhost, metadata-service, or access-restricted media unless you have approval and understand the provider's retention policy.

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
scripts/utils/validator.js:3
Finding
Arbitrary URL Downloads Enable Server-Side Request Forgery<![CDATA[ ## Vulnerability Details **File Location**: `scripts/utils/validator.js:3-7`, `scripts/video2text/index.js:97-108`, `scripts/utils/download.js:479-492` **Vulnerability Type**: Server-Side Request Forgery through unrestricted URL fetching and redirects **Risk Level**: Medium ### Vulnerable Code `scripts/utils/validator.js:3-7`: ```js function isUrl(url) { try { const parsedUrl = new URL(url); return parsedUrl.protocol === "http:" || parsedUrl.protocol === "https:"; } catch (_) { return false; } } ``` `scripts/video2text/index.js:97-108`: ```js if (validator.isUrl(file)) { const filepath = utils.downloadPath(); try { await fs.promises.mkdir(filepath, { recursive: true }); } catch (error) { utils.printError("临时下载目录创建失败: " + (error.message || String(error))); process.exit(1); } try { const downloadResult = await helper.download(file, filepath); ``` `scripts/utils/download.js:479-492`: ```js if (this.__isRequireRedirect(response)) { this.__redirectCount++; if (this.__redirectCount > 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); ``` ### Technical Analysis URL validation only verifies that the supplied value uses HTTP or HTTPS. It does not resolve and inspect the destination address or reject loopback, private, link-local, unspecified, multicast, IPv6-local, or cloud metadata addresses. The downloader also follows HTTP redirects without applying destination restrictions to each redirected URL. Consequently, a public URL can redirect to an otherwise internal destination. DNS rebinding may provide another bypass if validation is added only before DNS ...[truncated 1765 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Permit only HTTPS sources unless HTTP support is strictly required. 2. Resolve the hostname before connecting and reject all restricted IPv4 and IPv6 ranges, including: - Loopback addresses. - RFC 1918 private addresses. - Link-local addresses. - IPv4-mapped IPv6 variants. - Unspecified, multicast, and reserved ranges. - Known cloud metadata endpoints. 3. Repeat the complete validation process for every redirect target. 4. Limit redirect depth and reject protocol downgrades from HTTPS to HTTP. 5. Defend against DNS rebinding by connecting only to a previously validated resolved address while preserving the intended TLS server name, or by using an outbound proxy with enforceable destination policy. 6. Where feasible, use an allowlist of supported public video platforms and trusted media hosts. 7. Validate the response `Content-Type` and file signature before upload. 8. Enforce maximum response sizes and download timeouts to reduce resource-exhaustion risk. 9. Do not upload downloaded content unless it has passed media validation. ]]>

T09 · Insecure Skill Coding Practices

Note
Location
scripts/api/video.js:19
Finding
Full Local Filesystem Path Is Disclosed to the Remote API<![CDATA[ ## Vulnerability Details **File Location**: `scripts/api/video.js:19-27`, invoked from `scripts/video2text/index.js:140` **Vulnerability Type**: Unnecessary disclosure of sensitive local path metadata **Risk Level**: Low ### Vulnerable Code `scripts/api/video.js:19-27`: ```js const data = { file: filename }; const response = await requestApi( "/api/video/presign", token, data, constants.CREATE_MAX_ATTEMPTS, "预上传", ); ``` `scripts/video2text/index.js:140`: ```js const presignedUrl = await video.getPresignedUrl(tokenValue, file); ``` ### Technical Analysis The `filename` argument is the complete path supplied to the CLI or produced by the downloader. For a local file, it may contain the operating-system username, home directory, client name, repository structure, project codename, or other sensitive contextual information. The full value is serialized into a JSON request to the external API at `www.guaikei.com`. A presigning operation generally needs only an object name, sanitized basename, file extension, media type, and size. Sending the complete local path exceeds the minimum information required for the declared operation. Transport encryption protects the path in transit but does not prevent the remote service from receiving, processing, logging, or retaining it. ### Attack Path 1. A user invokes the Skill with a sensitive local path, such as `/home/user/clients/confidential-project/interview.mp4`. 2. The entry point passes the complete path to `getPresignedUrl()`. 3. `getPresignedUrl()` places the complete path in the `file` JSON property. 4. `requestApi()` sends the JSON request to the external service. 5. The external service and any associated request logging infrastructure receive the sensitive local path metadata. ### Impact Assessment The remote service may learn local account names, directory layouts, organization or client names, project identifiers, and document context. This does not grant filesystem access or loca ...[truncated 231 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Never send the complete local path to the presigning API. 2. Extract only a sanitized basename with `path.basename(filename)`. 3. Prefer generating an opaque server object name, such as a UUID combined with a validated media extension. 4. Remove directory separators, control characters, and unexpected Unicode characters from any client-supplied filename. 5. Send only fields required by the API, such as: - Opaque object identifier. - Validated extension. - Media content type. - File size. 6. Review server and proxy logs for historical collection of full paths and apply appropriate retention or deletion controls. 7. Document the metadata transmitted to the external service in the Skill's privacy and trust documentation. ]]>
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 (31)

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The documented behavior includes remote download and local file writes, but the high-level description presents the skill mainly as a content-cleanup/transcription tool. When destructive or broader I/O behavior is under-disclosed, users and orchestration systems may grant trust inappropriate for a component that can retrieve and persist untrusted data.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The documented behavior includes remote download and local file writes, but the high-level description presents the skill mainly as a content-cleanup/transcription tool. When destructive or broader I/O behavior is under-disclosed, users and orchestration systems may grant trust inappropriate for a component that can retrieve and persist untrusted data.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
The documented behavior includes remote download and local file writes, but the high-level description presents the skill mainly as a content-cleanup/transcription tool. When destructive or broader I/O behavior is under-disclosed, users and orchestration systems may grant trust inappropriate for a component that can retrieve and persist untrusted data.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The documented behavior includes remote download and local file writes, but the high-level description presents the skill mainly as a content-cleanup/transcription tool. When destructive or broader I/O behavior is under-disclosed, users and orchestration systems may grant trust inappropriate for a component that can retrieve and persist untrusted data.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
The documented behavior includes remote download and local file writes, but the high-level description presents the skill mainly as a content-cleanup/transcription tool. When destructive or broader I/O behavior is under-disclosed, users and orchestration systems may grant trust inappropriate for a component that can retrieve and persist untrusted data.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The skill promotes uploading local videos and submitting third-party video links to a cloud processing service, but the usage guidance does not place a prominent, explicit warning at the point of invocation that data will leave the local environment. In practice, users may provide sensitive meeting recordings, interviews, or internal course content without realizing they are being transmitted to an external service.

Vague Triggers

Medium
Confidence
91% confidence
Finding
The README defines very broad natural-language-to-command conversion rules, which can cause the skill to activate on loosely related user requests and automatically construct commands that fetch or process external/local video inputs. In an agent setting, unclear activation scope increases the chance of unintended data handling or tool invocation without sufficiently explicit user intent.

Whitespace Padding

Medium
Category
Prompt Injection
Content
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 "改写成小红书风格的文案"`       |
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.

Lp3

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding
The skill declares access to environment secrets via `GUAIKEI_API_TOKEN` but does not define an explicit tool scope such as `permissions` or `allowed-tools`. In an agent environment, missing scope boundaries increases the chance that the skill is invoked with broader capabilities than necessary and makes review of secret exposure harder.

Vague Triggers

Medium
Confidence
94% confidence
Finding
The skill description uses very broad activation triggers spanning transcription, summarization, content analysis, copywriting, and more. Over-broad trigger criteria increase the chance of accidental invocation on unrelated user requests, causing unintended upload of local files or remote URLs to a third-party service.

Vague Triggers

Medium
Confidence
92% confidence
Finding
The trigger guidance enumerates many synonymous phrases and content-analysis tasks without strong scope limits, making this skill easy to auto-select for ambiguous requests. In context, that matters because invocation may cause network fetches, cloud upload, and processing of user media by a third party.

Intent-Code Divergence

Medium
Confidence
95% confidence
Finding
The trust section states the skill only communicates with `guaikei.com`, but other sections say it first downloads arbitrary public video URLs to a temp directory. Contradictory trust claims are dangerous because they hide the real attack surface: outbound requests to attacker-controlled servers and local handling of untrusted files.

Intent-Code Divergence

Medium
Confidence
90% confidence
Finding
The skill promises neutral error handling without marketing or contact details, yet elsewhere embeds website and WeChat contact information in setup and support guidance. This inconsistency is a social-engineering risk because users may be conditioned to treat promotional or contact-bearing error flows as legitimate and share sensitive operational details through unofficial channels.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
This JavaScript code initiates HTTP/HTTPS requests, writes downloaded content to disk, and can delete files on stop or failure, but it only emits internal events and contains no confirmation prompt, user-facing log/print, or explanatory comments warning about these side effects. For a reusable utility, these are safety-relevant operations that are not disclosed within the code file itself.

Natural-Language Policy Violations

Medium
Confidence
96% confidence
Finding
This JavaScript file contains natural-language comment and status/error messages exclusively in Chinese, such as the function comment and multiple inlineLog messages. Under the policy, forcing a specific language without user opt-in or a documented regional justification is a natural-language policy violation.

Natural-Language Policy Violations

Medium
Confidence
97% confidence
Finding
This code emits user-facing error text in Chinese, which imposes a specific language on users without any opt-in or indication that the skill is intended only for a Chinese-speaking or region-specific environment. The same pattern appears throughout the file, making this a natural-language locale policy issue rather than a functional bug.

Natural-Language Policy Violations

Medium
Confidence
98% confidence
Finding
The skill emits all user-facing warning and status text in Chinese, including promotional and operational messages, with no indication that the user can choose another language. This is a natural-language locale policy concern because it imposes a specific language on all users without opt-in or documented justification.

Intent-Code Divergence

Medium
Confidence
96% confidence
Finding
The code-level behavior does not enforce the privacy and deletion guarantees stated in the comment: it only uploads the file to a presigned URL and returns. In a skill that handles user videos and transcription inputs, this mismatch can mislead users and integrators into believing retention and usage controls exist when they are not implemented or verified, creating privacy, compliance, and trust risks if uploaded content is retained or reused by the backend or storage provider.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The skill processes local video files and public URLs by sending content to a third-party cloud service, but the trigger/description does not prominently warn users that their media and potentially sensitive spoken content leave the local environment. This creates a privacy and data-handling risk because users may submit confidential meetings, interviews, or internal training videos without informed consent or awareness of third-party processing.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The documentation encourages users to download login-, membership-, or otherwise access-restricted videos and then upload them locally, without warning about copyright, terms-of-service, confidentiality, or privacy implications. This can facilitate unauthorized redistribution or re-processing of protected content and expose both the user and operator to legal and privacy risks.

Intent-Code Divergence

Medium
Confidence
86% confidence
Finding
L122 明确写到“错误提示中性,不夹带营销文案、联系方式或官网链接”,但同一文档在 L103、L268 以及 L290-L294 又反复强调官网和微信联系方式,体现出意图层面的自我矛盾。虽然这不证明运行时代码一定会在报错时输出营销内容,但文档本身对预期行为给出了互相冲突的指引。

Intent-Code Divergence

Medium
Confidence
97% confidence
Finding
L146-L147 先给出决策顺序,暗示有新视频时应使用 `--file`,但 L149 明确说“链接和上次任务同时给了?优先听 `--id`”,L240 也再次规定“以 `--id` 为准”。这是直接影响调用意图的文档冲突:同样输入条件下,说明文档给出了两套不同决策。

Whitespace Padding

Medium
Category
Prompt Injection
Content
## 7. 🗣️ 自然语言 → 命令(照这张表转)

| 用户说的话                                           | 就执行这条命令                                                                                              |
| ---------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- |
| 提取 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 "总结这个视频的核心观点"` |
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.

Whitespace Padding

Medium
Category
Prompt Injection
Content
## 7. 🗣️ 自然语言 → 命令(照这张表转)

| 用户说的话                                           | 就执行这条命令                                                                                              |
| ---------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- |
| 提取 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 "总结这个视频的核心观点"` |
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.

Natural-Language Policy Violations

Low
Confidence
80% confidence
Finding
The package description is entirely in Chinese and presents the skill's functionality only in that language. Under the policy, language constraints should either offer user choice or be clearly documented as a justified locale-specific limitation, which is not present here.

Static analysis

No suspicious patterns detected.