T05 · Unauthorized Access and Privilege Escalation
- Location
search.mjs:13- Finding
Stable OpenClaw or Host Identity Is Collected and Transmitted to SkillPay
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This paid Chinese search skill performs the advertised searches, but it under-discloses local identity collection, an extra Baidu proxy, and a bundled billing API key.
Review before installing. Treat searches as non-private: queries leave the machine, including via an unlisted Baidu proxy. Billing also sends a stable local identifier to SkillPay despite the anonymous/no-local-files documentation, and the publisher should rotate the exposed API key and update the disclosure before production use.
search.mjs:13Stable OpenClaw or Host Identity Is Collected and Transmitted to SkillPay
lib/billing.mjs:1Reusable SkillPay API Credential Is Hard-Coded in Distributed Source Code
lib/baidu.mjs:6Baidu Search Queries Are Sent to an Undisclosed Third-Party Proxy
The lockfile pins transitive dependency undici to 7.22.0, and the supplied advisory set indicates known high-severity issues including request/response smuggling, response queue poisoning, and CRLF injection. Because this skill performs web search/scraping against remote sites, it likely makes outbound HTTP requests in normal operation, so a vulnerable HTTP client library increases exposure to malicious or malformed upstream responses and header manipulation attacks.
Without declared permissions the skill's intent is opaque and cannot be validated.
The description says the skill 'Returns AI-optimized structured results in Chinese,' which imposes a specific language behavior. Under the policy criteria, forcing a language or locale without user opt-in is a natural-language policy violation.
The implementation sends user search queries to an unrelated third-party endpoint (v.api.aa1.cn) before falling back to Baidu scraping, which materially differs from the advertised behavior of a Baidu search helper. This creates an undisclosed data-sharing path to an untrusted service that can log, profile, or manipulate results, especially dangerous because search queries often contain sensitive personal, commercial, or investigative terms.
This code transmits raw user queries to a third-party free API without any visible disclosure, consent, or trust boundary indication. Because the service is unrelated to the stated providers and appears free/unvetted, it introduces significant privacy and integrity risk through possible logging, resale, surveillance, or tampering with returned results.
The scraping fallback sends the user query to www.baidu.com over the network, which transmits user-provided data to an external service. This file does not include any confirmation prompt, user-facing logging, or explanatory comments/docstrings warning about that transmission.
The charge function sends a user ID, skill ID, and billing amount to an external billing service, but the code provides no confirmation prompt, user-visible logging, or explanatory comment/docstring disclosing this behavior. For code files, outbound transmission of user or system data should be accompanied by some visible warning unless the disclosure exists elsewhere.
The getPaymentLink function posts the user ID and requested amount to an external billing API, but the code includes no confirmation, user-visible output, or documentation warning about this external transmission. Because it affects payment workflow and transmits user-linked billing data, some disclosure is expected in code or accompanying skill documentation.
User-supplied search queries are sent to third-party search providers, which can expose sensitive user interests, prompts, or identifiers to external services. In a paid search skill, users may reasonably assume the provider handles the query, so undisclosed transmission increases privacy risk and can violate user expectations or policy requirements.
The function sends the user's raw search query to Sogou, including an added site filter for Zhihu, without any indication in the code that the user is informed or has consented to third-party disclosure. Search queries often contain sensitive personal, commercial, or investigative information, so transmitting them to external providers creates a privacy leak and data-sharing risk even if the network transport itself is HTTPS.
The fallback path transmits the user's query directly to Zhihu when Sogou parsing yields no results, again without any visible disclosure or consent mechanism in the code. Because this is an automatic fallback, users may not even realize an additional third party receives their query, increasing privacy and compliance risk.
The skill derives a billing identifier by reading local identity files and, failing that, falls back to host and username data. That is broader than necessary for a search feature and exposes local system identity information to an external billing path, creating unnecessary privacy leakage and cross-context tracking risk.
The manifest says the skill searches Baidu, Zhihu, and WeChat and notes it is a paid skill, but the code actively performs charging, balance checks, and payment-link generation before search execution. This is behavior beyond returning search results and is not captured in the functional description of the skill itself.
The code sends a caller identifier to the external billing function before performing the search, without any in-file notice or consent flow. If the identifier is derived from local identity files or host/user information, this can expose sensitive metadata to a third party and enable user/device tracking.
The skill forwards the user-provided query to external search functions for Baidu, Zhihu, and WeChat. Although remote search is part of the tool's purpose, this file does not include any user-facing disclosure that entered queries will be sent to third-party services.
The Accept-Language header is hard-coded to zh-CN/zh, which enforces a specific locale for requests. There is no indication in this file that the user can opt into this locale or that the constraint is documented as region-specific and intentional.
The getBalance function transmits the user ID in a network request to a remote billing endpoint, but there is no visible notice, confirmation, log, or inline documentation warning about this data transfer. This matches the missing-warning criterion for network calls that transmit user or system data in code files.
The manifest describes a Chinese search enhancement for WeChat articles, which implies searching WeChat content sources. In this file, both the primary path and fallback path fetch HTML from Sogou-operated endpoints (weixin.sogou.com and www.sogou.com) and scrape those result pages, so the implemented behavior relies on third-party search scraping rather than directly searching WeChat articles.
The request explicitly sets Accept-Language to zh-CN,zh;q=0.9, which imposes a specific language/locale preference. The file does not indicate that this is optional, user-selected, or justified as a region-specific requirement.
The fallback fetch repeats the hard-coded Accept-Language value zh-CN,zh;q=0.9. This is a natural-language locale policy issue because the code enforces a specific language preference without presenting a choice or explanation.
The request explicitly sets Accept-Language to zh-CN,zh;q=0.9, which imposes a specific language/locale on the interaction. There is no indication in this file that the user can opt in to this locale choice or that the constraint is required for a region-specific purpose.
This second network request repeats the hard-coded Accept-Language header for Chinese, again enforcing a locale choice in the skill's behavior. Without user selection or justification, this conflicts with the policy against forcing a specific language or locale.
The description states the skill is a "Chinese search enhancement" and specifically targets Chinese platforms, which indicates a fixed language/locale scope. There is no visible opt-in, user choice, or justification in this file for restricting behavior to Chinese-language sources.
Using a caret range for cheerio allows automatic installation of newer compatible versions, which can introduce supply-chain risk if a future release contains a vulnerability or malicious code. While this file alone does not prove compromise, dependency drift reduces build reproducibility and weakens control over what code is executed.
"description": "Chinese search enhancement for AI agents - Baidu, Zhihu, WeChat articles",
"type": "module",
"dependencies": {
"cheerio": "^1.0.0",
"commander": "^14.0.0"
}
}
Using a caret range for commander permits unreviewed newer releases within the semver range to be installed, increasing exposure to supply-chain attacks or accidental introduction of vulnerable code. This is a common hygiene weakness rather than evidence of malicious intent, but it still expands risk.
"type": "module",
"dependencies": {
"cheerio": "^1.0.0",
"commander": "^14.0.0"
}
}