Back to skill

Security audit

Game Deals

Security checks for vulnerabilities and agentic risk

Overview

This skill fetches public Steam and Epic free-game information and has some quality and scoping issues, but I found no hidden, destructive, credential-stealing, or deceptive behavior.

Install only if you are comfortable with a Chinese-language skill that contacts Steam and Epic public endpoints and may return Steam free-to-play recommendations rather than true limited-time giveaways. Prefer installing `requests` in a virtual environment with pinned versions, and only add the optional cron job if you want daily background checks and know how to remove it.

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
SKILL.md:134
Finding
Unpinned Third-Party Dependency Installation## Vulnerability Details **File Location**: `SKILL.md:134-138`; also documented in `README.md:36-42` **Vulnerability Type**: Unpinned dependency installation and supply-chain exposure **Risk Level**: Medium ### Vulnerable Code `SKILL.md:134-138`: ```markdown Installation: ```bash pip3 install requests ``` ``` `README.md:36-42`: ```markdown ## Dependencies - Python 3 - requests ```bash pip3 install requests ``` ``` ### Technical Analysis The installation instructions retrieve `requests` without specifying an audited version, dependency lockfile, or cryptographic hashes. Consequently, the installed package and its transitive dependencies are mutable and depend on the state of the configured Python package index at installation time. This does not establish that the current `requests` package is malicious. However, it creates a supply-chain risk because a compromised upstream release, compromised package index, maliciously configured mirror, or dependency-resolution manipulation could cause users to install code that was not reviewed as part of this project. Python packages can execute code during installation through build backends and can run arbitrary code when imported. Both `scripts/epic_free.py` and `scripts/steam_free.py` import `requests`, so a substituted package would also gain an execution path whenever these scripts are invoked. ### Attack Path 1. A user follows the documented command `pip3 install requests`. 2. `pip` resolves the latest compatible package and transitive dependencies from the user's configured package index or mirror. 3. An attacker compromises an upstream release, dependency, index, or configured mirror and serves a malicious package artifact. 4. The malicious artifact executes code during installation or when the project imports `requests`. 5. The attacker's code runs with the permissions of the user executing the installation or game-deal scripts. ### Impact ...[truncated 656 chars]
Remediation
## Remediation Suggestions 1. Create a reviewed dependency file that pins exact versions, including applicable transitive dependencies. 2. Generate and record cryptographic hashes for every approved package artifact. 3. Install dependencies with hash enforcement, for example: ```bash python3 -m pip install --require-hashes -r requirements.txt ``` 4. Generate the locked dependency set using a reproducible dependency-management tool such as `pip-tools`. 5. Configure installation to use a trusted package index and avoid untrusted mirrors or unexpected extra indexes. 6. Add automated dependency vulnerability scanning and a controlled process for reviewing and updating pinned versions. 7. Update both `SKILL.md` and `README.md` so all documented installation paths use the same locked and hash-verified dependency process. 8. Prefer installation inside a dedicated virtual environment and avoid running `pip` or these scripts with administrative privileges.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Rogue AgentSelf-Modification, Session Persistence
  • 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 (15)

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
The declared description is broader than the supplied code. The implementation is limited to Epic Games only, using Epic's freeGamesPromotions endpoint and formatting current free-game results. There is no Steam integration, no timer/scheduler/push mechanism, and no separate capability for upcoming-ending promotions beyond displaying each game's end date. This is a material description-behavior mismatch because major advertised capabilities are absent from the code.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
声明描述的能力范围明显大于代码实际行为。该代码只实现了 Steam 平台的免费游戏搜索,且使用的是 `price:free` 搜索条件,更接近“免费开玩/永久免费”游戏列表,而不是 Steam/Epic 的限时免费领取活动信息。代码中没有任何 Epic 接口访问、没有结束时间或限免倒计时相关字段处理、也没有调度、持久化或消息推送功能。因此描述与实际行为存在实质性不一致。

Natural-Language Policy Violations

Medium
Confidence
91% confidence
Finding
The skill description and trigger instructions are entirely in Chinese, including required spoken trigger examples, with no indication that other languages are supported or that Chinese is an optional locale. This can violate language/locale policy when a skill implicitly requires a specific language without user opt-in or justification.

Vague Triggers

