Back to skill

Security audit

signupgenius-api

Security checks for vulnerabilities and agentic risk

Overview

The skill is a transparent SignUpGenius curl guide, but it documents account-changing actions and no-login access to participant names and IDs without enough authorization and secret-handling safeguards.

Review this skill before installing. Use it only for SignUpGenius accounts and sign-ups you are authorized to manage or view, avoid running the unauthenticated participant-enumeration examples on other people's sign-ups, and treat passwords, JWTs, cookies, cookie jars, and refresh tokens as account-access secrets. Confirm every write action immediately before running it and delete temporary login artifacts afterward.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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)

T05 · Unauthorized Access and Privilege Escalation

Warning
Location
references/sug-endpoints.md:301
Finding
Unauthenticated disclosure of hidden participant information and withdrawal identifiers## Vulnerability Details **File Location**: `references/sug-endpoints.md`, lines 301–330 **Vulnerability Type**: Unauthenticated access to participant PII and operational identifiers **Risk Level**: Medium ### Vulnerable Snippet ```sh ### Participant names + quantities — also no auth `/v3/.../slots` gives you counts but not people. The names come from the legacy dispatcher, and it too needs **no** credentials (verified 2026-08-10 from a cold `curl`): curl -s -X POST -H 'Content-Type: application/json' \ --data '{"listid":62393618,"slotitemid":1762735194,"offset":1,"limitTo":100, "search":"","orderBy":"","orderDesc":false,"memberidViewing":0}' \ 'https://www.signupgenius.com/SUGboxAPI.cfm?go=s.getSignUpParticipantsBySlotItem' Each row carries `firstname`, `lastname`, `nonmembername`, `mycomment`, `memberid`, **`myqty`** and **`itemmemberid`**. 2. **`itemmemberid` is the `imid`** that a release/withdraw needs (§6). Note this returns names even though the same slot reports `hidenames: true` on the v3 feed, so `hidenames` is a display preference on that feed, not an access control across the API as a whole. ``` ### Technical Analysis The Skill explicitly documents an unauthenticated legacy API request that returns participant records for a selected sign-up slot. The disclosed fields include first and last names, free-form comments, membership identifiers, participation quantities, and `itemmemberid`. This crosses an access-control boundary because the request requires no credentials and returns participant identities even when the corresponding slot has `hidenames: true`. The documentation does not impose an ownership, membership, or participant-authorization check before retrieving or displaying this information. The exposed `memberid` and `itemmemberid` values are also operational identifiers used by the withdrawal endpoint documented later in the same file. The release workflow does instruc ...[truncated 1523 chars]
Remediation
## Remediation Suggestions - Remove the unauthenticated participant-enumeration workflow from the Skill. - Require authentication and verify that the requesting account owns the sign-up or has an explicitly authorized administrative role before retrieving participant records. - Enforce the `hidenames` setting consistently across every API surface rather than treating it only as a presentation preference. - Return only the minimum fields necessary for the authorized task; do not expose `memberid`, `itemmemberid`, comments, or full names to unauthenticated callers. - Add server-side authorization to withdrawal-related operations and derive the participant identity from the authenticated session instead of accepting public operational identifiers as authority. - If upstream authorization cannot be changed, instruct the agent not to call this endpoint or disclose its output unless the user demonstrates appropriate ownership or participant authorization.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (29)

Credential Access

High
Category
Privilege Escalation
Content
## Renewing an expired session token

`POST https://api.signupgenius.com/v3/auth/refresh` trades a `refreshToken`
cookie for a fresh 30-minute access token. The JWT's TTL is exactly 30
minutes (`exp - iat == 1800`).

