Back to skill

Security audit

Videogames

Security checks for vulnerabilities and agentic risk

Overview

This skill is a coherent video-game lookup tool that uses disclosed public game-data APIs, with manageable install and caching caveats.

Before installing, expect this skill to contact public game-data services and store cached API responses locally. Prefer a pinned or trusted ClawHub installer command instead of `@latest` when possible, and set language, region, and currency options if the Spanish/EUR/ES defaults are not what you want.

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

T08 · Insecure Dependencies

Warning
Location
README.md:25
Finding
Recommended Installation Executes an Unpinned npm Package## Vulnerability Details **File Location**: `README.md:25-28` **Vulnerability Type**: Unpinned executable dependency **Risk Level**: Medium ### Vulnerable Code ```markdown ### From ClawHub (Recommended) ```bash npx clawhub@latest install ivanheral/videogames ``` ``` ### Technical Analysis The recommended installation procedure invokes `npx` with the mutable `latest` npm distribution tag. When this command is run, npm may download and immediately execute a version of `clawhub` that was not included in or evaluated during this audit. Because `latest` can be reassigned to a new package version at any time, the effective installer is not reproducible or cryptographically tied to a reviewed release. Compromise of the npm package, its maintainer account, or its publishing workflow could therefore turn the documented installation command into a remote code-execution vector. This issue concerns the recommended external installer rather than malicious behavior in the bundled Python source. The audited Python files did not contain subprocess execution, embedded malicious payloads, privilege escalation, or unrelated credential access. ### Attack Path 1. An attacker compromises the `clawhub` npm package, a maintainer account, or its release pipeline. 2. The attacker publishes a malicious package version and assigns it the `latest` distribution tag. 3. A user follows the project’s recommended installation instructions. 4. `npx` downloads the attacker-controlled version. 5. The package executes under the installing user’s account and can perform actions allowed by that account before or during Skill installation. ### Impact Assessment Successful exploitation could provide arbitrary code execution with the privileges of the user running the installation command. The accessible scope could include that user’s files, environment variables, OpenClaw configuration, Skill directories, and credentials available to the process. ...[truncated 281 chars]
Remediation
## Remediation Suggestions 1. Replace `@latest` with an explicitly reviewed and immutable package version, for example: ```bash npx clawhub@<reviewed-version> install ivanheral/videogames ``` 2. Document the expected package integrity digest and provide a verification procedure before execution. 3. Pin the installer version in release documentation and update it only after reviewing that exact release. 4. Where practical, separate download and verification from execution rather than relying on automatic `npx` retrieval. 5. Recommend running the installer as an unprivileged user in a restricted environment and never through `sudo`. 6. Consider providing a verified manual installation method based on an immutable commit or signed release archive.
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 (19)

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
The declared purpose and the detected runtime behavior do not align, especially around undeclared external network access and missing implementation for some advertised functions. Behavior mismatches are dangerous because they undermine trust and can conceal data exfiltration, unexpected API calls, or broader functionality than the user consented to.

Tp4

High
Category
MCP Tool Poisoning
Confidence
90% confidence
Finding
The declared purpose and the detected runtime behavior do not align, especially around undeclared external network access and missing implementation for some advertised functions. Behavior mismatches are dangerous because they undermine trust and can conceal data exfiltration, unexpected API calls, or broader functionality than the user consented to.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The declared purpose and the detected runtime behavior do not align, especially around undeclared external network access and missing implementation for some advertised functions. Behavior mismatches are dangerous because they undermine trust and can conceal data exfiltration, unexpected API calls, or broader functionality than the user consented to.

Rp1

Medium
Category
MCP Rug Pull
Confidence
89% confidence
Finding
The installation command uses `npx clawhub@latest`, which fetches and executes the latest published package version at install time rather than a reviewed, pinned release. If the upstream package is compromised, typo-squatted, or a malicious update is published, users following the README could execute untrusted code on their system.

