Back to skill

Security audit

accessoticketing-mcp

Security checks for vulnerabilities and agentic risk

Overview

This skill is mostly aligned with parsing Accesso ticket links, but it handles bearer-secret ticket data and includes an overbroad URL fetch path that should be reviewed before installation.

Install only if you are comfortable letting the skill process live ticket links that act like passwords. Use it only with ticket URLs you trust, avoid pasting those URLs into logs or shared files, and treat generated barcode images, JWTs, and Google Wallet links as secrets. A safer version would restrict fetching to expected Accesso HTTPS hosts and warn before creating third-party wallet links.

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
references/parse-tickets.mjs:251
Finding
Unrestricted HTTP Fetching Enables Server-Side Request Forgery<![CDATA[ ## Vulnerability Details **File Location**: `references/parse-tickets.mjs:251-258` **Vulnerability Type**: Server-Side Request Forgery (SSRF) through unrestricted URL fetching **Risk Level**: Medium ### Vulnerable Code ```js if (/^https?:\/\//i.test(src)) { const res = await fetch(src, { redirect: 'follow' }); if (!res.ok) { process.stderr.write(`accesso: HTTP ${res.status} fetching ticket page\n`); process.exit(4); } return { html: await res.text(), url: res.url || src }; } ``` ### Technical Analysis The Skill is declared to process ticket pages hosted under Accesso media-engine domains, but `readSource()` accepts any URL beginning with `http://` or `https://`. It does not validate: - The destination hostname against the expected Accesso service. - Whether the destination is a loopback, private, link-local, or reserved address. - Nonstandard destination ports. - DNS results that resolve to internal addresses. - Redirect destinations. - HTTPS-to-HTTP redirect downgrades. The use of `redirect: 'follow'` is especially significant because an initially acceptable external URL can redirect to an internal destination. Validation applied only before `fetch()` would consequently be insufficient unless redirects are handled and checked individually. This behavior exceeds the minimum privileges needed for the declared functionality. Reading Accesso tickets requires network access to the applicable `media-engine.<region>.accessoticketing.com` host, but it does not require arbitrary server-side HTTP access. The fetched response is parsed locally rather than returned verbatim, which limits direct response disclosure. Nevertheless, the primitive can issue GET requests from the Agent host, expose status-dependent behavior, and potentially surface content if an internal response resembles the ticket markup expected by the parser. ### Attack Path 1. An attacker supplies an Agent user or workflow with a purported ticket URL. 2. The URL is one ...[truncated 1856 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. **Require HTTPS** - Reject plaintext HTTP URLs. - Reject redirects that downgrade from HTTPS to HTTP. 2. **Enforce an explicit hostname allowlist** - Permit only the Accesso media-engine hostname pattern required by the Skill. - Compare normalized URL hostnames rather than using substring or suffix checks that can be bypassed by names such as `accessoticketing.com.attacker.example`. - If regions are known, prefer an explicit set of approved hosts. 3. **Validate every redirect** - Set `redirect: 'manual'`. - Resolve each `Location` header against the current URL. - Reapply scheme, hostname, port, and IP-address validation before issuing the next request. - Set a small maximum redirect count. 4. **Block internal network destinations** - Resolve the hostname before connecting. - Reject IPv4 and IPv6 loopback, private, link-local, multicast, unspecified, and reserved ranges. - Protect against alternate IP representations and IPv4-mapped IPv6 addresses. - Mitigate DNS rebinding by ensuring that the validated address is the address used for the connection. 5. **Restrict ports** - Permit only TCP port 443 unless another port is explicitly required and documented. 6. **Apply runtime containment** - Use outbound firewall or sandbox rules that permit connections only to approved Accesso endpoints. - Block access to cloud metadata addresses and internal management networks independently of application validation. 7. **Protect ticket bearer URLs** - Continue treating `oToken` and `cToken` values as credentials. - Prefer stdin or another protected input mechanism over command-line arguments, which may be visible in process listings or retained in shell history. - Redact query strings from diagnostics and logs. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (4)

Ae1

High
Category
analysis-evasion
Content
`references/parse-tickets.mjs` is dependency-free (no `node_modules`) and takes a URL, a file, or `-` for stdin:
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Lp3

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding
The skill explicitly instructs use of curl against accessoticketing.com URLs and discusses resolving click-tracker redirects, which are network-capable behaviors, but it declares no tool scope or permissions boundary. That mismatch is dangerous because an agent runtime may permit broader-than-intended outbound requests, enabling access to sensitive ticket URLs and associated order/barcode data without clear user-visible restriction.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
The recipes instruct users to send live accesso ticket URLs containing sensitive query tokens (`oToken`, `cToken`) to production endpoints via `curl` without a prominent up-front warning that those tokens function as bearer secrets. Because the skill is specifically about extracting ticket/order data from real customer links, accidental disclosure through shell history, logs, screenshots, or copied output could expose order details, barcodes, and reusable wallet links.

Missing User Warnings

Medium
Confidence
97% confidence
Finding
The Google Wallet recipe has users fetch a JWT from the ticketing endpoint and then construct a `pay.google.com` save URL, but it does not clearly warn that this shares ticket-linked data with Google as a third party. In this skill's context, the omission is more dangerous because the generated link is derived from order-token-protected ticket data and may allow pass import or reveal metadata outside the original merchant/accesso context.

Static analysis

No suspicious patterns detected.