Back to skill

Security audit

guaikei-blogger

Security checks for vulnerabilities and agentic risk

Overview

This appears to be a real Xiaohongshu public-data tool, but it needs review because it handles tokens and saved results in ways that can expose sensitive data.

Install only if you are comfortable sending Xiaohongshu URLs, search terms, returned public content, and your Guaikei API token to the Guaikei service. Treat saved logs as sensitive: they may contain full links, access parameters, comments, and profile/post data. Prefer running it in a private workspace, avoid committing logs, rotate the API token if exposed, and be cautious with untrusted URLs until hostname validation is fixed.

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 (4)

T09 · Insecure Skill Coding Practices

Warning
Location
src/utils/request.js:71
Finding

API credentials transmitted in URL query strings

Content
View full analysis
{ return await postJson( "/api/xiaohongshu/note-search/keyword", { _: Date.now(), token: token }, { keyword, type, sort, time, limit }, ); }, ``` ```js async function getSearchTask(token, keyword, type, sort, time, limit) { return await withRetry( async () => { const res = await getJson("/api/xiaohongshu/note-search/info", { _: Date.now(), token: token, keyword, type, sort, time, limit, }); ``` ```js async function postJson(path, params, data) { if (!path || typeof path !== "string") { throw new Error("path must be a non-empty string"); } if (!params || typeof params !== "object") { throw new Error("params must be an object"); } if (!data || typeof data !== "object") { throw new Error("data must be an object"); } const fullPath = `${path}?${querystring.stringify(params)}`; const jsonData = JSON.stringify(data); const options = { host: constants.BASE_URL, path: fullPath, method: "POST", headers: { "Content-Type": "application/json", "Content-Length": Buffer.byteLength(jsonData), }, }; return await request(options, jsonData); } async function getJson(path, params) { if (!path || typeof path !== "string") { throw new Error("path must be a non-empty string"); } if (!params || typeof params !== "object") { throw new Error("params must be an object"); } ...[truncated 2138 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
src/validate/url.js:3
Finding

URL allowlist bypass through substring-based validation

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Note
Location
src/utils/log.js:5
Finding

Automatically persisted results may expose sensitive URLs and collected data

Content
View full analysis
|]/g, "_") .replace(/\.\.+/g, "_") .replace(/^\.+|\.+$/g, ""); if (safeFilename.length > 200) { safeFilename = safeFilename.substring(0, 200); } if (safeFilename === "") { safeFilename = `log_${Date.now()}`; } const outputFilename = path.join( path.dirname(__filename), "..", "..", "logs", safeFilename, ); try { await fs.promises.mkdir(path.dirname(outputFilename), { recursive: true }); await fs.promises.writeFile(outputFilename, content); utils.printSuccess(` → Saved to ${outputFilename}`); } catch (error) { utils.printError(`Log write failed: ${error.message}`); } } ``` A successful detail invocation stores the full submitted URL and complete result: ```js const finalOutput = { status: "success", error_code: "OK", message: "Comment task completed", timestamp: new Date().toLocaleString(), request: { command: "detail", url: url, limit: limit, }, skill_metadata: { skill_version: constants.VERSION, runtime_version: process.versions.node, execution_time: Date.now() - startTime, }, results: detailTask, }; await log.taskWrite( `${startTime}_${validator.url2Name(url)}_detail.json`, JSON.stringify(finalOutput, null, 2), ); ``` ### Technical Analys ...[truncated 2044 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Note
Location
src/utils/utils.js:14
Finding

Terminal escape injection through raw pre-validation logging

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (50)

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The declared description says the skill accepts a Xiaohongshu blogger homepage link and returns that account's public作品列表 (post list) with metadata for each note. However, the supplied code is explicitly a '笔记详情和评论模块' and exposes createDetailTask/getDetailTask functions that call /api/xiaohongshu/detail/url and /api/xiaohongshu/detail/info using a note URL plus comment limit. It processes a single note's detail result and builds canonical URLs for the note and its author. This is a materially different primary purpose from listing a creator's posts, and it adds undeclared comment-retrieval capability.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The declared description says the skill takes a Xiaohongshu blogger profile link and pulls that blogger's public works list with metadata. However, the supplied code is clearly a search module: it creates and queries note-search tasks using a keyword and search filters, then annotates returned search items with note/profile URLs. There is no logic for accepting a blogger homepage URL, extracting a creator identifier, or specifically listing one account's published works. This is a material purpose mismatch, not just an implementation detail.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared purpose is a Xiaohongshu blogger works retrieval tool, but the supplied code chunk only implements reusable CLI argument parsing helpers (parseArgs, readValueAfterFlag, buildHelp). It does not access Xiaohongshu, perform HTTP requests, parse profile pages, extract post fields, or return structured note data. While this utility could support a larger scraper application, this chunk itself has a materially different purpose and does not represent the described functionality.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The declared purpose is a data retrieval/scraping function for Xiaohongshu creator posts. The supplied code does not access Xiaohongshu, process profile URLs, retrieve public works, parse metadata, or return structured JSON. Instead, it sanitizes a filename and writes provided content into a local logs folder using fs.promises.writeFile. File-writing is an undeclared capability relative to the stated purpose, and the primary behavior is materially different from the description. This is therefore a clear mismatch.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The declared purpose is a data extraction tool for Xiaohongshu creator posts. However, the supplied code contains only utility functions for printing a banner and formatted log messages to stderr. There is no network access, scraping, parsing, data collection, or JSON structuring logic in this chunk. Because the actual behavior shown is unrelated to the declared primary purpose, this chunk is a material description-behavior mismatch.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The declared purpose describes a skill whose main function is to accept a Xiaohongshu blogger profile link and pull that account's public works into structured JSON. The actual code chunk is unrelated to that primary purpose: it checks whether a search keyword string is valid, cleans it, and formats search/filter options. While such validation might support a search feature elsewhere, this chunk neither handles profile URLs nor performs any data retrieval or JSON assembly for blogger works. This is therefore a clear description-behavior mismatch.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description says the skill retrieves a Xiaohongshu blogger's public works list from a creator homepage link and returns per-post metadata for account analysis. The actual code clearly implements a different function: a note-detail CLI that requires a note link ('笔记链接'), validates it with isNoteUrl, creates a '评论任务', fetches the detail task, and reports '评论数量限制' and '评论任务完成'. This is a materially different primary purpose and resource target (single note vs creator homepage/account works list). Therefore the description does not accurately represent the code.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description says the skill should take a Xiaohongshu blogger homepage link and retrieve that account's public works list. However, the supplied code implements a CLI for keyword search: it requires a keyword argument, supports search-oriented filters, calls search.createSearchTask and search.getSearchTask, and labels the request command as "search". There is no handling of profile/homepage URLs, no extraction of a specific blogger's posts, and no code indicating account-level work enumeration. This is a clear purpose/behavior mismatch.

Content

No source excerpt is available for this finding.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 41)May include surrounding context.

md
- "分析这条小红书笔记评论区的主要观点和负面反馈: node src/xiaohongshu/detail-cli.js --url 'https://www.xiaohongshu.com/explore/xxx?xsec_token=yyy' --limit 100"

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 107)May include surrounding context.

md
- "分析这条小红书笔记评论区的主要观点和负面反馈: node src/xiaohongshu/detail-cli.js --url 'https://www.xiaohongshu.com/explore/xxx?xsec_token=yyy' --limit 100"

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 241)May include surrounding context.

md
- "分析这条小红书笔记评论区的主要观点和负面反馈: node src/xiaohongshu/detail-cli.js --url 'https://www.xiaohongshu.com/explore/xxx?xsec_token=yyy' --limit 100"

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 42)May include surrounding context.

md
- "看这个小红书博主最近 20 条作品都在发什么: node src/xiaohongshu/post-cli.js --url 'https://www.xiaohongshu.com/user/profile/xxx?xsec_token=yyy' --limit 20"

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 108)May include surrounding context.

md
- "看这个小红书博主最近 20 条作品都在发什么: node src/xiaohongshu/post-cli.js --url 'https://www.xiaohongshu.com/user/profile/xxx?xsec_token=yyy' --limit 20"

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 253)May include surrounding context.

md
- "看这个小红书博主最近 20 条作品都在发什么: node src/xiaohongshu/post-cli.js --url 'https://www.xiaohongshu.com/user/profile/xxx?xsec_token=yyy' --limit 20"

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The manifest describes a skill that takes a Xiaohongshu blogger homepage link and returns that account's public works list with structured metadata. This module instead creates and queries a general note-search task using a free-form keyword plus type/sort/time filters, which is a materially different capability from profile-based author post retrieval.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The implemented CLI behavior does not match the declared skill purpose: it fetches note detail and comments for a single note URL rather than a blogger's public post list. This scope mismatch is dangerous because downstream users, agents, or reviewers may grant the skill broader trust assumptions based on the manifest while the code accesses different data types, including comments, which may be more sensitive or unexpected.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The manifest says the skill should accept a Xiaohongshu blogger homepage URL and return that account's public post list with metadata. This file instead defines a keyword search interface (--keyword, content type, sort, time, limit), creates a search task, and returns general search results, which is a materially different operation from enumerating a specific blogger's works.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
70% confidence
Finding

Without declared permissions the skill's intent is opaque and cannot be validated.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The README advertises substantially broader capabilities than the stated skill purpose, including keyword search, competitor monitoring, trend prediction, KOL screening, and comment analysis. This kind of scope mismatch is dangerous because users and integrators may authorize or rely on a narrowly declared skill while the documentation encourages broader data collection and analysis workflows than expected.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The documentation mixes Xiaohongshu functionality with a claim about fetching Douyin comments, indicating copy-paste drift or undocumented multi-platform behavior. Such inconsistency is risky because it obscures the true data sources and operational scope, making it harder for users to understand what platforms are touched and what data may be collected or processed.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The changelog and skill description text are entirely in Chinese, and the file does not indicate that this language choice is optional, user-selected, or required for a region-specific purpose. Under the language/locale policy, forcing a specific language without user opt-in is a natural-language policy concern.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The changelog describes substantially broader capabilities than the declared skill purpose, including keyword search, sentiment analysis, hot-note mining, competitor analysis, KOL screening, and trend monitoring. This kind of scope mismatch is dangerous because it can conceal undeclared data access, mislead reviewers about the true behavior of the skill, and weaken permission and risk evaluation for a tool that appears narrowly scoped in metadata.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

This markdown explicitly instructs the skill to pull comment content and public post data for analysis, including sentiment and negative-opinion summarization. Under the markdown-specific warning rule, behavior that affects user data or privacy should be accompanied by a user warning, but no disclosure is provided about collecting and processing third-party content.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

This JavaScript file contains natural-language comments and error/log messages exclusively in Chinese, including task descriptions and retry/error text. The stated policy flags language or locale constraints when a skill forces a specific language without opt-in, and there is no indication here that the skill is region-specific or that users can choose the language.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The file implements note-detail and comment retrieval functions that go beyond the declared skill scope of listing a blogger's public works. This kind of scope expansion increases data access and collection surface, which can violate least-privilege expectations, surprise users, and enable broader scraping of content and engagement data than the manifest suggests.

Content

No source excerpt is available for this finding.