Lp3

Medium
Category
MCP Least Privilege
Confidence
88% confidence
Finding
The skill declares executable tooling but does not define any explicit tool scope or permissions, while associated capabilities include environment access, file read/write, and network access. In an agent environment, missing scope boundaries can allow the skill to run with broader privileges than users or reviewers expect, increasing the chance of unauthorized data access or unintended outbound requests.

Natural-Language Policy Violations

Medium
Confidence
95% confidence
Finding
The user-facing description and help strings are written in Spanish, which imposes a specific language on users by default. Although the tool accepts a content language via `--lang`, that option does not offer a choice for the CLI interface language itself, so the file enforces a locale without user opt-in.

Natural-Language Policy Violations

Medium
Confidence
96% confidence
Finding
The file sets `DEFAULT_LANGUAGE = "spanish"`, which establishes a fixed language choice by default. Under the policy, forcing a specific language without offering user choice or documenting justified locale constraints is a natural-language policy violation.

Natural-Language Policy Violations

Medium
Confidence
96% confidence
Finding
The docstring and user-facing print messages are written in Spanish, which imposes a specific language on the interaction with no indication that the user can choose another language. The policy explicitly calls out language or locale constraints as violations when they are not optional or justified.

External Transmission

Medium
Category
Data Exfiltration
Content
STEAM_SEARCH_URL = "https://store.steampowered.com/api/storesearch/?term={term}&l={lang}&cc={cc}"
STEAM_DETAILS_URL = "https://store.steampowered.com/api/appdetails?appids={appid}&l={lang}&cc={cc}"
STEAM_FEATURED_URL = "https://store.steampowered.com/api/featuredcategories/?l={lang}&cc={cc}"
STEAM_PLAYERS_URL = "https://api.steampowered.com/ISteamUserStats/GetNumberOfCurrentPlayers/v1/?appid={appid}"
STEAM_NEWS_URL = "https://api.steampowered.com/ISteamNews/GetNewsForApp/v0002/?appid={appid}&count=3&maxlength=300&format=json"
STEAM_MOST_PLAYED_URL = "https://api.steampowered.com/ISteamChartsService/GetMostPlayedGames/v1/"
STEAM_ACHIEVEMENTS_URL = "https://api.steampowered.com/ISteamUserStats/GetGlobalAchievementPercentagesForApp/v0002/?gameid={appid}"
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
STEAM_SEARCH_URL = "https://store.steampowered.com/api/storesearch/?term={term}&l={lang}&cc={cc}"
STEAM_DETAILS_URL = "https://store.steampowered.com/api/appdetails?appids={appid}&l={lang}&cc={cc}"
STEAM_FEATURED_URL = "https://store.steampowered.com/api/featuredcategories/?l={lang}&cc={cc}"
STEAM_PLAYERS_URL = "https://api.steampowered.com/ISteamUserStats/GetNumberOfCurrentPlayers/v1/?appid={appid}"
STEAM_NEWS_URL = "https://api.steampowered.com/ISteamNews/GetNewsForApp/v0002/?appid={appid}&count=3&maxlength=300&format=json"
STEAM_MOST_PLAYED_URL = "https://api.steampowered.com/ISteamChartsService/GetMostPlayedGames/v1/"
STEAM_ACHIEVEMENTS_URL = "https://api.steampowered.com/ISteamUserStats/GetGlobalAchievementPercentagesForApp/v0002/?gameid={appid}"
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
STEAM_SEARCH_URL = "https://store.steampowered.com/api/storesearch/?term={term}&l={lang}&cc={cc}"
STEAM_DETAILS_URL = "https://store.steampowered.com/api/appdetails?appids={appid}&l={lang}&cc={cc}"
STEAM_FEATURED_URL = "https://store.steampowered.com/api/featuredcategories/?l={lang}&cc={cc}"
STEAM_PLAYERS_URL = "https://api.steampowered.com/ISteamUserStats/GetNumberOfCurrentPlayers/v1/?appid={appid}"
STEAM_NEWS_URL = "https://api.steampowered.com/ISteamNews/GetNewsForApp/v0002/?appid={appid}&count=3&maxlength=300&format=json"
STEAM_MOST_PLAYED_URL = "https://api.steampowered.com/ISteamChartsService/GetMostPlayedGames/v1/"
STEAM_ACHIEVEMENTS_URL = "https://api.steampowered.com/ISteamUserStats/GetGlobalAchievementPercentagesForApp/v0002/?gameid={appid}"
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
STEAM_SEARCH_URL = "https://store.steampowered.com/api/storesearch/?term={term}&l={lang}&cc={cc}"
STEAM_DETAILS_URL = "https://store.steampowered.com/api/appdetails?appids={appid}&l={lang}&cc={cc}"
STEAM_FEATURED_URL = "https://store.steampowered.com/api/featuredcategories/?l={lang}&cc={cc}"
STEAM_PLAYERS_URL = "https://api.steampowered.com/ISteamUserStats/GetNumberOfCurrentPlayers/v1/?appid={appid}"
STEAM_NEWS_URL = "https://api.steampowered.com/ISteamNews/GetNewsForApp/v0002/?appid={appid}&count=3&maxlength=300&format=json"
STEAM_MOST_PLAYED_URL = "https://api.steampowered.com/ISteamChartsService/GetMostPlayedGames/v1/"
STEAM_ACHIEVEMENTS_URL = "https://api.steampowered.com/ISteamUserStats/GetGlobalAchievementPercentagesForApp/v0002/?gameid={appid}"
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Natural-Language Policy Violations

