Back to skill

Security audit

Beautsgo Booking

Security checks for vulnerabilities and agentic risk

Overview

This booking skill has a coherent purpose, but it needs review because it can submit sensitive appointment details and open browser URLs in ways that are not safely controlled.

Install only if you are comfortable with the skill contacting BeautsGO-related services and sending appointment details such as clinic, date, party size, and contact information. Before approval, require a fix for the unsafe browser opener, remove or redact PII logs, add a clear final confirmation before every booking submission, and prefer pinned install instructions.

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

Error
Location
api/browser/open-url.js:38
Finding

Shell Command Injection Through Untrusted Clinic URLs

Content
View full analysis
hostname === host || hostname.endsWith('.' + host)) } catch { return false } } ``` ### Technical Analysis The function verifies that the parsed hostname belongs to `i.beautsgo.com`, but it subsequently interpolates the original, unnormalized URL into a shell command executed through `child_process.exec()`. Hostname validation does not make a string safe for shell interpolation. A URL can have an allowed hostname while containing quotes and shell metacharacters in its path, query, or fragment. These characters may terminate the quoted URL argument and introduce an additional shell command. Clinic URLs can come from the remotely refreshed hospital list. The resolution logic can also use `context.resolvedHospital.url` when the clinic name cannot be matched locally. Consequently, the URL cannot safely be treated as a trusted command-line literal. ### Attack Path 1. An attacker causes a clinic record or supplied context to contain a URL whose parsed hostname remains `i.beautsgo.com`. 2. The URL includes shell syntax outside an injected quotation mark, such as an additional command in its path or query. 3. The user invokes an operation that opens ...[truncated 790 chars]
Remediation
View remediation
{ const child = spawn(command, args, { shell: false, detached: false, stdio: 'ignore', }) child.once('error', reject) child.once('exit', code => { if (code === 0) resolve() else reject(new Error(`Browser launcher exited with code ${code}`)) }) }) } async function openUrl(input) { const parsed = new URL(input) if ( parsed.protocol !== 'https:' || parsed.hostname !== 'i.beautsgo.com' || parsed.username || parsed.password ) { throw new Error('URL not allowed') } const safeUrl = parsed.href if (process.platform === 'darwin') { return launch('open', [safeUrl]) } if (process.platform === 'win32') { return launch('cmd.exe', ['/d', '/s', '/c', 'start', '', safeUrl]) } return launch('xdg-open', [safeUrl]) } ``` On Windows, prefer a native URL-opening API that does not require `cmd.exe`; if `cmd.exe` is unavoidable, apply Windows-specific argument handling and strict URL validation. ]]>

T09 · Insecure Skill Coding Practices

Error
Location
api/skill.js:98
Finding

Appointment Data Can Be Transmitted Without Reliably Enforced Explicit Consent

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
api/skill.js:12
Finding

Reusable API Credentials Are Hard-Coded and Publicly Documented

