Back to skill

Security audit

Find Football Thing 2026

Security checks for vulnerabilities and agentic risk

Overview

The skill is mostly a read-only Gumtree helper, but its listing tool can fetch arbitrary HTTP URLs instead of only Gumtree listings.

Review before installing. The skill appears designed for read-only Gumtree searches, but only use the listing command with real Gumtree listing paths or URLs; until the script validates the host, a malicious or mistaken prompt could make it fetch non-Gumtree URLs from your agent environment. Remove the copied ~/.bb-browser/sites/gumtree scripts when you no longer use the skill.

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

Error
Location
bb-sites/gumtree/listing.js:64
Finding
Server-Side Request Forgery Through Unrestricted Listing URL## Vulnerability Details **File Location**: `bb-sites/gumtree/listing.js`, lines 64–75 **Vulnerability Type**: Server-Side Request Forgery (SSRF) **Risk Level**: High ### Vulnerable Code ```js if (!args.url) return { error: 'Missing argument: url', hint: 'e.g. bb-browser site gumtree/listing "https://www.gumtree.com/p/.../ID"' }; let path = String(args.url).trim(); if (!path.startsWith('http')) { if (!path.startsWith('/')) path = '/' + path; path = 'https://www.gumtree.com' + path; } const resp = await fetch(path, { headers: { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', Accept: 'text/html,application/xhtml+xml', 'Accept-Language': 'en-GB,en;q=0.9', }, }); ``` ### Technical Analysis The handler is documented as accepting a Gumtree listing URL, but any input beginning with `http` is passed directly to `fetch()`. It does not parse and validate the URL, restrict the protocol to HTTPS, enforce the expected `www.gumtree.com` hostname, reject embedded credentials or nonstandard ports, block private and loopback addresses, or validate redirect destinations. A simple prefix check is not an adequate trust boundary. Values such as `http://127.0.0.1:PORT/`, cloud metadata addresses, or internal service URLs satisfy the check and can therefore become outbound requests from the runtime hosting `bb-browser`. Automatic redirects present an additional route: even if an initial URL were considered trusted, the code does not verify `resp.url` before consuming the response. A server-controlled redirect could consequently send the request to a prohibited destination. The response body is parsed for JSON-LD and Open Graph fields, and selected values are returned to the caller. Internal services that return compatible HTML metadata may therefore expose data through this interface. Even where response contents cannot be extracted, observable status, timing, redirects ...[truncated 1852 chars]
Remediation
## Remediation Suggestions 1. Parse the input with `new URL()` and reject malformed URLs. 2. Permit only the `https:` protocol. 3. Require the normalized hostname to equal `www.gumtree.com`; do not use substring or suffix-only checks. 4. Reject URLs containing embedded username or password fields and reject unexpected ports. 5. Configure requests not to follow redirects automatically. If redirects are required, parse and validate every destination using the same policy before following it. 6. Verify that the final `resp.url` remains an approved Gumtree HTTPS URL before reading or returning response data. 7. Where broader host support is ever required, resolve DNS and reject loopback, private, link-local, multicast, reserved, and cloud-metadata address ranges for both IPv4 and IPv6. Repeat this validation for every redirect and mitigate DNS rebinding. 8. Apply request timeouts, response-size limits, and conservative rate limits to reduce scanning and denial-of-service potential. 9. Prefer accepting a validated Gumtree listing path or listing identifier instead of an arbitrary URL, then construct the complete URL internally. A minimal hostname restriction should follow this pattern: ```js let target; try { target = new URL(String(args.url).trim(), 'https://www.gumtree.com'); } catch { return { error: 'Invalid listing URL' }; } if ( target.protocol !== 'https:' || target.hostname !== 'www.gumtree.com' || target.username || target.password || (target.port && target.port !== '443') ) { return { error: 'Only HTTPS Gumtree listing URLs are allowed' }; } const resp = await fetch(target.href, { redirect: 'manual', headers: { 'User-Agent': 'Mozilla/5.0', Accept: 'text/html,application/xhtml+xml', 'Accept-Language': 'en-GB,en;q=0.9', }, }); if (resp.status >= 300 && resp.status < 400) { return { error: 'Redirects are not permitted without destination validation' }; } ```
Vulnerability Patterns
  • Rogue AgentSelf-Modification, Session Persistence
  • 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
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
Findings (6)

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The declared description presents a higher-level skill for searching Gumtree UK for football-related items, implying use of both search and listing endpoints with football-specific scope and category selection. The actual code chunk is only the gumtree/listing component: it fetches a specific listing URL and extracts listing metadata. That behavior is related to Gumtree, but it does not itself search, filter for football goods, or restrict categories such as sports/leisure and games. Because the declared purpose emphasizes football-focused search functionality while the provided code is a generic listing-detail retriever, this is a material description-behavior mismatch for the supplied code chunk.

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding
The code does match parts of the description: it searches Gumtree UK, returns structured JSON, and includes first-image Markdown. However, the declared purpose is materially narrower than the actual implementation. The code is a general-purpose Gumtree search endpoint that can search any category and any query, with category defaulting to 'all'. It does not contain logic restricting results to football-related goods or excluding pets, property, or jobs. The description also references use of both gumtree/search and gumtree/listing, but this code chunk only implements gumtree/search. Because the actual behavior is broader and less constrained than declared, this is a description-behavior mismatch.

Lp3

Medium
Category
MCP Least Privilege
Confidence
88% confidence
Finding
The skill instructs use of a network-capable browser integration but does not declare any explicit tool scope or allowed-tools restrictions. That creates an authorization and governance gap: the runtime may permit broader network access than users or policy expect, and the skill text provides no machine-enforceable limitation to Gumtree-only usage.

Session Persistence

Medium
Category
Rogue Agent
Content
- This bundle includes [`bb-sites/gumtree/search.js`](bb-sites/gumtree/search.js) and [`bb-sites/gumtree/listing.js`](bb-sites/gumtree/listing.js). Install:

```bash
mkdir -p ~/.bb-browser/sites/gumtree
cp bb-sites/gumtree/search.js ~/.bb-browser/sites/gumtree/search.js
cp bb-sites/gumtree/listing.js ~/.bb-browser/sites/gumtree/listing.js
```
Confidence
79% confidence
Finding
The installation instructions copy scripts into a persistent user-level bb-browser directory under ~/.bb-browser, causing the skill's code to remain active across sessions. Persistent registration increases blast radius if the bundled scripts are later found malicious or are replaced/tampered with, because future bb-browser runs may continue using them outside the original review context.

Natural-Language Policy Violations

Low
Confidence
96% confidence
Finding
The request hard-codes an `Accept-Language` header of `en-GB,en;q=0.9`, which imposes a specific language/locale preference on all users. This is a natural-language policy issue because the skill does not offer a locale choice or document that the locale restriction is required.

Natural-Language Policy Violations

Low
Confidence
95% confidence
Finding
The code hard-codes an `Accept-Language: en-GB,en;q=0.9` header, which forces a UK English locale regardless of user preference. The policy allows locale constraints only when users are given a choice or when the constraint is clearly justified as region-specific; this file does not expose any such opt-in or justification in the code path.

Static analysis

No suspicious patterns detected.