Medium
Confidence
96% confidence
Finding
Across the file, user-facing strings are consistently written in Spanish, and comments indicate Spanish is used by default for language handling. This creates a language/locale policy concern because the skill forces a specific language experience rather than offering the user a choice or documenting a justified locale restriction.

Natural-Language Policy Violations

Low
Confidence
95% confidence
Finding
The file contains multiple Spanish-only user-facing strings in the docstring and printed output, such as "Obtiene un mapa...", "No se encontraron ofertas", and "Mejores Ofertas". This indicates a fixed locale behavior without any visible user opt-in or justification for a Spanish-only interface.

Natural-Language Policy Violations

Low
Confidence
92% confidence
Finding
The string literal "[¡MÍNIMO HISTÓRICO!]" is user-facing output and is hardcoded in Spanish, with no indication that users can choose their preferred language or locale. This can conflict with organizational language policy requirements when a skill forces a specific language without opt-in.

Natural-Language Policy Violations

Low
Confidence
80% confidence
Finding
The file's human-readable comments and docstrings consistently force Spanish as the communication language, which can conflict with an organizational language/locale policy when no user opt-in or alternative is provided. This is a natural-language policy issue rather than a code defect.

Missing User Warnings

Low
Confidence
83% confidence
Finding
This code performs outbound HTTP GET requests via urlopen and persists returned data to a local cache file under the user's home directory. While the docstring describes the behavior for developers, there is no user-facing prompt, visible log, or other disclosure in this file to inform users that network access and local file writes will occur.

Natural-Language Policy Violations

Low
Confidence
95% confidence
Finding
This code includes natural-language content in Spanish for docstrings and later user-visible print messages, but there is no indication that the skill is intentionally Spanish-only or that users can choose a language. That creates a locale policy concern because the file hard-codes a specific language rather than offering opt-in or documenting a justified regional constraint.

Natural-Language Policy Violations

Low
Confidence
93% confidence
Finding
The function prints multiple user-visible status messages exclusively in Spanish, which suggests the skill enforces a language choice at runtime. The file does not provide a locale toggle, user preference handling, or justification for a Spanish-only experience.

Static analysis

No suspicious patterns detected.