Content
View full analysis
{ const url = new URL(HOSPITALS_API_URL) const options = { hostname: url.hostname, path: url.pathname, method: 'POST', headers: { 'X-Open-Token': HOSPITALS_API_TOKEN }, } ``` A separate authorization credential is embedded in the price-query code: ```js const options = { hostname: 'apis.beise.com', port: 50144, path: path, method: 'GET', headers: { 'Authorization': '275aed9b-7c41-4a88-b291-20c0df803148', }, } ``` The synchronization script contains the same hospital-list token: ```js const API_URL = 'https://api.yestokr.com/openapi/HospitalManage/listing' const TOKEN = 'beautsgo-openapi-fixed-token-change-me' function fetchHospitals() { return new Promise((resolve, reject) => { const url = new URL(API_URL) const options = { hostname: url.hostname, path: url.pathname, method: 'POST', headers: { 'X-Open-Token': TOKEN, }, ``` The price API credential is additionally exposed in `SKILL.md:253-254`: ```md - `GET https://apis.beise.com:50144/c5d1dcbc/ProjectDraft/search?h_id={id}&keywords={keyword}` - `Authorization: 275aed9b-7c41-4a88-b291-20c0df803148` ``` ### Technical Analysis Credentials shipped in source code or documentation cannot be considered secret. Every user who downloads the Skill can extract and reuse them independently of the intended Skill workflow. The hospital-list token resembles a placeholder, but the code actively sends ...[truncated 1220 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Note
Location
skills/beautsgo-booking/SKILL.md:69
Finding

Nested Skill Manifest Omits Runtime Network Destinations

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (54)

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
entry: api/skill.js

Known Vulnerable Dependency: brace-expansion==1.1.13 — 3 advisory(ies): CVE-2026-13149 (brace-expansion: DoS via exponential-time expansion of consecutive non-expanding); CVE-2026-14257 (brace-expansion: DoS via unbounded expansion length causing an out-of-memory pro); CVE-2026-69152 (brace-expansion: DoS via unbounded intermediate arrays, bypassing the CVE-2026-1)

High
Category
Supply Chain
Confidence
95% confidence
Finding

brace-expansion 1.1.13 has multiple documented denial-of-service issues involving pathological expansion leading to excessive CPU or memory use. Although it appears only in the dev/test dependency tree, vulnerable globbing/parsing code can still be abused in CI or local tooling if untrusted patterns are processed.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: browserslist==4.28.1 — 2 advisory(ies): CVE-2026-73088 (Browserslist: Uncaught crash / prototype write via untrusted browserslist-stats.); CVE-2026-73089 (Browserslist: Unbounded memory growth (no cache eviction) via distinct query res)

High
Category
Supply Chain
Confidence
90% confidence
Finding

browserslist 4.28.1 is flagged for crash/prototype-write and memory growth issues when handling untrusted stats/query inputs. This is a real dependency risk, but in this repository it is part of development tooling, which lowers likelihood unless CI or build jobs accept attacker-controlled browserslist data.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: js-yaml==3.14.2 — 4 advisory(ies): CVE-2026-84375 (js-yaml: maxTotalMergeKeys does not limit CPU use for empty merge sources); CVE-2026-59869 (js-yaml: YAML merge-key chains can force quadratic CPU consumption); GHSA-5p4m-2wfm-xmqj (JS-YAML: Quadratic CPU consumption in !!omap resolution (3.x and 4.x) — CVE-2026) +1 more

High
Category
Supply Chain
Confidence
96% confidence
Finding

js-yaml 3.14.2 has multiple CPU-consumption issues that can be triggered by crafted YAML structures such as merge-key chains or omap content. Even as a transitive dev dependency, this remains a true vulnerability if any tooling parses untrusted YAML during CI, tests, or local automation.

Content

No source excerpt is available for this finding.

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/publish-clawdhub.sh (reported line 38)May include surrounding context.

sh
-a "$ROOT/.claw-agent/avatar.svg"

  echo ""
  echo "⚠️  请记下上面输出里的 Access Token,以后换机器用 claw login -t <token> 重新登录"
fi
echo ""

Hidden Instructions

High
Category
Prompt Injection
Confidence
70% confidence
Finding

Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Content

Scanner excerpt · 市场上架报告.html (reported line 40)May include surrounding context.

html
<h1>beautsgo-booking 市场上架报告</h1>
<div class="meta">统计时间:2026-05-21 · 当前版本 v1.0.7</div>

<!-- 汇总 -->
<div class="summary">
<h3 style="margin-top:0;color:#222">总览</h3>
<table>

Rp1

Medium
Category
MCP Rug Pull
Confidence
96% confidence
Finding

The README instructs users to execute npx clawhub install beautsgo-booking without pinning a specific package version. Because npx resolves the latest published package by default, a compromised upstream package, typosquatted dependency, or malicious update could be executed on the user's machine during installation.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding

The README recommends npx skills add against a remote skill source without any version pinning or integrity verification. This creates a supply-chain risk because the fetched skill can change over time, allowing users to install newer or tampered content than what was reviewed.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding

Using npx -y smithery skill add beautsgo7/beautsgo-booking without a pinned version allows execution of whatever package/version is current at install time. In a skill ecosystem, this is especially risky because install-time tooling may execute scripts or fetch additional remote content.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The README advertises direct appointment submission and browser-opening actions as core capabilities, but it does not clearly warn that the skill may open external URLs or transmit booking data to third-party services. Users may unknowingly trigger real-world actions or data disclosure through normal conversation, which raises consent and phishing-style risk in an agent context.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The API booking example shows multi-turn appointment submission but omits any privacy notice, consent language, or description of what personal data is collected and sent. For a medical-aesthetic booking workflow, this context increases sensitivity because names, dates, contact details, and procedure interests may constitute sensitive personal or health-adjacent information.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
96% confidence
Finding

The quick-start section repeats the unpinned npx clawhub install beautsgo-booking command, reinforcing insecure installation practices. Repetition increases the chance that users will follow the unsafe command and be exposed to supply-chain compromise if the package or its dependencies are later replaced or poisoned.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The skill instructs the agent to collect a user's phone number and submit it to a third-party booking API, but the example flow does not present a clear, prominent user-facing consent notice at the point of collection. In a conversational context, users may provide sensitive contact data without fully understanding that it will be transmitted off-platform to an external service.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
93% confidence
Finding

This example operationalizes transmission of a user's phone number and booking details to a third-party API endpoint. In context, the danger is not the mere existence of an external request, but that the flow encourages direct submission of personal data in chat with no explicit confirmation step immediately before exfiltration to the external service.

Content

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

输入: { "query": "2人,3月26日下午,19102044571" }

执行: 调用 POST https://api.yestokr.com/api/Appointment/saveFromSkill

json
{

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

md
// 实时医院列表(运行时替换)
let hospitals = staticHospitals

const HOSPITALS_API_URL = 'https://api.yestokr.com/openapi/HospitalManage/listing'
const HOSPITALS_API_TOKEN = 'beautsgo-openapi-fixed-token-change-me'

/**

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

md
// 实时医院列表(运行时替换)
let hospitals = staticHospitals

const HOSPITALS_API_URL = 'https://api.yestokr.com/openapi/HospitalManage/listing'
const HOSPITALS_API_TOKEN = 'beautsgo-openapi-fixed-token-change-me'

/**

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

md
// 实时医院列表(运行时替换)
let hospitals = staticHospitals

const HOSPITALS_API_URL = 'https://api.yestokr.com/openapi/HospitalManage/listing'
const HOSPITALS_API_TOKEN = 'beautsgo-openapi-fixed-token-change-me'

/**

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · api/skill.js (reported line 12)May include surrounding context.

js
// 实时医院列表(运行时替换)
let hospitals = staticHospitals

const HOSPITALS_API_URL = 'https://api.yestokr.com/openapi/HospitalManage/listing'
const HOSPITALS_API_TOKEN = 'beautsgo-openapi-fixed-token-change-me'

/**

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/sync-hospitals.js (reported line 18)May include surrounding context.

js
// 实时医院列表(运行时替换)
let hospitals = staticHospitals

const HOSPITALS_API_URL = 'https://api.yestokr.com/openapi/HospitalManage/listing'
const HOSPITALS_API_TOKEN = 'beautsgo-openapi-fixed-token-change-me'

/**

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · skills/beautsgo-booking/SKILL.md (reported line 71)May include surrounding context.

md
// 实时医院列表(运行时替换)
let hospitals = staticHospitals

const HOSPITALS_API_URL = 'https://api.yestokr.com/openapi/HospitalManage/listing'
const HOSPITALS_API_TOKEN = 'beautsgo-openapi-fixed-token-change-me'

/**

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · skills/beautsgo-booking/SKILL.md (reported line 80)May include surrounding context.

md
// 实时医院列表(运行时替换)
let hospitals = staticHospitals

const HOSPITALS_API_URL = 'https://api.yestokr.com/openapi/HospitalManage/listing'
const HOSPITALS_API_TOKEN = 'beautsgo-openapi-fixed-token-change-me'

/**

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The intent-detection comment says consult should mean '自动化点击' and later user-facing text says '自动点击预约按钮' and '自动点击咨询按钮'. In actual code, consult just calls openUrl on a chat URL, and book/fill_form either prompts for info or posts directly to a backend API; no browser-side button clicking automation is implemented.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
90% confidence
Finding

This code transmits user-supplied booking data, including contact information and appointment details, to an external service. In the context of a medical/beauty booking skill, that external transmission is expected functionally, but it still becomes a security/privacy concern when combined with limited disclosure and lack of an explicit consent checkpoint.

Content

Scanner excerpt · api/skill.js (reported line 331)May include surrounding context.

js
/**
 * 通过接口提交预约
 * POST https://api.yestokr.com/api/Appointment/saveFromSkill
 */
function submitBookingApi(payload) {
  return new Promise((resolve, reject) => {

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The parsed form data is logged to the console and may include personal contact information such as phone numbers and appointment preferences. Console logs are often accessible to operators, log aggregators, or support personnel, so this creates unnecessary exposure of sensitive user data.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The full booking payload, including contact information and appointment details, is written to logs before being sent to the API. This duplicates sensitive data exposure and increases the number of systems and personnel that may access the user's personal information.

Content

No source excerpt is available for this finding.

Static analysis

Detected: suspicious.dangerous_exec, suspicious.exposed_secret_literal

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
scripts/sync-hospitals.js:147

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
SKILL.md:254