Back to skill

Security audit

zola-api

Security checks for vulnerabilities and agentic risk

Overview

Review is warranted because setup prints a reusable login token and a settings example could unintentionally make your wedding website searchable.

Before use, change credential loading so tokens never appear in tool output or logs, and preserve existing search-visibility settings unless you request a change. Review deletions and public website edits, and preserve unrelated record fields. Rotate any token already exposed in retained output. Both bundled files were reviewed despite partial scanner coverage; upstream documentation was unavailable and live API behavior was not tested.

Vulnerability Patterns
  • 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
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (38)

Description-Behavior Mismatch

High
Category
MCP Tool Poisoning
Confidence
86% confidence
Finding

The shell-and-curl implementation matches the declared access method, but the operations concern card-project design and QR-code generation rather than the described wedding-data categories. This adds an undeclared functional capability; saving the preview locally is merely a supporting implementation detail.

Content

No source excerpt is available for this finding.

Credential Access

High
Category
Privilege Escalation
Confidence
88% confidence
Finding

Accessing a Zola credential is consistent with the skill's purpose, but the recommended grep command prints the long-lived refresh token into shell output. In an agent workflow, that output can enter retained tool transcripts or logs, exposing a credential that could permit unauthorized access to private wedding data and account mutations.

Content

Scanner excerpt · SKILL.md (reported line 27)May include surrounding context.

signed-in zola.com session. Same credential zola-mcp uses:

sh
# Prefer the env var zola-mcp itself reads (check its .env first):
grep -h ZOLA_REFRESH_TOKEN ~/git/zola-mcp/.env 2>/dev/null
export ZOLA_REFRESH_TOKEN='eyJhbGciOi...'   # or export directly if you have it

Credential Access

High
Category
Privilege Escalation
Confidence
88% confidence
Finding

This finding identifies the same credential-printing command as the preceding PE3 finding, rather than an independent vulnerability. Its risk comes from unnecessarily displaying the long-lived refresh token, not from reading a relevant application's credential file for legitimate authentication.

Content

Scanner excerpt · SKILL.md (reported line 28)May include surrounding context.

sh
# Prefer the env var zola-mcp itself reads (check its .env first):
grep -h ZOLA_REFRESH_TOKEN ~/git/zola-mcp/.env 2>/dev/null
export ZOLA_REFRESH_TOKEN='eyJhbGciOi...'   # or export directly if you have it

Incomplete referenced artifact analysis

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 65)May include surrounding context.

md
`references/mobile-api-endpoints.md` reuses `$BASE`, `$SESSION_TOKEN`,

Incomplete referenced artifact analysis

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 91)May include surrounding context.

md
`references/mobile-api-endpoints.md` has real, ready-to-run `curl` + `jq`

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · references/mobile-api-endpoints.md (reported line 356)May include surrounding context.

md
All four follow the same list/add/update/remove shape;
`{wedding_account_id: $ACCT}` and an `_entity_id: 0` (create) or the real id
(update) prefix every write body. Deletes share one path shape:
`DELETE /v3/websites/{pages}/{entities}/{entity_id}/wedding-accounts/$ACCT`
where `{pages}` is looked up per-type from
`GET /v3/websites/pages/wedding-accounts/full` (`.data.{home,faq,poi,travel}_page.page_id`).

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 50)May include surrounding context.

md
UA='Zola/42.5.0 (iPad; iOS 26.4; Scale/2.0)'

