Security Audit
happynocode/openclaw-skill-youtube:root
github.com/happynocode/openclaw-skill-youtubeTrust Assessment
happynocode/openclaw-skill-youtube:root received a trust score of 10/100, placing it in the Untrusted category. This skill has significant security findings that require attention before use in production.
SkillShield's automated analysis identified 13 findings: 3 critical, 4 high, 5 medium, and 1 low severity. Key findings include Network egress to untrusted endpoints, Arbitrary command execution, Missing required field: name.
The analysis covered 4 layers: Manifest Analysis, Static Code Analysis, Dependency Graph, LLM Behavioral Safety. The Manifest Analysis layer scored lowest at 10/100, indicating areas for improvement.
Last analyzed on March 9, 2026 (commit 8aaeb81f). SkillShield performs automated 4-layer security analysis on AI skills and MCP servers.
Layer Breakdown
Behavioral Risk Signals
Security Findings13
| Severity | Finding | Layer | Location | |
|---|---|---|---|---|
| CRITICAL | Network egress to untrusted endpoints Python requests POST/PUT to URL Review all outbound network calls. Remove connections to webhook collectors, paste sites, and raw IP addresses. Legitimate API calls should use well-known service domains. | Manifest | scripts/summarize.py:316 | |
| CRITICAL | Arbitrary command execution Python shell execution (os.system, subprocess) Review all shell execution calls. Ensure commands are static (not built from user input), use absolute paths, and are strictly necessary. Prefer library APIs over shell commands. | Manifest | scripts/summarize.py:82 | |
| CRITICAL | Arbitrary command execution Python shell execution (os.system, subprocess) Review all shell execution calls. Ensure commands are static (not built from user input), use absolute paths, and are strictly necessary. Prefer library APIs over shell commands. | Manifest | scripts/summarize.py:135 | |
| HIGH | Dangerous call: subprocess.run() Call to 'subprocess.run()' detected in function 'get_channel_videos'. This can execute arbitrary code. Avoid using dangerous functions like exec/eval/os.system. Use safer alternatives. | Static | scripts/summarize.py:82 | |
| HIGH | Dangerous call: subprocess.run() Call to 'subprocess.run()' detected in function 'get_video_details'. This can execute arbitrary code. Avoid using dangerous functions like exec/eval/os.system. Use safer alternatives. | Static | scripts/summarize.py:135 | |
| HIGH | Prompt Injection via Untrusted Video Content The `SUMMARY_PROMPT_TEMPLATE` in `scripts/summarize.py` directly incorporates external, untrusted content such as `title`, `channel`, and `transcript` from YouTube videos into the prompt sent to an external LLM API. If a malicious actor uploads a video with a specially crafted title or transcript containing prompt injection instructions, these instructions could manipulate the behavior of the LLM, potentially leading to unintended actions, data leakage, or denial of service from the LLM. Implement robust sanitization or escaping of untrusted video content (title, channel, transcript) before incorporating it into the LLM prompt. Consider using a separate, instruction-tuned model or a content filter to process untrusted inputs before they reach the main summarization LLM. Alternatively, use LLM API features like 'system' roles to better delineate instructions from user content. | LLM | scripts/summarize.py:30 | |
| HIGH | Unpinned Python Dependencies The `setup.sh` script installs Python dependencies (`youtube-transcript-api`, `requests`, `innertube`) without specifying exact versions. This practice, known as unpinned dependencies, introduces a significant supply chain risk. Future versions of these packages could introduce breaking changes, vulnerabilities, or even malicious code, which would automatically be installed, compromising the skill's stability and security. Pin all Python dependencies to exact versions (e.g., `package==1.2.3`) in the `pip install` command. Regularly review and update these pinned versions to incorporate security patches and new features in a controlled manner. Consider using a `requirements.txt` file with pinned versions. | Static | setup.sh:40 | |
| MEDIUM | Missing required field: name The 'name' field is required for claude_code skills but is missing from frontmatter. Add a 'name' field to the SKILL.md frontmatter. | Static | SKILL.md:1 | |
| MEDIUM | Suspicious import: requests Import of 'requests' detected. This module provides network or low-level system access. Verify this import is necessary. Network and system modules in skill code may indicate data exfiltration. | Static | scripts/summarize.py:221 | |
| MEDIUM | Suspicious import: requests Import of 'requests' detected. This module provides network or low-level system access. Verify this import is necessary. Network and system modules in skill code may indicate data exfiltration. | Static | scripts/summarize.py:314 | |
| MEDIUM | Sensitive environment variable access: $HOME Access to sensitive environment variable '$HOME' detected in shell context. Verify this environment variable access is necessary and the value is not exfiltrated. | Static | setup.sh:54 | |
| MEDIUM | Potential Data Exfiltration via Cloudflare Proxy Placeholder The `_get_transcript_innertube_proxy` function in `scripts/summarize.py` uses a `CF_PROXY_URL` to fetch transcripts. While the provided `CF_PROXY_URL` is a placeholder (`https://your-cloudflare-proxy.workers.dev/?url=`), the mechanism exists to route requests through an arbitrary external endpoint. If this placeholder were to be replaced with a malicious URL, it could lead to the exfiltration of video IDs and other request metadata to an attacker-controlled server. Ensure that `CF_PROXY_URL` is either removed if not intended for use, or if it is configurable, implement strict validation of its value to prevent it from pointing to untrusted domains. If a proxy is necessary, it should be a trusted, controlled service. Document clearly the implications of configuring this URL. | Static | scripts/summarize.py:160 | |
| LOW | Command Injection Risk in yt-dlp Arguments The `get_channel_videos` and `get_video_details` functions in `scripts/summarize.py` construct `yt-dlp` commands using `channel_id` and `video_id` which are derived from external input. Although `subprocess.run` is used with a list of arguments (which is generally safer than a shell string), if `channel_id` or `video_id` could contain shell metacharacters that `yt-dlp` itself does not properly sanitize when parsing its arguments, it could potentially lead to command injection. While `yt-dlp` is expected to handle URLs robustly, this pattern warrants caution. While `subprocess.run` with a list of arguments mitigates many shell injection risks, it's best practice to explicitly validate and sanitize `channel_id` and `video_id` inputs to ensure they conform to expected formats (e.g., YouTube ID patterns, valid URL characters) before passing them to external commands. This adds a layer of defense against unexpected input. | Static | scripts/summarize.py:70 |
Scan History
Embed Code
[](https://skillshield.io/report/b4b1e38f4722d221)
Powered by SkillShield