Back to skill

Security audit

BallBall

Security checks for vulnerabilities and agentic risk

Overview

This football betting skill is coherent, but it automatically stores betting history and updates future prediction behavior across sessions without clear user control.

Review this skill before installing if you do not want football betting requests, predictions, match IDs, recommendations, and learned model changes saved across sessions. Use it only if you are comfortable with external lookups on Nowscore and with persistent betting-analysis memory, and consider disabling or manually controlling the memory writes if your environment allows it.

Vulnerability Patterns
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • 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
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
Findings (1)

T02 · Agent Memory Poisoning

Warning
Location
references/review-framework.md:43
Finding
Untrusted Match Data Can Poison Persistent Agent Memory## Vulnerability Details **File Location**: `references/review-framework.md:43-75`; related mandatory persistence instructions also appear in `SKILL.md:52-54`, `SKILL.md:84-92`, and `references/prediction-framework.md:248-266` **Vulnerability Type**: T02: Agent Memory Poisoning **Risk Level**: Medium ### Vulnerable Code ```markdown ### 3. Framework Optimization Based on deviation analysis: **Parameter adjustments:** - Adjust feature weights in logistic regression model - Update league-specific factors and coefficients - Calibrate motivation and environment factor scaling - Refine squad power decay calculations **Pattern recognition:** - Remember pre-match data features of this match - Remember league-specific odds patterns (盤路數據特徵) - Build league-specific calculation frameworks and analysis logic **Goal**: Achieve 70%+ accuracy for both Asian handicap and over/under predictions. --- ## Framework Storage Save the optimized analysis framework including: 1. **Data reading & statistics** - What data points proved most predictive 2. **Fundamental analysis logic** - Refined analysis methodology 3. **Analysis methods** - Updated model parameters and weights 4. **Win probability calculation** - Calibrated probability formulas 5. **Prediction model** - Updated logistic regression parameters ### Storage Location Save framework updates to memory files for persistence across sessions: - `~/.claude/projects/*/memory/football-prediction-framework.md` - Core framework parameters - `~/.claude/projects/*/memory/football-league-profiles.md` - League-specific profiles - `~/.claude/projects/*/memory/football-match-history.md` - Historical match records and accuracy ``` The related mandatory history-writing instruction is: ```markdown ## Step 6: Archiving (MANDATORY) This must be performed after every prediction and cannot be skipped. Append the match ID, league, match time, recommendation, predicted score, injury information, odds movement, and core reasoning to: ...[truncated 3297 chars]
Remediation
## Remediation Suggestions 1. **Make persistence explicitly opt-in** - Ask for informed user approval before writing any match record or model update. - Allow predictions and reviews to complete without persistent storage. 2. **Use a least-privilege storage location** - Replace Agent-wide and wildcard memory paths with a dedicated Skill data directory. - Restrict writes to one explicitly resolved file owned by this Skill. - Do not write into unrelated project or general Agent memory. 3. **Separate observations from instructions** - Store match records as schema-validated JSON or another structured data format. - Never persist external text as executable Agent instructions. - Maintain model configuration separately from raw user and webpage content. 4. **Validate review inputs** - Verify match results against a trusted source before using them for learning. - Record source URL, retrieval time, match ID, and integrity metadata. - Mark user-supplied results as unverified until corroborated. 5. **Constrain automated learning** - Require a statistically meaningful sample size before changing weights. - Apply strict upper and lower bounds to every coefficient. - Limit the maximum adjustment permitted per review. - Reject anomalous or contradictory records. 6. **Add review and rollback controls** - Show proposed parameter changes to the user before committing them. - Version every model update and retain the prior known-good configuration. - Provide a straightforward way to inspect, reject, and revert changes. 7. **Sanitize externally sourced content** - Treat browser content and user input as untrusted data. - Extract only expected fields through an allowlisted schema. - Exclude embedded instructions, markup, scripts, and unrelated free-form text from persistent records.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (18)

Vague Triggers

Medium
Confidence
93% confidence
Finding
The trigger phrases include generic requests like predicting or analyzing football matches, which are broad enough to activate during ordinary sports discussion. Overbroad activation increases the likelihood of unintended browsing, data collection, and persistent writes when the user did not explicitly request this skill.

Context-Inappropriate Capability

Medium
Confidence
93% confidence
Finding
The skill mandates writing betting recommendations, match identifiers, and predicted scores to a cross-session memory file even though persistent storage is not necessary to fulfill a one-off prediction request. This expands the skill from transient analysis into ongoing data retention, creating avoidable privacy and data minimization risk if the memory is later exposed, misused, or mixed with other sessions.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The skill requires writing match history to a user memory file but does not present a clear upfront warning or consent step before persistent storage. Hidden or undisclosed retention is risky because users may not expect cross-session recording of their betting-related activity and recommendations.

Ssd 3

