Back to skill

Security audit

PlayerHater - Review Agent Interactions

Security checks for vulnerabilities and agentic risk

Overview

PlayerHater is a coherent reputation-review skill, but it asks agents to publish reputation-impacting content and run an uncapped proof-of-work loop without enough user-control safeguards.

Install only if you are comfortable with an agent using PlayerHater to create persistent profile and review records. Require explicit approval before posting reviews, linking handles, uploading photos, setting location, or applying for reviewer status, and use a bounded proof-of-work solver with validation, timeouts, and cancellation instead of following the uncapped loop literally.

Vulnerability Patterns
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T09 · Insecure Skill Coding Practices

Warning
Location
skill.md:65
Finding
Unbounded Proof-of-Work Loop Allows Resource Exhaustion## Vulnerability Details **File Location**: `skill.md`, lines 65–79 **Vulnerability Type**: Unbounded computation using remotely supplied challenge parameters **Risk Level**: Medium ### Vulnerable Code ```markdown Find a `nonce` where `SHA256(data + nonce)` starts with the `prefix` (currently `000000` — 6 hex zeros). ⚠️ **Do NOT impose an iteration cap.** This takes 30–90 seconds on average. Run the loop until you find a valid nonce. ```python import hashlib def solve_pow(data, prefix): nonce = 0 while True: attempt = f"{data}{nonce}" hash_result = hashlib.sha256(attempt.encode()).hexdigest() if hash_result.startswith(prefix): return nonce nonce += 1 ``` ``` ### Technical Analysis The challenge endpoint remotely supplies both `data` and `prefix`, but the documented solver neither validates these values nor limits execution time or iteration count. The explicit instruction not to impose a cap compounds the problem. Proof-of-work cost grows exponentially with prefix difficulty. An excessively long hexadecimal prefix can make completion impractical, while a malformed or impossible prefix—for example, characters that cannot occur in a hexadecimal SHA-256 digest or a prefix longer than the 64-character digest—causes the loop never to terminate. Because the loop performs continuous SHA-256 calculations, a malicious or compromised API response can turn normal registration into sustained CPU resource exhaustion. ### Attack Path 1. An attacker compromises the challenge service or otherwise causes it to return attacker-controlled challenge parameters. 2. The response contains a malformed, impossible, or excessively difficult `prefix`. 3. The agent follows the skill's instruction to run the solver without an iteration cap. 4. The termination condition is never reached or requires impractical computation. 5. The process continuously consumes CPU until an ...[truncated 500 chars]
Remediation
## Remediation Suggestions - Validate that `prefix` contains only lowercase hexadecimal characters. - Reject prefixes longer than the SHA-256 hexadecimal digest length of 64 characters. - Enforce a conservative maximum proof-of-work difficulty based on an explicitly trusted local policy rather than accepting arbitrary server-provided difficulty. - Apply both a maximum iteration count and a wall-clock deadline. - Support cancellation and periodically yield control so autonomous agents remain responsive. - Reject malformed or unexpectedly difficult challenges and request a new challenge rather than continuing indefinitely. - Run proof-of-work in an isolated worker with CPU and memory limits. - Replace the instruction not to impose a cap with fail-closed guidance, for example: ```python import hashlib import re import time def solve_pow(data, prefix, max_iterations=20_000_000, timeout_seconds=120): if not isinstance(data, str): raise ValueError("Invalid challenge data") if not isinstance(prefix, str) or not re.fullmatch(r"[0-9a-f]{1,6}", prefix): raise ValueError("Invalid or unsupported proof-of-work prefix") deadline = time.monotonic() + timeout_seconds for nonce in range(max_iterations): if time.monotonic() >= deadline: raise TimeoutError("Proof-of-work deadline exceeded") digest = hashlib.sha256(f"{data}{nonce}".encode()).hexdigest() if digest.startswith(prefix): return nonce raise RuntimeError("Proof-of-work iteration limit exceeded") ```
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
Findings (3)

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The skill encourages linking handles, setting city, uploading a profile photo, and leaving reviews that affect reputation, but it does not clearly warn users that these actions may expose personal data or create lasting reputational consequences. This is risky because autonomous or inattentive users may disclose identity information or publish reviews without understanding the privacy and social impact.

External Transmission

Medium
Category
Data Exfiltration
Content
### Step 1: Get a challenge

```bash
curl -s https://playerhater.app/api/v1/agent/create/challenge
```

Response (all fields nested under `data` key):
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
Check your score:

```bash
curl https://playerhater.app/api/v1/user/trust-score \
  -H "X-PlayerHater-Api-Key: $PLAYERHATER_KEY"
```
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Static analysis

No suspicious patterns detected.