T08 · Insecure Dependencies
- Location
package.json:8- Finding
Unpinned Globally Installed Executable Dependency
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill appears to extract YouTube links as described, but its unpinned global browser dependency and retained page HTML make it worth reviewing before installation.
Install only if you are comfortable with a global, unpinned browser-automation tool being installed and executed on your machine. Prefer using a sandbox or disposable environment, pinning agent-browser to a reviewed version, installing it locally instead of globally, and deleting generated HTML files if they may contain personal YouTube page state or recommendations.
package.json:8Unpinned Globally Installed Executable Dependency
Referenced artifact was not completely inspected
- **`SKILL.md`** - 技能文档
The code creates an output file containing extracted links, which is a real file-write capability not covered by declared permissions. Even though the current filename is hardcoded and the observed behavior is benign, undeclared write access in a skill can enable unauthorized file creation, overwriting of user data, or persistence artifacts if the code is modified or reused in a broader context.
The code creates an output file containing extracted links, which is a real file-write capability not covered by declared permissions. Even though the current filename is hardcoded and the observed behavior is benign, undeclared write access in a skill can enable unauthorized file creation, overwriting of user data, or persistence artifacts if the code is modified or reused in a broader context.
The script has shell-like execution capability through subprocess but the declared permissions apparently do not disclose that capability. In an agent or skill ecosystem, undisclosed process-execution ability weakens trust boundaries and can allow a skill to launch local programs unexpectedly, especially because it executes both 'agent-browser' and another Python script during installation testing.
The skill performs live network access to YouTube through an external browser process, but the declared behavior emphasizes link extraction without clearly scoping or declaring that network capability. Undeclared network access weakens permission transparency and increases the risk of users or hosts executing code with broader connectivity than expected.
This markdown file contains contributor-facing natural-language instructions almost entirely in Chinese, but it does not indicate that the project is intentionally Chinese-only or provide an opt-in language choice. Under the policy, forcing a specific language without user choice is a natural-language policy concern.
The README is predominantly written in Chinese and all usage examples, headings, and output samples assume Chinese-language interaction, while the skill name is bilingual and there is no stated opt-in or explanation that the skill is intended only for Chinese-speaking users. Under the policy, forcing a specific language or locale without user choice can be a natural-language policy violation.
The manifest description and read_when triggers are written only in Chinese, which implicitly constrains use to a specific language without any user opt-in or alternative locale support. The policy requires flagging language or locale restrictions when the skill forces a specific language without offering choice or documenting a justified regional scope.
Dynamic import() can load arbitrary modules at runtime, bypassing static analysis and potentially importing malicious code.
# 保存到临时文件
output_file = "hydrasynth_test_links"
timestamp = __import__('datetime').datetime.now().strftime("%Y-%m-%d %H:%M:%S")
with open(f"{output_file}_links.txt", 'w', encoding='utf-8') as f:
f.write(f"# YouTube搜索结果:'hydrasynth 实战应用' ({timestamp})\n")
This Python file contains user-facing docstrings and console messages entirely in Chinese, including installation guidance and success/failure output. The applicable policy rule flags language or locale constraints when the skill imposes a specific language without user opt-in or documented justification.
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
print("🔍 检查agent-browser安装...")
try:
result = subprocess.run(['agent-browser', '--version'], capture_output=True, text=True)
if result.returncode == 0:
version = result.stdout.strip()
print(f"✅ agent-browser已安装,版本: {version}")
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
try:
# 运行简单搜索
result = subprocess.run(
['python3', 'youtube_search_extractor.py', test_keyword, test_output, '--wait-time', '3', '--max-links', '3'],
capture_output=True, text=True, timeout=60
)
This Python file contains its module docstring and all user-facing status/error messages in Chinese, which imposes a specific language on users. The file does not offer any language selection, fallback, or explanation that the skill is intentionally region-specific, so it violates the language/locale policy criterion.
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
try:
# 关闭可能存在的浏览器实例
subprocess.run(['agent-browser', 'close'], capture_output=True, text=True)
# 使用独立会话测试
result = subprocess.run(
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
try:
# 关闭可能存在的浏览器实例
subprocess.run(['agent-browser', 'close'], capture_output=True, text=True)
# 使用独立会话测试
result = subprocess.run(
The manifest describes a skill for searching YouTube and extracting video links, but this file invokes an external agent-browser CLI to close browser instances, open a session, and fetch page HTML. Spawning subprocesses to control an external browser is a broader capability than straightforward extraction logic and is not justified by the manifest description alone.
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
subprocess.run(['agent-browser', 'close'], capture_output=True, text=True)
# 使用独立会话测试
result = subprocess.run(
['agent-browser', '--session', 'test-session', 'open',
f"https://www.youtube.com/results?search_query={test_keyword}"],
capture_output=True, text=True, timeout=30
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
time.sleep(3)
# 获取页面内容
result = subprocess.run(
['agent-browser', '--session', 'test-session', 'get', 'html', 'body'],
capture_output=True, text=True, timeout=30
)
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
finally:
# 清理资源
try:
subprocess.run(['agent-browser', '--session', 'test-session', 'close'],
capture_output=True, text=True, timeout=10)
except:
pass
This Python test file contains natural-language strings such as the module docstring and test docstrings exclusively in Chinese. Under the stated policy, forcing a specific language without user opt-in or a documented justification is a locale-policy violation.
For a simple link-extraction task, controlling an external browser process via subprocess introduces unnecessary attack surface and trust in a separate executable. If the browser tool is compromised, misconfigured, or granted broad session access, the skill could retrieve or expose more content than intended and operate with the browser's existing authenticated state.
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
try:
# 关闭现有的浏览器实例
subprocess.run(self.agent_browser_cmd + ['close'], capture_output=True, text=True)
# 打开搜索页面
search_url = f"https://www.youtube.com/results?search_query={self._url_encode(search_query)}"
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
search_url = f"https://www.youtube.com/results?search_query={self._url_encode(search_query)}"
print(f"📌 访问搜索页面: {search_url}")
result = subprocess.run(
self.agent_browser_cmd + ['open', search_url],
capture_output=True, text=True, check=True
)
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
time.sleep(self.wait_time)
# 获取页面HTML内容
result = subprocess.run(
self.agent_browser_cmd + ['get', 'html', 'body'],
capture_output=True, text=True, check=True
)
The skill claims to extract video links but also writes the full retrieved YouTube search-result HTML to disk. Persisting much more data than necessary expands privacy and data-retention risk, especially if the page contains user-specific state, tokens, recommendations, or other incidental content from the browser session.
No suspicious patterns detected.