```sh
Confidence
70% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
- **Both fields are required.** Sending only `refreshToken` returns 400 with
  `{"details":"token should not be null or undefined"}`. `token` is the
  current access token — it may already be expired.
- The response nests under `data.response`, with **lower-case** keys:
  `{token, refreshtoken, expiresin, expires}`. `expiresin` is `1800`. The
  refresh token is rotated, so store the new one.
Confidence
85% confidence
Finding
The documentation goes beyond mentioning refresh and explicitly instructs storing rotated refresh tokens while noting parallel validity behavior. That level of session-token handling detail increases the skill's ability to preserve access over time and can facilitate persistence if the environment is compromised or the skill is misused.

Context-Inappropriate Capability

High
Confidence
99% confidence
Finding
The file documents a withdrawal/release flow that can be driven using publicly discoverable identifiers from the participant lookup endpoint. Even though it notes session requirements and advises confirmation, this materially expands the skill from read-only access into account-scoped modification of other participants' sign-ups, creating a clear path to unauthorized tampering if the operator has any valid session.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The skill explicitly instructs users to handle account credentials, JWTs, and session cookies, but it does not clearly warn that these artifacts are secrets equivalent to account access. In this context, exposing or mishandling the accessToken/cfid/cftoken values could allow session hijacking or unintended account access by other local users, logs, shell history, or downstream tooling.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The login flow writes authentication material to local temporary files (`mktemp` cookie jar and `/tmp/sug-login-headers.txt`) without warning about persistence or cleanup. Those files may retain session cookies, redirect metadata, and other authentication state that could be recovered by another local process or user on a shared or monitored system, enabling session reuse or credential workflow leakage.

External Transmission

Medium
Category
Data Exfiltration
Content
| grep -oE 'name="csrfToken"[[:space:]]+value="[^"]+"' \
  | sed -E 's/.*value="([^"]+)".*/\1/')

curl -s -D /tmp/sug-login-headers.txt -o /dev/null \
  -b "$COOKIEJAR" -c "$COOKIEJAR" \
  -A 'Mozilla/5.0 (Macintosh; Intel Mac OS X 14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0 Safari/537.36' \
  -X POST 'https://www.signupgenius.com/index.cfm?go=c.Login' \
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
```

```sh
curl -s -X POST 'https://www.signupgenius.com/SUGboxAPI.cfm?go=t.getMySignups' \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Cookie: $COOKIE_HEADER" \
  -H 'Content-Type: application/json' \
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
## 1. Profile

```sh
curl -s 'https://api.signupgenius.com/v3/member/profile/' \
  -H "Authorization: Bearer $ACCESS_TOKEN" -H "Cookie: $COOKIE_HEADER" | jq '.data'
```
Confidence
50% 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
## 1. Profile

```sh
curl -s 'https://api.signupgenius.com/v3/member/profile/' \
  -H "Authorization: Bearer $ACCESS_TOKEN" -H "Cookie: $COOKIE_HEADER" | jq '.data'
```
Confidence
50% 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
## 1. Profile

```sh
curl -s 'https://api.signupgenius.com/v3/member/profile/' \
  -H "Authorization: Bearer $ACCESS_TOKEN" -H "Cookie: $COOKIE_HEADER" | jq '.data'
```
Confidence
50% 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
## 1. Profile

```sh
curl -s 'https://api.signupgenius.com/v3/member/profile/' \
  -H "Authorization: Bearer $ACCESS_TOKEN" -H "Cookie: $COOKIE_HEADER" | jq '.data'
```
Confidence
50% 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
## 1. Profile

```sh
curl -s 'https://api.signupgenius.com/v3/member/profile/' \
  -H "Authorization: Bearer $ACCESS_TOKEN" -H "Cookie: $COOKIE_HEADER" | jq '.data'
```
Confidence
50% 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
## 1. Profile

```sh
curl -s 'https://api.signupgenius.com/v3/member/profile/' \
  -H "Authorization: Bearer $ACCESS_TOKEN" -H "Cookie: $COOKIE_HEADER" | jq '.data'
```
Confidence
50% 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
## 1. Profile

```sh
curl -s 'https://api.signupgenius.com/v3/member/profile/' \
  -H "Authorization: Bearer $ACCESS_TOKEN" -H "Cookie: $COOKIE_HEADER" | jq '.data'
```
Confidence
50% 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
## 1. Profile

```sh
curl -s 'https://api.signupgenius.com/v3/member/profile/' \
  -H "Authorization: Bearer $ACCESS_TOKEN" -H "Cookie: $COOKIE_HEADER" | jq '.data'
```
Confidence
50% 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
## 1. Profile

```sh
curl -s 'https://api.signupgenius.com/v3/member/profile/' \
  -H "Authorization: Bearer $ACCESS_TOKEN" -H "Cookie: $COOKIE_HEADER" | jq '.data'
