Back to skill

Security audit

Kalshi Fifa Soccer Trader

Security checks for vulnerabilities and agentic risk

Overview

This appears to be a real soccer-trading skill, but it needs Review because it combines live financial trading authority and wallet secrets with under-scoped dependencies and stealth browser scraping.

Install only after review. Use an isolated virtual environment, pin and verify simmer-sdk before use, keep SOLANA_PRIVATE_KEY unset until you intentionally run live trading, keep small caps, review ambiguous team aliases, and avoid or containerize the SoFIFA scraper unless you accept the stealth/no-sandbox risk.

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 (3)

T08 · Insecure Dependencies

Warning
Location
SKILL.md:64
Finding
Security-Critical Trading SDK Is Installed Without Version or Integrity Pinning<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:64-68` **Vulnerability Type**: `T08: Insecure Dependencies` **Risk Level**: Medium ### Vulnerable Code ```markdown 1. **Install the Simmer SDK** ```bash pip install simmer-sdk ``` ``` ### Technical Analysis The setup instructions install `simmer-sdk` without an exact version constraint or package hash. This SDK is security-critical because it receives the Simmer API key and mediates portfolio access, market operations, and real-money trades. The effective code installed by this command can change independently of the reviewed Skill. A future compromised, malicious, or unexpectedly incompatible package release would be installed automatically when a user follows these instructions. The repository does not include a hash-locked Python dependency manifest that would allow users to reproduce the audited dependency set. This finding does not establish that the current `simmer-sdk` package is malicious. The vulnerability is the absence of controls ensuring that the reviewed version is the version users install. ### Attack Path 1. An attacker compromises the `simmer-sdk` publishing account, release pipeline, or package-distribution channel. 2. The attacker publishes a modified release under the legitimate package name. 3. A user follows the documented setup command, which resolves to the latest acceptable package release. 4. The malicious package is installed and later imported by `soccer_trader.py`. 5. The package executes in the user's process with access to `SIMMER_API_KEY` and the permissions of the account running the Skill. 6. Depending on the SDK's wallet integration, the compromised package may also interact with trading or signing material available in the process environment. ### Impact Assessment A compromised SDK could access the Simmer API credential, read account and portfolio information, alter market responses, submit unintended trades, or misrepresent trade results. Its ...[truncated 202 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Pin the SDK to an exact, reviewed version, for example: ```text simmer-sdk==<reviewed-version> ``` 2. Store Python dependencies in a committed lock or requirements file with SHA-256 hashes. 3. Instruct users to install with hash enforcement: ```bash pip install --require-hashes -r requirements.txt ``` 4. Verify the package publisher, source repository, release signatures, and dependency graph before updating. 5. Perform dependency updates through a reviewed pull request rather than resolving the latest package during installation. 6. Run the Skill in a dedicated virtual environment with only the credentials and filesystem permissions required for trading. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/scrape_sofifa.mjs:115
Finding
Chromium Sandbox Is Disabled While Rendering Remote Web Content<![CDATA[ ## Vulnerability Details **File Location**: `scripts/scrape_sofifa.mjs:115-125` **Vulnerability Type**: `T09: Insecure Skill Coding Practices` **Risk Level**: Medium ### Vulnerable Code ```javascript const browser = await chromium.launch({ headless: false, // visible helps pass bot checks args: [ '--no-sandbox', '--disable-blink-features=AutomationControlled', '--disable-infobars', ], }); ``` ### Technical Analysis The scraper launches Chromium with `--no-sandbox` and then renders content supplied by `https://sofifa.com`. The browser sandbox is a defense-in-depth boundary intended to contain a compromised renderer or malicious web content. Disabling it is not required by the declared scraping functionality and substantially increases the potential consequences of a browser-engine exploit. TLS protects content in transit but does not protect against compromise of the remote site, its dependencies, advertising infrastructure, or other content delivered from trusted origins. The use of automation-evasion features also does not provide security isolation. ### Attack Path 1. SoFIFA, one of its remotely loaded resources, or the content-delivery path is compromised. 2. A malicious page targets a vulnerability in the Chromium version installed by Playwright. 3. The user runs `node scripts/scrape_sofifa.mjs`. 4. Chromium loads and processes the attacker-controlled content. 5. The exploit gains renderer-level code execution. 6. Because Chromium was launched with `--no-sandbox`, an important containment boundary is absent, increasing the possibility that code executes with the privileges of the user running the scraper. This path requires a suitable browser vulnerability or equivalent browser compromise; merely controlling page content is not by itself sufficient for arbitrary local code execution. ### Impact Assessment Successful exploitation could expose files, credentials, environment variables, and network access available to th ...[truncated 302 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove the `--no-sandbox` argument: ```javascript const browser = await chromium.launch({ headless: false, args: [ '--disable-blink-features=AutomationControlled', '--disable-infobars', ], }); ``` 2. Do not run the scraper as root; use a dedicated, unprivileged operating-system account. 3. Execute browser automation in a restricted container or sandbox with: - A read-only filesystem where practical - No mounted credential directories - No trading or wallet environment variables - Restricted outbound network access - Dropped Linux capabilities 4. Keep Playwright and its managed Chromium binary current with security releases. 5. Separate scraping from the live-trading environment. Transfer only validated JSON output into the trading process. 6. Validate scraped fields and enforce reasonable size, type, and numeric bounds before merging them into `ratings.json`. ]]>

T08 · Insecure Dependencies

Note
Location
package-lock.json:158
Finding
Scraping Dependency Tree Contains Unsupported and Deprecated Packages<![CDATA[ ## Vulnerability Details **File Locations**: - `package-lock.json:158-176` - `package-lock.json:185-192` - `package-lock.json:503-516` **Vulnerability Type**: `T08: Insecure Dependencies` **Risk Level**: Low ### Vulnerable Code ```json "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxvoCJw6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9g8Vu/ReskGB5o3ji+FzHQ==", "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, "engines": { "node": "*" }, "funding": { "url": "https://github.com/sponsors/isaacs" } } ``` ```json "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4xMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" } } ``` ```json "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWmRk3N6+8Og6P5rQA==", "deprecated": "Rimraf versions prior to v4 are no longer supported", "license": "ISC", "dependencies": { "glob": "^7.1.3" }, "bin": { ...[truncated 1983 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Upgrade or replace `puppeteer-extra-plugin-stealth` and related plugins with versions whose transitive dependencies are actively maintained. 2. Regenerate `package-lock.json` after dependency upgrades and confirm that deprecated `glob`, `inflight`, and `rimraf` versions are removed. 3. Use `npm audit`, software-composition analysis, and dependency-review tooling in continuous integration. 4. Configure automated dependency update pull requests, but require review and scraper regression testing before merging. 5. If the upstream stealth plugin cannot eliminate these dependencies, isolate the scraper in a short-lived, memory-limited container and consider removing the plugin entirely. 6. Continue retaining lockfile integrity hashes and use `npm ci` for reproducible installation. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • 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
Findings (33)

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The code does not implement Kalshi trading, EA FC rating comparisons, bivariate Poisson modeling, market selection, bet automation, or edge calculation. Its primary purpose is roster ingestion and cache maintenance for World Cup squads from Wikipedia. While this could be supportive data infrastructure in a broader soccer analytics system, the chunk itself is materially different from the declared skill purpose and exposes undeclared external data access and file-update behavior unrelated to the stated trading/modeling functionality.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
This code chunk’s primary purpose is updating a local ratings dataset from a scraped SoFIFA JSON file. It reads sofifa_wc2026.json and ratings.json, canonicalizes team names, copies rating fields, reports missing teams, and writes back updated metadata. None of the declared end-user capabilities—trading on Kalshi, computing model-based probabilities, identifying mispriced markets, or automating bets—are present in this code. While maintaining EA FC ratings could be a supporting component of a larger soccer-trading system, the supplied chunk itself materially differs from the declared skill purpose.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The description claims a market-trading/analysis skill for Kalshi soccer markets, but the code shown does not perform trading, pricing, forecasting, model inference, or market selection. It only updates a ratings database by replacing team/player values in ratings.json and recalculating top11_avg_ovr. While EA FC ratings are related domain data that could support the described skill elsewhere, this specific code chunk’s actual purpose is dataset correction and maintenance, which is materially different from the declared primary purpose.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
The declared description focuses on market analysis and trading soccer markets based on FIFA ratings and a bivariate Poisson model. The supplied code does not implement modeling, edge detection, or order placement. Instead, it reads account portfolio data and positions and displays balance and P&L/status information. While this could be a supporting utility within a broader trading skill, these account-monitoring capabilities are not represented in the declared description, and the code chunk’s primary purpose is materially different from the stated trading/modeling purpose.

Ae1

High
Category
analysis-evasion
Content
1. Look up both teams' EA FC OVR in `ratings.json` (top ~200 clubs + all national teams)
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
1. Look up both teams' EA FC OVR in `ratings.json` (top ~200 clubs + all national teams)
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
1. Look up both teams' EA FC OVR in `ratings.json` (top ~200 clubs + all national teams)
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
1. Look up both teams' EA FC OVR in `ratings.json` (top ~200 clubs + all national teams)
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
1. Look up both teams' EA FC OVR in `ratings.json` (top ~200 clubs + all national teams)
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
1. Look up both teams' EA FC OVR in `ratings.json` (top ~200 clubs + all national teams)
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
1. Look up both teams' EA FC OVR in `ratings.json` (top ~200 clubs + all national teams)
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node scripts/scrape_sofifa.mjs
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Known Vulnerable Dependency: brace-expansion==1.1.15 — 3 advisory(ies): CVE-2026-13149 (brace-expansion: DoS via exponential-time expansion of consecutive non-expanding); CVE-2026-14257 (brace-expansion: DoS via unbounded expansion length causing an out-of-memory pro); CVE-2026-69152 (brace-expansion: DoS via unbounded intermediate arrays, bypassing the CVE-2026-1)

High
Category
Supply Chain
Confidence
92% confidence
Finding
brace-expansion 1.1.15 is flagged with multiple denial-of-service advisories involving pathological brace patterns that can trigger excessive CPU or memory consumption. Even as a transitive dependency, a vulnerable parser in automation tooling can be abused if untrusted patterns reach affected code paths, causing crashes or resource exhaustion in the skill runtime.

Ae4

Medium
Category
analysis-evasion
Confidence
80% confidence
Finding
Suspicious Unicode normalization or mixed-script content

Lp3

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding
The skill documents capabilities involving environment secrets, network access, and local file writes, but does not declare any explicit tool/permission scope. That makes it harder for a host platform to sandbox behavior and increases the risk of overbroad execution, especially because the skill handles sensitive material like API keys and a Solana private key.

Vague Triggers

Medium
Confidence
87% confidence
Finding
The invocation text includes broad phrases like 'automate soccer bets' and 'find mispriced soccer outcomes,' which could cause the skill to trigger on generic gambling or automation requests beyond the intended narrow Kalshi/EA FC model context. Overbroad routing increases the chance that a high-risk, wallet-connected trading skill is invoked in situations where it should not be.

External Transmission

Medium
Category
Data Exfiltration
Content
4. **Complete KYC** (required for buys on Kalshi)
   - Verify at [dflow.net/proof](https://dflow.net/proof)
   - Check status: `curl "https://api.simmer.markets/api/proof/status?wallet=YOUR_SOLANA_ADDRESS"`

5. **Fund wallet**
   - SOL on Solana mainnet for gas (~0.05 SOL)
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Context-Inappropriate Capability

Medium
Confidence
95% confidence
Finding
The manifest explicitly includes playwright-extra and puppeteer-extra-plugin-stealth, which are commonly used to evade bot detection and automate browsing in a less transparent way. In a trading skill, these dependencies increase the likelihood of undisclosed scraping, stealth login/session reuse, or automation against third-party controls, making the dependency choice security-relevant even though the lockfile alone does not prove misuse.

Missing User Warnings

Medium
Confidence
80% confidence
Finding
The dependency set supports stealth browsing and persistent user-data handling, yet the manifest provides no indication of disclosure, consent, or limitation around those capabilities. In the context of an automated sports-trading skill, undisclosed stealth and session-persistence features raise risk of covert account automation, storage of authenticated state, and user-unaware interaction with trading platforms.

Vague Triggers

Medium
Confidence
93% confidence
Finding
The aliases in this range include very broad triggers such as "city," which can match ordinary user language unrelated to Manchester City. In an agent setting, overly broad aliases can cause unintended skill activation or wrong-entity resolution, leading the system to place or recommend trades using the wrong market context.

Vague Triggers

Medium
Confidence
95% confidence
Finding
The alias "paris" is broad and commonly used outside the PSG context, so it can trigger incorrect team selection from unrelated conversation. In a trading skill, that ambiguity can misroute analysis or actions toward the wrong market, which is more dangerous than a generic chatbot mistake because it may influence financial decisions.

Vague Triggers

Medium
Confidence
91% confidence
Finding
The alias "inter" is highly ambiguous and may appear in many non-team contexts or as a fragment of other words. That can cause false activation or incorrect mapping to Inter Milan, creating unsafe behavior in a market-trading workflow where entity precision is important.

Vague Triggers

Medium
Confidence
92% confidence
Finding
The alias "sporting" is too generic to uniquely identify Sporting CP and can refer to general sports-related discussion or other clubs. Within a skill that may automate or guide trading actions, such ambiguity increases the chance of acting on the wrong subject and producing financially harmful outputs.

Context-Inappropriate Capability

Medium
Confidence
97% confidence
Finding
This script deliberately uses stealth browser tooling and browser fingerprint manipulation to evade Cloudflare/bot detection on a third-party site. In the context of a trading skill, that is not necessary for core functionality and creates legal, compliance, and operational risk by encouraging unauthorized scraping behavior that may violate site protections or terms of service.

Description-Behavior Mismatch

Medium
Confidence
93% confidence
Finding
The skill description says it finds trading edges on soccer markets, but the code also discovers/imports markets and can actively manage and liquidate existing positions via `--import-markets` and `--manage-positions`. That mismatch is security-relevant because users or orchestrators may grant broader permissions than they realize, enabling unexpected portfolio-changing actions beyond simple analysis.

Static analysis

No suspicious patterns detected.