T09 · Insecure Skill Coding Practices
Error
- Location
- SKILL.md:99
- Finding
- Authenticated destructive operations lack an enforced confirmation gate<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:99-104`; `references/opentable-fpx-requests.md:11-16, 259-301, 335-361` **Vulnerability Type**: Missing confirmation and authorization safety control **Risk Level**: High ### Vulnerable Code From `SKILL.md:99-104`: ```markdown - **Booking, modifying, and cancelling are real actions with no confirm-gate here.** The MCP's `opentable_book`/`opentable_modify`/ `opentable_cancel` tools require `confirm: true` and a mandatory preview step; raw `fpx` calls have none of that — a `make-reservation` POST commits immediately. Fetch `/booking/details` and read the cancellation policy first (§5 of the reference) before calling it. ``` From `references/opentable-fpx-requests.md:259-301`: ```sh cat > /tmp/ot-book.json <<'JSON' { "restaurantId": 54232, "reservationDateTime": "2026-08-01T19:00", "partySize": 2, "slotHash": "<slot_hash>", "slotAvailabilityToken": "<reservation_token>", "slotLockId": 999999, "diningAreaId": 12345, "firstName": "Jane", "lastName": "Doe", "email": "jane@example.com", "phoneNumber": "5551234567", "phoneNumberCountryId": "US", "country": "US", "reservationAttribute": "default", "pointsType": "Standard", "points": 100, "tipAmount": 0, "tipPercent": 0, "confirmPoints": true, "optInEmailRestaurant": false, "additionalServiceFees": [], "nonBookableExperiences": [], "katakanaFirstName": "", "katakanaLastName": "", "correlationId": "<uuid>", "isModify": false, "reservationType": "Standard" } JSON fpx post-json 'https://www.opentable.com/dapi/booking/make-reservation' \ @/tmp/ot-book.json -p opentable \ | jq '{confirmationNumber, reservationId, securityToken, points, errorCode, partnerScaRequired}' ``` From `references/opentable-fpx-requests.md:335-361`: ```sh cat > /tmp/ot-cancel.json <<'JSON' { "operationName": "CancelReservation", "variables": { "input": { "restaurantId": 54232, "confirmationNumber" ...[truncated 2543 chars]
- Remediation
- <![CDATA[ ## Remediation Suggestions 1. Default the Skill to read-only behavior. 2. Implement a wrapper around every state-changing request rather than exposing raw mutation commands as the primary workflow. 3. Require a mandatory preview that displays: - Restaurant name and identifier. - Reservation date and time. - Party size and seating area. - Experience or deposit charges. - Credit-card requirements. - Cancellation policy and potential fees. - Existing reservation affected by a modification or cancellation. 4. Generate a short-lived confirmation token bound cryptographically or structurally to the exact previewed parameters. 5. Require a separate explicit user confirmation immediately before the mutation. 6. Reject a write if parameters differ from those previewed or if the confirmation token has expired. 7. Require independent confirmations for booking, modification, cancellation, and favorites mutations. 8. Preserve the MCP-style `confirm: true` control rather than relying solely on documentation. 9. Log only a redacted action summary and never include payment tokens or reservation security tokens. ]]>
