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

Content
View full analysis

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
View 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
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
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.

Content

Scanner excerpt · package.json (reported line 7)May include surrounding context.

json
"description": "清博开放平台文章搜索Skill",
  "main": "index.js",
  "dependencies": {
    "node-fetch": "^2.7.0"
  },
  "keywords": ["qingbo", "api", "news", "search"],
  "author": "OpenClaw",

Natural-Language Policy Violations

Low
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.