Back to skill

Security audit

Game - Endless Downstairs

Security checks for vulnerabilities and agentic risk

Overview

This appears to be a local text adventure game, but its assistant instructions create an unsafe command path from player text into shell-style Python commands.

Install only if you are comfortable running a local Python text game through an assistant. Prefer a pinned install source, review the files first, and ensure player text is passed as a literal argument or structured parameter rather than concatenated into a shell command.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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
Findings (2)

T09 · Insecure Skill Coding Practices

Error
Location
skill.md:19
Finding

Player-Controlled Text Is Unsafely Interpolated into a Shell-Style Command

Content
View full analysis
` | ## Translate Player Input → Python Command Execute corresponding commands based on the player's natural language: - "I choose the first one/1" → `python game.py choose 1` - "Status" → `python game.py status` - "Items/Inventory" → `python game.py inventory` - "Input xxx" → `python game.py input xxx` ``` ### Technical Analysis The Skill instructs the AI agent to insert player-controlled natural-language text directly into a command. It does not require structured argument-array execution, escaping, quoting, or validation. The Python implementation itself does not invoke a shell: `game.py` reads the value from `sys.argv[2]`. However, the vulnerable command is constructed by the agent before Python receives it. If the agent's command tool passes the generated string through a shell, shell metacharacters in the player's text can terminate or modify the intended command. For example, input containing a semicolon, command substitution, pipeline, logical operator, or output redirection may be interpreted by the shell rather than passed as a literal argument to `game.py`. ### Attack Path 1. A player invokes the text-input feature using content containing shell syntax, such as `Input x; id`. 2. The Skill translates this directly into a command resembling: ```bash python game.py input x; id ``` 3. In a shell-backed execution environment, the shell treats the semicolon as a command separator. 4. `python game.py input x` runs first, followed by the attacker-supplied command. 5. The injected command runs with the same operating-system privileges, environment access, and filesystem access as the AI agent's command-execution process. ### Impact Assessment Successful exploitation can provide arbitrary ...[truncated 660 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
README.md:12
Finding

Quick-Start Installation Executes an Unpinned Third-Party Package

Content
View full analysis
Remediation
View remediation
add https://github.com/OpenclawGame/endless-downstairs.git ``` 2. Where supported, verify the package with a lockfile, registry integrity metadata, checksum, or signature. 3. Pin the Skill repository to a reviewed commit or release tag rather than relying on a mutable default branch. 4. Document the manual installation route as the safer alternative: - Clone a specific commit or signed release. - Review the checked-out files. - Run the local Python entry point without executing an unrelated package installer. 5. Periodically review the pinned installer and its transitive dependencies before updating the documented version. ]]>
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (29)

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The declared description says this skill provides an interactive game interface with game state management and event selection for playing Endless Downstairs. However, the supplied code does not implement gameplay, state management, event selection, or an interactive interface. It is an offline utility script for i18n generation: it reads JSON files from data/events and data/items, collects text strings, and writes translation files under i18n. This is a materially different primary purpose and includes undeclared file processing behavior unrelated to the described user-facing game interface.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The supplied code does not implement an interactive game interface, game state management, or event selection handling. Instead, it is a localization support module: it manages the current language, loads translation files, retrieves localized strings for events/items/abilities/UI, and persists language preference in config.json. While such functionality could support a game, the actual code chunk’s primary purpose is materially different from the declared description, so this is a description-behavior mismatch.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
93% confidence
Finding

The README instructs users to run npx skills add against a GitHub repository without pinning a specific version, commit, or release. This creates a supply-chain risk because future changes to the referenced package or installer path could alter what gets executed at install time, and users are encouraged to trust and run it directly.

Content

No source excerpt is available for this finding.

Ssd 1

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The instruction 'Directly output the game content, do not think, modify, add, or summarize' attempts to suppress the assistant's normal judgment and safety-oriented mediation. In a hostile or prompt-injection scenario, this can reduce the assistant's ability to contextualize, warn, or refuse problematic content and encourages blind relay behavior.

Content

No source excerpt is available for this finding.

Ssd 4

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The multi-step instructions are designed to push the assistant into passive execution and reduce its decision-making role, including commands that discourage it from making choices until explicitly told. In an agent setting, this pattern can be abused to erode safeguards and make the model act as a conduit for scripted behavior rather than an active safety-enforcing intermediary.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
93% confidence
Finding

The README instructs users to install and execute npx skills add https://github.com/OpenclawGame/endless-downstairs.git without pinning a specific version, commit, or immutable release. This creates a supply-chain risk: if the referenced package, installer behavior, or fetched repository changes later, users may unknowingly run different code than expected, which is especially relevant because this skill is meant to be installed and used through an AI-assistant integration path.

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.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