# 1. Mint a 30-min session token from the refresh token
SESSION_TOKEN=$(curl -sS -X POST "$BASE/v3/sessions/refresh" \
  -H 'content-type: application/json' -H 'accept: application/json' \
  -H "x-zola-platform-type: iphone_app" -H "x-zola-session-id: $DEVICE_SESSION_ID" \
  -H "user-agent: $UA" \

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/mobile-api-endpoints.md (reported line 38)May include surrounding context.

List booked vendors — POST /v3/account-vendors/booked-list body {}:

sh
curl -sS "${HJ[@]}" -X POST "$BASE/v3/account-vendors/booked-list" -d '{}' \
  | jq '.data.booked_vendors'

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/mobile-api-endpoints.md (reported line 45)May include surrounding context.

Search vendors (typeahead) — POST /v3/reference-vendors/typeahead-taxonomy:

sh
curl -sS "${HJ[@]}" -X POST "$BASE/v3/reference-vendors/typeahead-taxonomy" \
  -d '{"query":"Acme Photography","taxonomy_key":"wedding-photographers"}' | jq '.data'
# taxonomy_key default: wedding-venues. Other keys: wedding-planners, wedding-bands-djs, ...

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/mobile-api-endpoints.md (reported line 54)May include surrounding context.

vendor_type, then PUT /v5/account-vendors/vendor (note: v5, not v3):

sh
curl -sS "${HJ[@]}" -X PUT "$BASE/v5/account-vendors/vendor" -d '{
  "uuid": "<slot-uuid-from-booked-list>", "id": 0, "vendor_type": "PHOTOGRAPHER",
  "booked": true, "booking_source": "BOOKED_VENDORS",
  "price_cents": 350000, "event_date": null,

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/mobile-api-endpoints.md (reported line 74)May include surrounding context.

Unbook a vendor — POST /v3/account-vendors/vendor/unbook:

sh
curl -sS "${HJ[@]}" -X POST "$BASE/v3/account-vendors/vendor/unbook" \
  -d '{"uuid":"<vendor-uuid>"}'

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/mobile-api-endpoints.md (reported line 97)May include surrounding context.

rejects a bare partial):

sh
curl -sS "${HJ[@]}" -X PUT "$BASE/v3/budgets/items" -d '{
  "item_uuid": "<uuid>", "taxonomy_node_uuid": "<from-get>",
  "estimated_cost_cents": <from-get>, "actual_cost_cents": 250000,
  "note": "Deposit paid", "item_type": "<from-get, e.g. VENUE>",

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/mobile-api-endpoints.md (reported line 114)May include surrounding context.

guest object, no {guest:{...}} wrapper):

sh
curl -sS "${HJ[@]}" -X POST "$BASE/v3/guestlists/directory/wedding-accounts/$ACCT" \
  -d '{"sort_by_name_asc": true}' \
  | jq '.data.guest_groups[] | {guest_group_id, guests: [.guests[] | {guest_id, first_name, family_name, rsvp}]}'

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/mobile-api-endpoints.md (reported line 127)May include surrounding context.

and created nothing.

sh
curl -sS "${HJ[@]}" -X POST "$BASE/v3/guestlists/groups" -d '{
  "wedding_account_id": '"$ACCT"',
  "guest_group_affiliation": "PRIMARY_FRIEND", "guest_group_tier": "A",
  "invited": true, "invitation_sent": false, "save_the_date_sent": false,

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/mobile-api-endpoints.md (reported line 150)May include surrounding context.

sh
# 1. GET the directory (above), find the target group by guest_group_id,
#    keep its `guests[]` array as-is except the address fields you're changing.
curl -sS "${HJ[@]}" -X PUT "$BASE/v3/guestlists/groups/wedding-accounts/$ACCT/bulk/directory" \
  -d '{"updated_guest_groups": [ <full-group-object-with-patched-guest-addresses> ]}' \
  | jq '.data'

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/mobile-api-endpoints.md (reported line 158)May include surrounding context.

Remove a guest group — PUT /v3/guestlists/groups/wedding-accounts/$ACCT/delete:

sh
curl -sS "${HJ[@]}" -X PUT "$BASE/v3/guestlists/groups/wedding-accounts/$ACCT/delete" \
  -d '{"wedding_account_id": '"$ACCT"', "guest_group_ids": [<id>]}'

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/mobile-api-endpoints.md (reported line 178)May include surrounding context.

Assign a seat — PUT /v3/seating-charts/seats:

