T09 · Insecure Skill Coding Practices
- Location
scripts/web_search.py:49- Finding
API Key Is Transmitted to an Undocumented Non-Volcengine Domain
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is a real web-search client, but it repeatedly asks users to paste API keys into chat and uses broader credential/search behavior than users are likely to expect.
Review before installing. Use a dedicated skill credential setting or tightly scoped environment variable, not chat, for any API key; rotate the key if it has already been pasted into a conversation. Be aware that search queries and bearer API keys may be sent to open.feedcoopapi.com in the API-key flow, and avoid running the skill with access to shared .env files containing unrelated secrets.
scripts/web_search.py:49API Key Is Transmitted to an Undocumented Non-Volcengine Domain
scripts/web_search.py:54Broad Loading of Shared OpenClaw Environment Files Violates Least Privilege
SKILL.md:22Documentation Encourages Users to Submit Long-Lived API Keys Through Chat
SKILL.md:5Overbroad Self-Routing Instructions Hijack Agent Search Behavior
The README explicitly tells users to paste an API key directly into the chat interface, which creates a real credential-handling risk. Chat channels may be logged, retained, exposed to other tools, or visible to unintended parties, so encouraging secret transmission through chat can lead to credential leakage and unauthorized API use.
The activation guidance uses very common conversational phrases as triggers, so the skill may be invoked when the user did not actually request web access. In an agent setting, overly broad routing can cause unnecessary external data transmission and unexpected tool use.
The file instructs the agent to proactively invoke the skill even without explicit search intent, but it does not set firm boundaries for when that is appropriate. This can turn normal conversation into implicit web queries, exposing user content to third-party services without clear necessity or consent.
Treating broad fuzzy words as sufficient reason to prioritize invocation creates collision-prone routing. Common words like 'recommend', 'current', or 'is it true' appear in many contexts, so the skill could capture requests that should remain local or use a different tool.
The weak-intent table encourages activation across many everyday expressions without guardrails such as consent, sensitivity checks, or ambiguity handling. In practice this broadens the attack surface for accidental exfiltration of user queries and for unnecessary dependency on remote services.
The 'appear then consider invocation' keyword list is expansive and lacks counterexamples or disambiguation guidance. Keyword-triggered behavior at this breadth is brittle and can be manipulated or accidentally matched, resulting in unintended external searches.
Referenced artifact was not completely inspected
在调用 `web_search.py` 之前:
Referenced artifact was not completely inspected
在调用 `web_search.py` 之前:
Referenced artifact was not completely inspected
在调用 `web_search.py` 之前:
The guide explicitly tells users to paste an API key into the chat, which exposes a reusable secret to the conversational channel, agent runtime, logs, transcripts, and any downstream integrations that can access message history. This exceeds the minimum access needed for the web-search skill and creates unnecessary credential disclosure risk.
The document instructs users to paste an API key directly into chat without any warning about credential exposure, which encourages unsafe handling of secrets. Because the skill is for online search and does not inherently require the model to see raw credentials in conversation, this creates avoidable risk with no clear necessity.
This is a direct instruction to disclose an API key to the agent in chat, which is sensitive-data handling contrary to least-privilege practices. In an agent skill, the danger is amplified because conversation content may be accessible to the model, platform operators, logs, and potentially other tools or memory features.
The configuration section prioritizes giving the key to the agent in chat over safer configuration paths, normalizing insecure secret handling. In the skill context this is especially dangerous because the agent may retain, summarize, forward, or expose the credential beyond the user's intended one-time setup.
The configuration guidance again encourages handing the key to the agent in chat while omitting any caution about transcript retention or unauthorized access. This omission makes the workflow more dangerous by presenting insecure secret disclosure as the preferred user experience.
The section explicitly makes handing the key to the agent the preferred path, subordinating secure local setup to a less secure conversational workflow. That design choice materially increases the chance of credential compromise and misuse if transcripts are retained, exported, or viewed by unintended parties.
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
TRAFFIC_TAG_VALUE = "skill_web_search_common"
TIME_RANGE_SHORTCUTS = {"OneDay", "OneWeek", "OneMonth", "OneYear"}
DATE_RANGE_PATTERN = re.compile(r"^(\d{4}-\d{2}-\d{2})\.\.(\d{4}-\d{2}-\d{2})$")
LEGACY_ENV_PATH = "/root/.openclaw/.env"
USER_ENV_PATH = str(Path.home() / ".openclaw/.env")
SUMMARY_PREVIEW_LIMIT = 1000
ERROR_HINTS = {
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
TRAFFIC_TAG_VALUE = "skill_web_search_common"
TIME_RANGE_SHORTCUTS = {"OneDay", "OneWeek", "OneMonth", "OneYear"}
DATE_RANGE_PATTERN = re.compile(r"^(\d{4}-\d{2}-\d{2})\.\.(\d{4}-\d{2}-\d{2})$")
LEGACY_ENV_PATH = "/root/.openclaw/.env"
USER_ENV_PATH = str(Path.home() / ".openclaw/.env")
SUMMARY_PREVIEW_LIMIT = 1000
ERROR_HINTS = {
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
TRAFFIC_TAG_VALUE = "skill_web_search_common"
TIME_RANGE_SHORTCUTS = {"OneDay", "OneWeek", "OneMonth", "OneYear"}
DATE_RANGE_PATTERN = re.compile(r"^(\d{4}-\d{2}-\d{2})\.\.(\d{4}-\d{2}-\d{2})$")
LEGACY_ENV_PATH = "/root/.openclaw/.env"
USER_ENV_PATH = str(Path.home() / ".openclaw/.env")
SUMMARY_PREVIEW_LIMIT = 1000
ERROR_HINTS = {
The README is entirely written in Chinese and describes the skill workflow only in that language, with no indication that other languages are supported or that Chinese is a required locale. Under the policy, forcing a specific language without user opt-in is a natural-language policy concern unless the locale restriction is explicit and justified.
The skill documents capabilities that rely on environment variables, local files (.env), and outbound network access, but it does not declare any explicit tool scope or permissions. That makes its effective privileges implicit, which increases the chance of over-broad execution in hosts that support capability gating or user review.
The instruction "给用户的回复必须极简" is paired with a fixed Chinese reply template and does not indicate that the language should follow the user's preference. Because no opt-in or documented region-specific justification is provided, this can violate language/locale choice policy.
The skill explicitly instructs users to paste an API key into the chat, normalizing transmission of secrets through a natural-language channel that may be logged, retained, or exposed to unintended parties. This creates a direct credential disclosure pattern and increases the likelihood of key compromise.
Examples such as "怎么用", "教我用", and "这个 skill 能干啥" are ordinary help phrases and are treated as sufficient to trigger onboarding behavior. The file does not clearly separate general discussion about the skill from actual intent to perform web search.
The repeated guidance reinforces a habit of sending credentials in chat, which compounds the risk of leakage through logs, screenshots, transcripts, or model/provider retention. Repetition makes the unsafe behavior appear endorsed and routine.
The troubleshooting guidance tells users to resend the correct key in chat, reinforcing repeated disclosure of a sensitive credential through an insecure channel. Repeated sharing increases the chance of leakage through logs, support review, transcript retention, or accidental reuse in other contexts.