T03 · Remote Payload Retrieval and Execution
- Location
scripts/install.py:129- Finding
Mutable Remote Executables Are Downloaded Without Integrity Verification
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is a coherent hotel booking assistant, but it asks agents to install and update mutable executable tooling and has Windows wrapper patterns that can turn user-provided booking text into shell execution risk.
Review this skill before installing. It can interact with a real hotel booking service, collect contact details, create orders and payment links, and read booking history. Only install it if you trust RollingGo's npm and GitHub release channels, and prefer a pinned, verified, skill-local executable before using it for bookings.
scripts/install.py:129Mutable Remote Executables Are Downloaded Without Integrity Verification
scripts/rgh.js:17Windows Node.js Wrapper Forwards User-Controlled Arguments Through a Command Shell
scripts/rgh.py:18Windows Python Wrapper Executes a Command Script Through the Shell
The skill is presented as a hotel booking assistant, but its behavior includes package installation, downloading binaries from GitHub releases, writing .version_check, modifying local files/permissions, and environment/platform detection. This mismatch matters because users or hosts may authorize the skill expecting only hotel-search functionality, while it actually performs broader system-changing operations that expand attack surface and can be abused via compromised dependencies or remote content.
Referenced artifact was not completely inspected
> - **每日检查**:若当前目录下的 `.version_check` 不存在或记录日期非今天,静默请求远端 `SKILL.md`(地址拼接规则:将元数据中的 `{repository}` 域名替换为 `raw.githubusercontent.com`,并在末尾追加 `/main/skills/{name}/S
The skill explicitly requires and instructs use of shell, network, and environment-dependent tooling (node, python, curl, wget, npm installs, login flows, remote version checks) but does not declare any permissions or allowed-tools scope. This creates an under-specified trust boundary where a host may grant broader capabilities than users expect, increasing risk of unintended command execution, network access, and local file modification.
The manifest description and the entire operational guidance are written to require Chinese phrasing and Chinese output conventions, but the file does not offer users a language or locale choice. Under the policy, forcing a specific language without user opt-in is a natural-language policy concern unless the regional restriction is explicitly documented and justified.
The update instruction uses npx skills update {name} without pinning a specific trusted version of the updater. Because npx may resolve and execute whatever package version is current at execution time, this introduces a supply-chain risk where a compromised or incompatible upstream release could run arbitrary code on the user's machine.
The trigger list is very broad and includes generic terms like '入住', '住哪', '住宿', and other common lodging/travel phrases, which can cause the skill to activate in contexts where the user did not intend to initiate a booking workflow. In a skill with shell, network, login, installation, and payment-related behavior, accidental activation is more dangerous because it can prompt external auth flows, perform remote queries, or steer the user into transactional actions unnecessarily.
The book command explicitly collects and transmits personal data including contact name, email, and guest identity fields, but the documentation does not warn operators that they are handling and sending PII to an external booking service. In a hotel-booking skill, this omission increases the chance of unnecessary collection, accidental disclosure, or use without informed user consent.
The orders and order-detail commands expose historical booking records and contact details such as names, email, dates, addresses, and payment/order status, yet the document provides no privacy or access-control warning. In this skill context, these commands can reveal sensitive travel history and personal information if invoked without strong authorization checks or if outputs are logged broadly.
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
def run_command(args):
"""Run a system command and return exit code and output."""
try:
result = subprocess.run(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
return result.returncode, result.stdout, result.stderr
except Exception as e:
return -1, "", str(e)
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
print("✅ Successfully installed @rollinggo/hotel globally via npm!")
return True
print("⚠️ npm global installation failed (might need administrator/sudo permissions).")
print(stderr)
return False
The script fetches release metadata and later downloads executable artifacts from remote GitHub endpoints, then installs them without any integrity verification such as pinned checksums or signature validation. In an installer context this is more dangerous because a compromised GitHub account, tampered release asset, MITM via a broken trust store, or poisoned dependency source could lead to arbitrary code execution when the downloaded binary is run.
def get_latest_release_assets():
"""Query GitHub API for the latest release assets."""
api_url = "https://api.github.com/repos/RollingGo-AI/oauth-hotel-cli/releases/latest"
req = urllib.request.Request(
api_url,
headers={'User-Agent': 'RollingGo-Installer/1.0'}
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
# Check if node and npm are available
has_node = False
try:
node_code = subprocess.call(["node", "--version"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
npm_code = subprocess.call(["npm" if platform.system() != "Windows" else "npm.cmd", "--version"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
has_node = (node_code == 0 and npm_code == 0)
except Exception:
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
has_node = False
try:
node_code = subprocess.call(["node", "--version"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
npm_code = subprocess.call(["npm" if platform.system() != "Windows" else "npm.cmd", "--version"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
has_node = (node_code == 0 and npm_code == 0)
except Exception:
has_node = False
This code launches an external command via spawn and passes through process arguments and the full environment, which can affect the system or transmit data depending on the invoked tool. Although there is error logging, there is no confirmation prompt, user-facing notice before execution, or explanatory comment warning about the subprocess behavior itself.
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
args = [target_cmd] + sys.argv[1:]
try:
use_shell = is_win and target_cmd.endswith(".cmd")
res = subprocess.run(args, shell=use_shell)
sys.exit(res.returncode)
except KeyboardInterrupt:
sys.exit(130)
All user-facing headings, parameter descriptions, and operational text are presented only in Chinese, with no indication that another language is available or that Chinese is a justified region-specific requirement. Under SQP-3, forcing a specific language without user opt-in can be a natural-language policy violation.
The file contains Chinese-only comments and user-facing error messages, such as the console output on execution failure, with no indication that language is configurable or intentionally region-scoped. This can violate a language/locale policy when a skill imposes a specific language without user opt-in.
The console.error messages shown to users are written only in Chinese, and the file does not offer any language selection or fallback. Under the stated policy, forcing a specific language in natural-language output is a locale-policy concern unless clearly documented and justified.
Detected: suspicious.dangerous_exec