Back to skill

Security audit

Qingbo Search

Security checks for vulnerabilities and agentic risk

Overview

The skill does what it claims, but it sends user search data and API authentication material to Qingbo over unencrypted HTTP, so it needs Review before installation.

Install only if you are comfortable providing Qingbo API credentials and sending search terms to Qingbo. Before use, the publisher should switch the API call to HTTPS if supported, document exactly what is sent externally, and add confirmation for sensitive or ambiguous searches.

Vulnerability Patterns
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T09 · Insecure Skill Coding Practices

Error
Location
index.js:43
Finding
Plaintext Transmission of User Queries and Authentication Material## Vulnerability Details **File Location**: `index.js:43-76` **Vulnerability Type**: Sensitive data transmitted over unencrypted HTTP **Risk Level**: High ### Vulnerable Code ```js // Generate access token function generateAccessToken(appKey, sign, router) { const tokenContent = `${appKey}:${sign}:${router}`; return Buffer.from(tokenContent).toString('base64'); } // Call the article keyword search API async function searchArticles(params) { const config = readConfig(); if (!config || !config.app_key || !config.app_secret) { throw new Error('Please configure app_key and app_secret in config.json first'); } const router = '/pubsent/full-search/index'; const baseUrl = 'http://databus.gsdata.cn:8888/api/service'; // Generate signature const sign = generateSign(params, config.app_secret); // Generate access token const accessToken = generateAccessToken(config.app_key, sign, router); // Construct query string const queryString = new URLSearchParams(params).toString(); const url = `${baseUrl}?${queryString}`; // Send request try { const response = await fetch(url, { method: 'GET', headers: { 'access-token': accessToken } }); ``` ### Technical Analysis The Skill sends requests to a hardcoded `http://` endpoint without transport encryption. Each request includes: - User-supplied search keywords and filters in the URL query string. - The application key, request signature, and API route encoded into the `access-token` header. - Date ranges, media filters, and sentiment filters derived from user input. Base64 encoding does not provide confidentiality. A party capable of observing network traffic can decode the token and recover its components. Because HTTP provides neither encryption nor endpoint authentication, an on-path attacker can also modify requests or API responses. Network access is necessary for the d ...[truncated 2317 chars]
Remediation
## Remediation Suggestions 1. Replace the endpoint with the service provider's officially supported HTTPS endpoint: ```js const baseUrl = 'https://databus.gsdata.cn:8888/api/service'; ``` This change must only be made after confirming that the provider supports TLS on the selected hostname and port. 2. Fail closed if HTTPS is unavailable. Do not silently fall back to HTTP. 3. Restrict redirects so an HTTPS request cannot be redirected to an HTTP destination: ```js const response = await fetch(url, { method: 'GET', redirect: 'manual', headers: { 'access-token': accessToken } }); ``` 4. If supported by the API, transmit search parameters in an HTTPS POST body rather than a GET URL to reduce leakage through URL logs. 5. Use short-lived server-issued credentials or include a timestamp and cryptographically random nonce in signed requests if the API supports them. 6. Prefer a modern message authentication algorithm such as HMAC-SHA-256 instead of MD5 when permitted by the provider's authentication protocol. 7. Add explicit request timeouts and response-size limits to reduce availability risks from a slow or malicious endpoint. 8. Document exactly which user-derived fields are transmitted to the third-party service and obtain user consent where queries may contain confidential information. 9. Add automated tests that reject non-HTTPS endpoints and redirects to plaintext HTTP.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (11)

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The README describes keyword-based search through an external platform but does not clearly warn that user queries and related search parameters will be sent to a third-party API service. This creates a privacy and consent risk because users may provide sensitive topics, names, or investigation-related terms without realizing that this data leaves the local environment.

Vague Triggers

Medium
Confidence
87% confidence
Finding
The README advertises activation via broad natural-language requests such as generic searches and analytics queries, but it does not define clear boundaries for when the skill should or should not trigger. In an agent setting, this can cause overbroad invocation and unintended transmission of user-provided content to the external Qingbo API, especially when user messages contain mixed intent or sensitive topics.

Vague Triggers

Medium
Confidence
89% confidence
Finding
The invocation examples are very broad and map common natural-language requests directly to an external search capability without clear trigger boundaries, exclusions, or confirmation requirements. This increases the chance of accidental activation and unintended transmission of user-provided topics, date ranges, or platform filters to the third-party API, creating privacy and data-minimization risks.

Missing User Warnings

Medium
Confidence
96% confidence
Finding
The skill does not clearly warn users that their queries and derived parameters will be sent to Qingbo's external API. Users may provide sensitive research topics, names, or time-bounded investigative queries without realizing this data leaves the local system, which can violate transparency and privacy expectations.

Natural-Language Policy Violations

Medium
Confidence
97% confidence
Finding
User-facing strings, parsing logic, and prompts are all hard-coded in Chinese, and the input analysis only recognizes Chinese query phrases. This effectively enforces a specific language/locale without any opt-in, alternative language handling, or documented justification, which matches the language/locale policy violation category.

Missing User Warnings

Medium
Confidence
98% confidence
Finding
The code sends both user query data and an access token over plain HTTP to databus.gsdata.cn:8888, which exposes them to interception and tampering by any attacker on the network path. Because the token is derived from app credentials and is used for API authentication, a man-in-the-middle could capture sensitive search terms and potentially replay or abuse the tokenized request.

Natural-Language Policy Violations

Low
Confidence
78% confidence
Finding
All user-facing documentation and example prompts are presented only in Chinese, which can amount to a language policy constraint if users are not given an opt-in or alternative locale. The README does not state that the skill is intentionally limited to Chinese-language users or a China-specific compliance context.

Natural-Language Policy Violations

Low
Confidence
84% confidence
Finding
All user-facing instructions and examples are presented only in Chinese, which can amount to a language policy issue when no opt-in or locale justification is provided. The file does not state that the skill is intended only for Chinese-speaking users or a China-specific deployment context.

Missing User Warnings

Low
Confidence
88% confidence
Finding
The function reads app_key and app_secret from a local configuration file and uses them to authenticate outbound requests, but the code provides no user-facing disclosure that credentials are required and will be used. Under the missing-warning rule for code files, access to sensitive credentials should have at least some visible explanation, comment, or documentation.

Unpinned Dependencies

Low
Category
Supply Chain
Content
"description": "清博开放平台文章搜索Skill",
  "main": "index.js",
  "dependencies": {
    "node-fetch": "^2.7.0"
  },
  "keywords": ["qingbo", "api", "news", "search"],
  "author": "OpenClaw",
Confidence
93% confidence
Finding
The dependency is specified with a caret range (^2.7.0), which permits automatic installation of newer 2.x releases rather than a fully fixed version. This can introduce supply-chain risk by pulling in unexpected upstream changes or vulnerable transitive updates, though the package.json alone does not indicate active exploitation or malicious behavior.

Natural-Language Policy Violations

Low
Confidence
95% confidence
Finding
The user-facing strings and example invocations are entirely in Chinese, including the test banner and all sample queries. This indicates the skill is designed to operate in a single language without documenting user choice or an explicit locale constraint, which matches the language/locale policy concern.

Static analysis

Detected: suspicious.exposed_secret_literal

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
index.js:63