T03 · Remote Payload Retrieval and Execution
- Location
meituan-passport-user-auth/reference.md:137- Finding
Remote Node.js installer is piped directly into Bash
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill’s travel purpose is mostly coherent, but it uses sensitive Meituan authentication tokens with unpinned external npm tooling and automatic installs, so it should be reviewed before use.
Install only if you trust the publisher and runtime environment, are comfortable giving this skill Meituan auth access, and can control or pin the npm packages it runs. Avoid using it in broad local environments until the package versions are pinned, automatic global installs are removed, endpoint overrides are restricted, and token injection has clear user consent boundaries.
meituan-passport-user-auth/reference.md:137Remote Node.js installer is piped directly into Bash
SKILL.md:80Authenticated travel workflow executes a mutable latest npm package
meituan-passport-user-auth/scripts/qrcode-image.sh:48QR generation automatically installs an unpinned package globally
meituan-passport-user-auth/scripts/qrcode-image.sh:18Caller-controlled client ID is used in a predictable QR output path
meituan-passport-user-auth/SKILL.md:64User-provided base URL can redirect the authentication workflow
The declared description presents an end-user travel concierge skill focused on travel products and planning. The supplied code does not implement any travel-related functionality such as search, booking, pricing, reviews, or itinerary management. Instead, it is an installation script for a local npm package named pt-passport, including environment validation, version detection, and global CLI installation. This is a materially different primary purpose and introduces undeclared system/package-management behavior unrelated to the stated travel assistant description.
The declared description presents a broad travel concierge/booking skill, but the supplied code does not implement any travel-related functionality such as search, booking, price comparison, reviews, or itinerary planning. Instead, it is a utility script for creating QR code PNG files from a URL, storing them locally, and even installing a required npm module globally if absent. That is a materially different purpose and introduces undeclared capabilities related to file creation and package installation. Therefore, the description does not accurately represent the actual behavior of this code chunk.
The declared description presents this skill as a full-featured Meituan travel concierge handling travel product discovery and planning. However, the supplied code chunk does not implement any travel-related business logic such as searching hotels, flights, trains, tickets, deals, reviews, or itinerary management. Instead, it solely performs account authorization setup: installing/finding a passport CLI, checking cached credentials, requesting authorization links, and generating a QR code for login. While authentication could be a supporting component of a travel skill, this code chunk by itself materially differs from the declared primary purpose and exposes undeclared capabilities related to auth/token handling.
The | bash construct creates an immediate command-execution chain from untrusted network content to a local shell. In the context of a skill consumed by agents or users, this increases the chance of blindly executing attacker-controlled code and is particularly dangerous because it normalizes unsafe command-chaining behavior in setup instructions.
macOS(推荐 nvm):
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
nvm install 18
Windows:
The description is written as an official user-facing instruction in Chinese and presents the skill as the user's travel assistant without indicating any option to use another language. This can constitute a language/locale policy violation because the skill appears to assume a fixed language rather than offering user opt-in or choice.
The skill allows execution via npx without a pinned package version, which can fetch whatever version is current at runtime. This creates a supply-chain risk: a compromised upstream package, malicious update, or unexpected breaking change could execute arbitrary code during auth or query flows.
The skill's usage boundaries, prompts, waiting messages, error handling, and output requirements are all specified only in Chinese, with no indication that users may choose another language. For an end-user-facing skill, this reads as a forced locale/language behavior rather than an opt-in or clearly justified regional limitation.
The command npx @meituan-travel/ht-ai-open@latest query explicitly tracks latest, guaranteeing unreviewed code updates at execution time. In a skill that handles authentication tokens and user travel queries, this materially increases the risk of supply-chain compromise, token theft, or silent behavior changes.
The skill mandates forwarding the user's complete original input to an external CLI, which may include unnecessary personal data, credentials, health details, or unrelated context beyond the minimum needed for travel search. This violates data minimization principles and creates an avoidable disclosure path to downstream tooling and services.
The skill is designed to be automatically invoked whenever another skill command template contains ${passport_token}, with 'Token 透明注入,无需用户感知'. That creates a cross-skill privilege boundary issue: any dependent skill that can declare or inject this placeholder may silently trigger credential acquisition and use a user token without a clear, per-use authorization step.
The skill is designed to be automatically invoked whenever another skill command template contains ${passport_token}, with 'Token 透明注入,无需用户感知'. That creates a cross-skill privilege boundary issue: any dependent skill that can declare or inject this placeholder may silently trigger credential acquisition and use a user token without a clear, per-use authorization step.
The document states that auth get-code writes a session file under /tmp, but does not describe the sensitivity of its contents or local file-handling risks. Temporary directories are shared attack surfaces on many systems, and predictable or recoverable session artifacts can be read, raced, or retained longer than intended if permissions and cleanup are not tightly controlled.
The document instructs the LLM to replace ${passport_token} with the real token in the final command before execution. When secrets are embedded directly into command lines or headers, they can be exposed through shell history, process listings, debugging output, agent logs, or downstream tooling, especially in multi-layer agent execution environments.
The script automatically performs npm install -g qrcode at runtime if the module is missing, which changes the host environment and pulls code from the package registry without explicit user approval. In an agent-skill context, this expands the trust boundary from QR generation to package installation and creates supply-chain and persistence risk if the registry, package, or execution environment is compromised.
The script installs a global npm package without any interactive confirmation or prior user-facing consent, causing unexpected side effects on the system where the skill runs. This is risky because a seemingly simple utility script can mutate the environment, execute package lifecycle scripts, and fetch untrusted external code during normal operation.
The documentation recommends curl ... | bash to fetch and execute a remote installer script directly from GitHub. This pattern bypasses integrity verification and causes arbitrary code execution if the remote content, transport, repository, or user environment is compromised.
macOS(推荐 nvm):
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
nvm install 18
Windows:
The script emits a fixed Chinese message (qrcode 模块未安装,正在自动安装...) to users with no language or locale selection. This can violate language/locale policy when the skill is not explicitly documented as Chinese-only or region-specific.
This code invokes a helper to generate a QR code image and then returns the resulting file path, which implies a local file write. In this script, there is no explicit warning, confirmation, or user-facing disclosure that a file will be created on disk.