Medium
Confidence
95% confidence
Finding
The trigger phrase set includes very broad everyday-language terms such as “限免游戏”, which can easily appear in normal conversation and unintentionally invoke the skill. In an agent environment, over-broad activation increases the chance of unwanted data fetching, noisy behavior, or context hijacking by causing the wrong skill to run when the user did not clearly intend it.

Lp3

Medium
Category
MCP Least Privilege
Confidence
93% confidence
Finding
The skill documents network access via curl to Steam and Epic endpoints, but it does not declare any tool scope, permissions, or allowed-tools metadata. This creates a governance gap: reviewers and runtimes cannot reliably restrict or audit outbound access, increasing the risk of unintended data transmission or capability creep if the skill is expanded.

Vague Triggers

Medium
Confidence
93% confidence
Finding
Overly broad trigger phrases can cause the skill to activate on ordinary conversation, leading to unintended network calls and responses unrelated to the user's actual intent. In agent environments, misrouting requests to the wrong skill can expose context unnecessarily and undermine least-privilege behavior.

External Transmission

Medium
Category
Data Exfiltration
Content
**Steam 限免:**
```bash
# 获取 Steam 免费游戏(需要 Steam API Key)
curl -s "https://api.steampowered.com/ISteamApps/GetAppList/v2/" | jq '.applist.apps[] | select(.name | contains("Free"))'
```

实际使用:访问 Steam 商店免费游戏页面解析
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Session Persistence

Medium
Category
Rogue Agent
Content
**Steam 限免:**
```bash
# 获取 Steam 免费游戏(需要 Steam API Key)
curl -s "https://api.steampowered.com/ISteamApps/GetAppList/v2/" | jq '.applist.apps[] | select(.name | contains("Free"))'
```

实际使用:访问 Steam 商店免费游戏页面解析
Confidence
75% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Session Persistence

Medium
Category
Rogue Agent
Content
**Steam 限免:**
```bash
# 获取 Steam 免费游戏(需要 Steam API Key)
curl -s "https://api.steampowered.com/ISteamApps/GetAppList/v2/" | jq '.applist.apps[] | select(.name | contains("Free"))'
```

实际使用:访问 Steam 商店免费游戏页面解析
Confidence
75% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Natural-Language Policy Violations

Medium
Confidence
88% confidence
Finding
Hard-coding locale=zh-CN and country=CN forces requests into a specific regional context without user choice. This can return incorrect results, leak assumptions about user region, and create policy/compliance issues if the agent is expected to respect user-selected locale or minimize unnecessary contextual disclosure.

Natural-Language Policy Violations

Medium
Confidence
95% confidence
Finding
The request parameters hard-code locale and country values to zh-CN and CN, which imposes a specific language/region behavior for all users. This is a natural-language locale policy concern because the skill does not offer any user choice or document a justified region-specific constraint.

Intent-Code Divergence

Medium
Confidence
94% confidence
Finding
The docstring says '获取 Steam 限免/免费游戏信息' and the function says '获取 Steam 免费游戏', while the code uses the Steam search API with `price:free`, which identifies free-priced products rather than limited-time promotions. This is an active intent mismatch because the documentation suggests giveaway/promo discovery that the code does not perform.

Natural-Language Policy Violations

Medium
Confidence
96% confidence
Finding
The docstrings, fallback messages, and all user-facing output strings are written in Chinese, indicating the skill is designed to respond only in Chinese. The file does not provide any opt-in, language selection, or documented region-specific justification, which matches the locale-policy violation criteria.

Description-Behavior Mismatch

Medium
Confidence
95% confidence
Finding
The manifest describes a skill for fetching Steam and Epic limited-time free game offers, including current giveaways and expiring promotions. This function instead queries Steam for permanent free-price titles via `filters: price:free` and even falls back to a hardcoded list of always-free games like Dota 2 and CS2, which does not match '限免/喜加一' semantics.

Natural-Language Policy Violations

Low
Confidence
92% confidence
Finding
The module docstring and function docstring state the skill's behavior entirely in Chinese, indicating a fixed language/locale experience. There is no visible user opt-in, language selection, or justification that this is a China-specific or Chinese-only tool, which can violate language-choice policy.

Static analysis

No suspicious patterns detected.