Medium
Confidence
92% confidence
Finding
Mandatory persistence of match analysis to a shared memory file creates a natural-language data retention risk because betting preferences, match selections, and recommendations accumulate over time. Even if the content is not highly sensitive by itself, cross-session logs can reveal behavioral patterns and may leak into later prompts or outputs.

Context-Inappropriate Capability

Medium
Confidence
91% confidence
Finding
The instructions require automatic cross-session weight optimization and persistence of framework updates, which changes agent behavior over time based on stored history outside the immediate task scope. That creates stateful behavior and retention risk without clear bounds, increasing the chance of unintended influence from stale or poisoned prior data.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The skill states that framework updates and match history are persistently saved across sessions, but that stateful behavior is not surfaced as a clear warning or consent requirement. Undisclosed cross-session changes can surprise users and create integrity issues if future outputs are influenced by prior stored data they never approved.

Ssd 3

Medium
Confidence
90% confidence
Finding
Saving accumulated history and framework updates in memory files creates a durable state that can be influenced by previous sessions and potentially exposed in future ones. In this skill’s context, the danger is amplified because automated learning from stored text can propagate errors or manipulated inputs into later betting advice.

Natural-Language Policy Violations

Medium
Confidence
88% confidence
Finding
SQP-3 applies to all file types and covers language or locale policy violations. The instructions mandate use of 捷報比分 (Nowscore), and the rest of the guide assumes Chinese tab labels and Chinese match descriptions, but it does not offer users an alternative language/locale or make this a documented opt-in constraint.

Description-Behavior Mismatch

Medium
Confidence
97% confidence
Finding
The document introduces a mandatory post-prediction workflow step that writes to a local history file, but this persistence behavior is unrelated to the declared core function of generating football predictions and is not transparently disclosed in the skill metadata. Hidden or unjustified side effects expand the skill's effective privileges and can cause unexpected collection and retention of user-provided inputs and derived analysis.

Missing User Warnings

Medium
Confidence
96% confidence
Finding
The markdown mandates persistent logging of prediction history and key pre-match data without warning the user that their inputs and analysis will be stored. Even if the content seems low sensitivity, silent retention of interaction data is a privacy and transparency failure, and in aggregate can reveal user interests, betting behavior, or other patterns.

Ssd 3

Medium
Confidence
97% confidence
Finding
The archival step explicitly requires persistent logging of match inputs, predictions, and supporting analysis history to local memory. In the context of a betting prediction skill, this can accumulate a behavioral record of user activity over time and creates unnecessary data retention risk beyond the immediate task.

Context-Inappropriate Capability

Medium
Confidence
98% confidence
Finding
The skill requires writing data to a specific file under the user's home directory (`~/.hermes/workspace/memory/football-match-history.md`) without justification tied to prediction functionality. This creates an unnecessary filesystem write capability, which can expose private usage history, violate least-privilege expectations, and normalize agent behavior that persists data outside the user's awareness.

Description-Behavior Mismatch

Medium
Confidence
93% confidence
Finding
The skill explicitly instructs saving optimized framework parameters, league profiles, and historical match records into persistent memory files across sessions. That exceeds transient match prediction/review behavior and creates undocumented retention of user-derived data and agent state, which can lead to privacy issues, unexpected personalization, and behavior drift over time.

Context-Inappropriate Capability

Medium
Confidence
89% confidence
Finding
The file directs the agent to build long-term league and match memory stores, including historical records and league-specific logic. For a betting-prediction skill, this broad persistent profiling is not clearly necessary and may accumulate more user- or interaction-derived information than needed, increasing the attack surface and risk of unintended reuse across future sessions.

Missing User Warnings

Medium
Confidence
96% confidence
Finding
The markdown instructs persistent writes into user memory locations without warning the user that data will be retained across sessions. Silent persistence is dangerous because users may disclose match interests, betting preferences, or other contextual data expecting ephemeral handling, while the agent instead stores it for future use.

Missing User Warnings

Low
Confidence
90% confidence
Finding
The instructions explicitly direct the agent to navigate to a third-party website and use browser actions without any requirement to inform the user that their query or match identifier will be sent externally. In this skill, user inputs may include free-form match descriptions, so silent external lookups create a transparency and privacy issue even if the data being queried is usually low sensitivity.

Natural-Language Policy Violations

Low
Confidence
76% confidence
Finding
The document presents output modes and operational text using Chinese labels such as 简洁模式 and 可视化模式, and later mandates Chinese status strings like 阵容未公布 and 待公布, without stating that the user may choose language. This creates a natural-language locale constraint that appears imposed by default rather than selected by the user.

Natural-Language Policy Violations

Low
Confidence
87% confidence
Finding
The file gives a Chinese-only example for user-provided match results and does not indicate that other languages are supported or that Chinese is required for a specific reason. This can violate language/locale policy when a skill implicitly constrains users to a specific language without opt-in.

Static analysis

No suspicious patterns detected.