T08 · Insecure Dependencies
- Location
SKILL.md:42- Finding
Unpinned Community Skill Creates a Supply-Chain Risk
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill mostly gathers public AI news, but it needs review because its documentation overstates web-search support and includes credential setup plus automated channel posting with ambiguous targeting.
Review before installing. Use this only if you are comfortable with public network requests and optional posting to OpenClaw channels. Avoid the cron example that targets the last contacted channel; choose an explicit destination. Do not paste real API keys into an echo command, and review or pin any separate Tavily community skill before installing it. Expect Chinese output and do not rely on the bundled script for Brave/Tavily web search unless that support is added or separately verified.
SKILL.md:42Unpinned Community Skill Creates a Supply-Chain Risk
SKILL.md:52API Key Is Persisted Through an Unsafe Shell Command
scripts/ai_news.py:118ArXiv Feed Is Retrieved over Unencrypted HTTP
The documented behavior materially differs from the analyzed implementation: it claims Brave/Tavily web search and GitHub Trending, but the code reportedly lacks real web-search support, uses a different GitHub source, and includes outbound channel sending not clearly declared as a core behavior. Behavior mismatches are dangerous because users may authorize the skill under false assumptions, especially when it can transmit content to external channels.
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
echo 'TAVILY_API_KEY=tvly-你的key' >> ~/.openclaw/.env
YARA rule matched a hack tool or exploit indicator (offensive tools, reconnaissance, privilege escalation, or exploit frameworks).
['max_github']]:
name = item.get('full_name', '')
desc = item.get('description', '') or 'No description'
stars = item.get('stargazers_count', 0)
url = item.get('html_url', '')
# 过滤非 AI 项目
if not contains_ai_keywords(name + ' ' + desc):
continue
results.append({
'name': name,
'description': truncate(desc, 80),
'stars': stars,
'url': url,
'source': 'GitHub'
})
return results[:CONFIG['max_github']]
def fetch_arxiv_papers():
"""获取 ArXiv AI 论文"""
# 搜索 CS.AI 和 CS.LG 类别的最新论文
categories = "cat:cs.AI+OR+cat:cs.LG+OR+cat:cs.CL"
url = f"http://export.arxiv.org/api/query?search_query={categories}&sortBy=submittedDate&sortOrder=descending&max_results={CONFIG['max_arxiv']*2}"
xml_data = fetch_text(url)
if not xml_data:
return []
try:
root = ET.
The documented trigger phrases are broad natural-language requests such as asking for AI news or a tech digest, which can overlap with ordinary user conversation and increase the chance of unintended skill invocation. In this skill’s context, accidental activation could cause unsolicited external fetching or message posting behavior, especially when paired with automation features.
The README instructs users to configure automatic delivery to the 'last' contacted channel, but it does not clearly warn that content may be posted into whatever conversation was most recently active. This creates a real risk of unintended disclosure, spam, or posting into sensitive/private channels due to ambiguous targeting in an automated scheduled job.
The skill advertises required tools under metadata, but it does not declare a clear restrictive tool scope such as permissions or allowed-tools. In an agent environment, missing explicit scope can let the skill execute with broader network or shell access than users expect, increasing the blast radius if the skill is modified or invoked unexpectedly.
Broad trigger phrases like general AI-news or tech-news requests can overlap with ordinary user conversations and cause the skill to activate when the user did not intend to call it. Because this skill performs network access and may support outbound sharing, accidental activation can lead to unnecessary data exposure or unexpected actions.
The documentation promotes automatic sharing to chat channels but does not prominently warn that content will be transmitted outward to another destination. In a news-aggregation skill, users may assume output stays local to the current session, so undocumented outbound delivery increases the risk of accidental disclosure and misuse in automated cron jobs.
This code embeds user-facing comments, output headers, and status text in Chinese, and the generated digest is always formatted in Chinese. That creates a language policy issue because the skill does not offer any language or locale choice or document a justified region-specific restriction.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
def fetch_github_trending():
"""获取 GitHub AI 趋势项目"""
# GitHub trending 没有官方 API,使用搜索 API 找最近更新的热门项目
url = "https://api.github.com/search/repositories?q=AI+OR+LLM+OR+GPT+created:>2025-12-01&sort=stars&order=desc&per_page=20"
data = fetch_json(url)
if not data or 'items' not in data:
The manifest describes a skill for fetching and presenting AI news from several sources, which justifies outbound HTTP requests to those data providers. However, the code also implements a separate delivery capability that sends the generated digest to arbitrary OpenClaw channels via the CLI, which goes beyond simple aggregation and retrieval.
For a daily AI news aggregator, fetching remote content and formatting a digest are expected capabilities. Spawning a subprocess to invoke an external messaging command introduces a broader action capability unrelated to collecting or summarizing news unless the manifest explicitly includes message delivery behavior.
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
cmd.extend(["--channel", channel])
# 使用 stdin 传递消息
result = subprocess.run(
cmd,
input=message,
capture_output=True,
Most user-facing instructions and example prompts are written in Chinese, which implies a fixed language experience. The file does not state that the skill is Chinese-only, region-specific, or that users may choose another language, so this may violate a language/locale policy requiring user opt-in or explicit justification.
No suspicious patterns detected.