sh
curl -sS "${HJ[@]}" -X PUT "$BASE/v3/seating-charts/seats" -d '{
  "guest_uuid": "<guest-uuid>", "seat_uuid": "<seat-uuid>",
  "table_uuid": "<table-uuid>", "seating_chart_uuid": "<chart-uuid>"
}' | jq '.'

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/mobile-api-endpoints.md (reported line 189)May include surrounding context.

Inquiries (src/tools/inquiries.ts)

sh
curl -sS "${HJ[@]}" -X POST "$BASE/v3/inquiries/unified-inquiries" -d '{}' \
  | jq '.data[].inquiry_summaries[] | {inquiry_uuid, vendor_name: .vendor_card.vendor_name, unread, status_text}'

curl -sS "${H[@]}" "$BASE/v3/inquiries/<inquiry-uuid>/conversation" | jq '.data.messages'

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/mobile-api-endpoints.md (reported line 219)May include surrounding context.

from the GET):

sh
curl -sS "${HJ[@]}" -X PUT "$BASE/v3/websites/events/<event_id>" -d '{
  "event_entity_id": <event_id>, "uuid": "<from-get>", "wedding_account_id": '"$ACCT"',
  "type": "<from-get>", "name": "Reception", "start_at": "<from-get>", "end_at": "<from-get>",
  "timezone": "<from-get>", "venue_name": "The Grand Hall", "address1": "", "address2": "",

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/mobile-api-endpoints.md (reported line 247)May include surrounding context.

sh
curl -sS "${H[@]}" "$BASE/v4/your-wedding" | jq '.data'

curl -sS "${HJ[@]}" -X POST "$BASE/v3/storefronts/search" -d '{
  "taxonomy_node_id": 2, "city": "Charlotte", "state": "NC",
  "limit": 24, "offset": 0, "facets": {},
  "metro_types": ["HOME","HOME_SERVICE","AWAY"], "metros": [],

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/mobile-api-endpoints.md (reported line 265)May include surrounding context.

Registry items (src/tools/registry-items.ts)

sh
curl -sS "${HJ[@]}" -X POST "$BASE/v3/categories/<category_id>/entities" \
  -d '{"offset":0,"limit":50,"registry_id":"'"$REG"'"}' | jq '.data'

# Default collection id: `.data.default_collection_id` from the registry GET

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/mobile-api-endpoints.md (reported line 270)May include surrounding context.

md
# Default collection id: `.data.default_collection_id` from the registry GET
# above, or the first `groups[].modules[]` entry with `type == "COLLECTION"`.
curl -sS "${HJ[@]}" -X POST "$BASE/v3/registries/$REG/collections/<collection_id>" \
  -d '{"sku_id":"<sku>","quantity":1,"most_wanted":false,"enable_group_gifting":false}' \
  | jq '.data'

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/mobile-api-endpoints.md (reported line 275)May include surrounding context.

md
| jq '.data'

# Full replace — all fields required:
curl -sS "${HJ[@]}" -X PUT "$BASE/v3/registries/$REG/items/<collection_item_id>" -d '{
  "quantity": 2, "group_gift": false, "marked_fulfilled": false,
  "personal_note": "", "most_wanted": true, "collection_id": "<collection_id>"
}' | jq '.data'

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/mobile-api-endpoints.md (reported line 290)May include surrounding context.

sh
curl -sS "${H[@]}" "$BASE/v3/websites/pages/wedding-accounts/full" | jq '.data'

curl -sS "${H[@]}" -X PUT "$BASE/v3/websites/pages/<page_id>/hidden/true"  # or /false

curl -sS "${HJ[@]}" -X PUT "$BASE/v3/websites/pages/wedding-accounts/$ACCT/reorder" \
  -d '{"ids": [<page_id_1>, <page_id_2>, ...]}' | jq '.data'

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/mobile-api-endpoints.md (reported line 296)May include surrounding context.

-d '{"ids": [<page_id_1>, <page_id_2>, ...]}' | jq '.data'

Partial patch is fine here (unlike most write endpoints):

curl -sS "${HJ[@]}" -X PUT "$BASE/v3/websites/pages-v2/<page_id>"
-d '{"page_id": <page_id>, "title": "Our Story"}' | jq '.data'

text