```
Confidence
50% 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
## 1. Profile

```sh
curl -s 'https://api.signupgenius.com/v3/member/profile/' \
  -H "Authorization: Bearer $ACCESS_TOKEN" -H "Cookie: $COOKIE_HEADER" | jq '.data'
```
Confidence
50% 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
## 1. Profile

```sh
curl -s 'https://api.signupgenius.com/v3/member/profile/' \
  -H "Authorization: Bearer $ACCESS_TOKEN" -H "Cookie: $COOKIE_HEADER" | jq '.data'
```
Confidence
50% 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
are optional):

```sh
curl -s -X POST "https://api.signupgenius.com/v3/groups/${GROUP_ID}/members/create/" \
  -H "Authorization: Bearer $ACCESS_TOKEN" -H "Cookie: $COOKIE_HEADER" \
  -H 'Content-Type: application/json' \
  -d '{"emailaddress":"new-member@example.com","firstname":"Jane","lastname":"Doe"}' \
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
(note the **upper-case** envelope):

```sh
curl -s -X POST 'https://www.signupgenius.com/SUGboxAPI.cfm?go=t.getMySignups' \
  -H "Authorization: Bearer $ACCESS_TOKEN" -H "Cookie: $COOKIE_HEADER" \
  -H 'Content-Type: application/json' -d '{}' \
  | jq -r '.DATA[] | "\(.signupid)\t\(.title)"'
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
description). The SPA's own metadata call is public:

```sh
curl -s -X POST -H 'Content-Type: application/json' \
  --data '{"urlid":"10C0849AAAA2EA4FD0-62393618-20262027"}' \
  'https://www.signupgenius.com/SUGboxAPI.cfm?go=s.getSignupInfo'
```
Confidence
96% confidence
Finding
This call is notable because the documentation states the endpoint is public and returns rich sign-up metadata without authentication. While external transmission itself is expected, the dangerous part is that the skill documents and operationalizes anonymous access to potentially sensitive sheet metadata, broadening exposure beyond authenticated account access.

External Transmission

Medium
Category
Data Exfiltration
Content
**301/302**, not 200:

```sh
curl -s -o /dev/null -w '%{http_code}\n' -D - \
  -H "Authorization: Bearer $ACCESS_TOKEN" -H "Cookie: $COOKIE_HEADER" \
  -H 'Content-Type: application/x-www-form-urlencoded' -H 'Accept: text/html' \
  -X POST "https://www.signupgenius.com/index.cfm?go=s.PreProcessSignup&URLID=${URLID}" \
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
TITLE=$(jq -r '.DATA.title' /tmp/sug-signupinfo.json)
SLOTID=$(jq -r '.DATA.rsvpdetails.slotid' /tmp/sug-signupinfo.json)

curl -s -X POST 'https://www.signupgenius.com/SUGboxAPI.cfm?go=s.processSignUpFormHandler' \
  -H "Authorization: Bearer $ACCESS_TOKEN" -H "Cookie: $COOKIE_HEADER" \
  -H 'Content-Type: application/json' \
  -d @- <<JSON | jq '.SUCCESS, .MESSAGE'
Confidence
95% confidence
Finding
This request performs the actual RSVP submission, transmitting personal fields and changing remote state. In context, the risk comes from the skill enabling automated write actions against third-party sign-up sheets, which can be abused if used without strong confirmation and authorization checks.

External Transmission

Medium
Category
Data Exfiltration
Content
minutes (`exp - iat == 1800`).

```sh
curl -s 'https://api.signupgenius.com/v3/auth/refresh' \
  -H 'Content-Type: application/json' \
  -d "{\"refreshToken\":\"${REFRESH_TOKEN}\",\"token\":\"${ACCESS_TOKEN}\"}" \
  | jq -r '.data.response.token'
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
## Reading slots on ANY sign-up — no auth required

`GET https://api.signupgenius.com/v3/signups/{signupId}/slots` returns the
full slot grid for a public sign-up **with no Authorization header, no
cookies, and no Pro key**. This is the display feed the `/go/<slug>` page
renders from, and it is the correct way to read slot data — not the Pro
Confidence
97% confidence
Finding
This section documents unauthenticated access to the full slot grid for any public sign-up. While the request itself is expected to the upstream service, the security concern is that the skill normalizes broad anonymous enumeration of event structure and availability outside a clearly bounded authenticated context.

Static analysis

No suspicious patterns detected.