This JSON file is filled with player-facing descriptions, prompts, and choices in Chinese, with no indication that the skill supports other languages or that Chinese is an intentional region-specific restriction. Under the language/locale policy, forcing a specific language without user opt-in is a natural-language policy violation.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

This JSON file’s natural-language content is consistently presented in Chinese, including descriptions, prompts, and choice labels, but there is no indication in the file that the skill is intentionally region-specific or that users can opt into this locale. Under the policy for natural-language violations, forcing a specific language without user choice or clear justification is reportable across all file types.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

This JSON content presents all user-facing descriptions and choice text in Chinese, with no indication that the skill is region-specific or that users may select another language. Under the policy, a skill that effectively forces a specific language without opt-in is a natural-language policy violation.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The guide instructs users to say the Chinese phrase 「查看状态」 directly to their AI assistant, which imposes a specific language command rather than offering a language choice. Because the file also presents an English option earlier, this is a clearer language/locale policy issue than general Chinese narrative content.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

This code initializes the game state with language: str = 'zh', making Chinese the default language for all users unless they explicitly change it later. The policy for natural-language behavior requires avoiding forced language or locale choices without user opt-in unless clearly justified as region-specific, and no such justification appears in this file.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

When loading saved data, the code falls back to 'zh' if no language is present and immediately applies it via set_language(lang). This enforces a specific language in the absence of stored preference, which is a natural-language policy concern because the user is not given a choice or opt-in at that point.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

This Python file contains natural-language descriptions, comments, docstrings, console output, and UI strings entirely in Chinese, and its stated purpose is to generate Chinese translation files. There is no indication that the language choice is optional, user-selectable, or justified as a region-specific tool, which matches the policy concern for forcing a specific language without opt-in.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The module initializes _current_language to 'zh', making Chinese the default language before any user choice is established. This is a natural-language locale policy concern because the skill imposes a specific language by default rather than offering an explicit opt-in or neutral selection.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

When no translation data is available, the code unconditionally falls back to zh. This enforces a specific locale even for users who may have selected or expected another supported language, without documented justification or user opt-in.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

This localization file overwhelmingly fixes the skill experience in Chinese, including gameplay text and UI strings, rather than presenting a user-selected locale throughout. Although a language selection entry exists later in the file, the file content itself is still language-specific and does not by itself offer opt-in or choice for the localized output it defines.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The manifest description says to use the skill when users 'want to play the Endless Downstairs game, start a horror adventure, or need a text adventure game experience.' The latter two phrases are broad natural-language descriptions that can overlap with general entertainment requests, making activation scope less specific than the concrete game title alone.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
84% confidence
Finding

The file instructs the assistant to 'translate the player's input text' before processing, but does not offer the user any language choice or explain the locale behavior. This imposes a language-handling policy unilaterally rather than as an opt-in or clearly justified constraint.

Content

No source excerpt is available for this finding.

Unrestricted Tool Access

Medium
Category
Excessive Agency
Confidence
92% confidence
Finding

The skill instructs the agent to convert natural language directly into shell-style Python invocations and to return results 'exactly as they are,' creating a tool-execution pathway with minimal safety mediation. In context this is limited to a game interface, which reduces severity, but unrestricted forwarding of user-derived text into python game.py input <文字> can still enable unsafe argument handling or downstream command/code injection if the backing implementation is not robust.

Content

Scanner excerpt · skill.md (reported line 34)May include surrounding context.

md
## Rules

- **Output the game content directly; do not think, modify, add, or summarize.**
- **Decision-making power lies entirely with the player; do not execute any commands, including continuing options, before the player gives a clear instruction.**
- **Only one command can be executed per conversation turn; multiple commands cannot be executed consecutively.**

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
82% confidence
Finding

The file tells the assistant to translate player language into python game.py commands and return results directly. Elsewhere it documents a save system that persists to save.json and checkpoints.json, but this integration section does not warn users that normal gameplay commands may modify files on disk.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
81% confidence
Finding

This markdown file describes automated gameplay behavior where the assistant 'might get excited and start playing the game itself,' but frames it as a suggestion rather than a clear upfront warning about loss of user control. Because the skill is intended for use with an AI assistant, the description should explicitly disclose this behavior before or alongside automation examples.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
94% confidence
Finding

The config sets the language to "en" unconditionally, which is a natural-language locale constraint. There is no indication in this file that users can opt in, select another language, or that the English-only setting is required for a documented region-specific purpose.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
95% confidence
Finding

This JSON file is composed almost entirely of user-facing narrative and choice text in Chinese, with no indication that the skill is region-specific or that users can opt into a Chinese locale. Under the policy, forcing a specific language without user choice is a natural-language locale violation.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
83% confidence
Finding

This JSON file includes substantial Chinese-language narrative text, while the file also contains an English/Chinese language selector elsewhere. The presence of fixed Chinese content can violate language/locale policy expectations if users who selected English are still shown untranslated content without explicit opt-in or documented locale constraints.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.