T09 · Insecure Skill Coding Practices
- Location
src/browser-extract.js:18- Finding
Chromium Security Sandbox Explicitly Disabled
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This appears to be a real Douyin video downloader, but it needs review because it disables browser isolation, silently writes a debug screenshot, and downloads remote media without clear safety limits.
Review this skill before installing. It should only be run in a constrained environment with a dedicated save directory and limited permissions. Prefer removing the debug screenshot behavior, running Chromium with its sandbox enabled, adding download size/time limits, and pinning dependencies with a lockfile before trusting it for routine use.
src/browser-extract.js:18Chromium Security Sandbox Explicitly Disabled
src/browser-extract.js:44Predictable Debug Screenshot Can Overwrite Local Files or Retain Page Content
src/downloader.js:38Unbounded Remote Media Download Can Exhaust Local Storage
package.json:27Dependency and Browser Installation Is Not Reproducibly Pinned
The skill's declared behavior materially differs from the detected implementation: promised link parsing, batch download, and metadata saving are not actually implemented, while an undeclared local file write (debug-screenshot.png) is present. This mismatch is dangerous because users and reviewers may grant trust or permissions based on the description, while the actual code performs hidden side effects and may mishandle inputs in unexpected ways.
The README content, commands, usage examples, and user-facing instructions are presented only in Chinese. Under the stated policy, forcing a specific language without user opt-in or a documented justification can be a natural-language policy violation.
npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.
The skill advertises download and metadata functionality but does not declare any explicit tool scope or permissions, while static analysis indicates code capabilities involving environment access. In an agent setting, undeclared capabilities reduce transparency and can enable access to sensitive runtime context or broader-than-expected behavior, making review and containment harder.
The trigger phrases include broad terms such as '无水印' and 'tiktok video', which can match ordinary conversation and cause the skill to activate unexpectedly. Over-broad activation can lead to unintended processing of user content, accidental network/file operations, or invocation in contexts where the user did not intend to download media.
The description mentions downloading and optional metadata saving but does not clearly warn users that local files may be written and metadata persisted on disk. In a skill that handles media and author information, missing disclosure increases privacy and consent risk because users may not realize content and associated metadata are being stored locally.
The skill launches a full Chromium instance with '--no-sandbox' and '--disable-setuid-sandbox', reducing browser isolation while loading untrusted third-party content. Because the skill visits external pages and executes their client-side code, disabling the sandbox increases the blast radius of any browser compromise or hostile page behavior beyond what is justified for a downloader.
The code saves a local screenshot of the rendered browser page to disk for debugging, which exceeds the stated downloader/parsing purpose and can capture more than just video metadata, including account state, recommendations, cookies-adjacent UI context, or other visible personal content. In this skill context, the extra data collection is not necessary for normal operation and creates avoidable local data exposure without user notice.
Writing a debug screenshot file without clear disclosure or consent creates an unexpected local artifact containing potentially sensitive rendered content. Even if intended only for troubleshooting, silent persistence of such files can leak browsing context or user-related data to other local processes, backups, or operators.
This code performs a file-writing operation by downloading and saving video content to saveDir. Although the success message reports the saved path after completion, there is no prior confirmation prompt or explicit warning in this file that the skill will create local files in a chosen/default directory.
The batch download path saves multiple videos to disk, which is a safety-relevant operation affecting local storage. This file does not provide a pre-action warning or confirmation that multiple files will be written to saveDir.
This code fetches a user-supplied Douyin URL, follows redirects, downloads the target page, and later queries a Douyin API endpoint. Although the file has technical comments, it lacks any user-facing disclosure or warning that submitted links will be sent to external Douyin/iesdouyin servers.
This markdown file documents downloading videos and optionally saving metadata, which affects user data and writes files locally. While it mentions configuration and output paths, it does not explicitly warn users that the skill will save media and metadata to disk or note any privacy implications of metadata collection.
The package description is written only in Chinese ("抖音无水印视频下载器 - 支持链接解析、浏览器提取和批量下载"), and the display name is also Chinese-only in the manifest metadata. This can amount to a language/locale policy issue because the skill metadata presents a fixed language choice without offering an alternative or indicating that the skill is region-specific.
Using a caret range for axios means future installs may resolve to different releases, reducing build reproducibility and potentially pulling in a vulnerable or compromised version within the allowed semver range. Because this skill is a downloader and likely performs network requests against untrusted URLs, dependency integrity matters more than for a purely local utility.
"url": "https://github.com/openclaw/skills"
},
"dependencies": {
"axios": "^1.6.0",
"cheerio": "^1.0.0-rc.12",
"playwright": "^1.58.2"
},
Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.
The unpinned playwright dependency allows installs to float across patch/minor releases, which can introduce supply-chain risk or silently change browser automation behavior. Since Playwright is powerful and typically launches browsers, any compromised or vulnerable dependency could materially affect host security.
"dependencies": {
"axios": "^1.6.0",
"cheerio": "^1.0.0-rc.12",
"playwright": "^1.58.2"
},
"optionalDependencies": {
"fluent-ffmpeg": "^2.1.2"
Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.
An optional dependency with a caret range is still a supply-chain risk when installed, even if not always present. fluent-ffmpeg interfaces with media-processing workflows, so unexpected version drift can introduce vulnerable code paths or unstable behavior.
"playwright": "^1.58.2"
},
"optionalDependencies": {
"fluent-ffmpeg": "^2.1.2"
},
"clawhub": {
"displayName": "🎵 抖音下载器",
The manifest display name uses Chinese only ("🎵 抖音下载器") and does not indicate optional localization or a documented regional scope. Under the policy, hard-coded language selection without user choice or justification may be considered a natural-language policy violation.
The file’s comments and user-facing log messages are written exclusively in Chinese, which imposes a specific language choice without offering the user any locale or language option. Under the policy, forcing a language without opt-in is a natural-language policy concern.
The file’s user-facing description and comments are written entirely in Chinese, with no indication that other languages are supported or that language choice is optional. This can violate a language/locale policy when skills are expected to be language-neutral or user-selectable.
This file presents the skill name/comments and user-visible response text primarily in Chinese, and the trigger list is mostly Chinese-centric. Under the language/locale policy, forcing a specific language without user opt-in can be a natural-language policy violation unless the locale restriction is explicit and justified.
The Accept-Language header is hard-coded to prefer zh-CN, which imposes a specific language/locale behavior. Under the policy, locale constraints should either be user-selectable or clearly documented as necessary for a region-specific tool.
Detected: suspicious.env_credential_access