Back to skill

Security audit

schoolpass-curl

Security checks for vulnerabilities and agentic risk

Overview

This skill is mostly a SchoolPass API helper, but it advertises read-only use while including live commands that can change or cancel student dismissal records.

Review this before installing. Use it only if you intentionally want direct SchoolPass API access from a shell, keep credentials out of shared files and transcripts, and avoid the write/delete section unless you are deliberately changing live student dismissal or arrival records after verifying the student ID, date, and change details.

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
references/requests.md:103
Finding
Undisclosed State-Changing and Destructive SchoolPass Operations## Vulnerability Details **File Location**: `references/requests.md:103-126` **Related Scope Declaration**: `SKILL.md:2, 9-15, 52-69` **Vulnerability Type**: Undisclosed write and delete operations without a confirmation gate **Risk Level**: High The skill is presented primarily as a read-only SchoolPass integration: ```markdown description: Read a SchoolPass parent account directly with curl against the regional SchoolPass REST API ``` However, the referenced request guide includes authenticated operations that create and delete student arrival or dismissal changes: ```bash ## Writes (verified live) Submit a dismissal/arrival change — `POST studentchange`. The body must match the app exactly: `dateSet.dates` EMPTY, `daysOfWeek` as NUMERIC ids (Monday=1…Sunday=7), `modifiedBy` = your parent member id (= `parentMemberId`), `changeType` from the E2 enum (Absent=1, LateArrival=2, EarlyDismissal=3, Carpool=4, Activity=5, Bus=6). ```bash STU=11278; DATE=2026-09-14; DOW=1 # DOW: Mon=1..Sun=7 for $DATE sp_curl POST "studentchange?schoolCode=${SCHOOLPASS_SCHOOL_CODE}&parentMemberId=${SP_MEMBER_ID}" "$(jq -nc \ --argjson sid "$STU" --arg date "$DATE" --argjson dow "$DOW" --argjson mid "$SP_MEMBER_ID" '{ studentId:$sid, moveToId:null, busStopId:null, dateSet:{dates:[], daysOfWeek:[$dow], startDate:$date, endDate:$date, recurringWeeks:0}, notes:"", pickupDropoffPerson:null, willReturn:false, timeOfDay:null, changeSeriesId:0, changeType:1, adType:3, userType:3, modifiedBy:$mid }')" # Verify: re-read the calendar; a non-default entry (isDefault:false, changeSeriesId set) appears. sp_curl GET "Student/StudentCalendar?schoolCode=${SCHOOLPASS_SCHOOL_CODE}&studentId=${STU}&startDate=${DATE}&endDate=${DATE}" | jq '.dailyList' ``` Cancel a change — `DELETE studentchange/DeleteMobileChange`, keyed on the `changeSeriesId` from the calendar: ```bash CSID=27074 # from the calendar entry's chang ...[truncated 2811 chars]
Remediation
## Remediation Suggestions 1. Remove all write and delete recipes from this read-oriented skill and place them in a separately named, explicitly read/write skill. 2. If mutation support is retained, update `SKILL.md` metadata, scope, and usage documentation to prominently disclose that the skill can modify and cancel student records. 3. Require explicit user confirmation immediately before every `POST` or `DELETE`, displaying the resolved student name, date, change type, destination, and existing record affected. 4. Resolve student and change-series identifiers through authenticated reads rather than accepting or demonstrating realistic hard-coded identifiers. 5. Validate that the selected student belongs to the authenticated parent account and that the target change exists before submitting a mutation. 6. Replace example identifiers with unmistakable placeholders such as `<STUDENT_ID>` and `<CHANGE_SERIES_ID>`. 7. Add a dry-run mode that prints the endpoint and normalized payload without sending the request. 8. After confirmation and execution, re-read the affected calendar record and clearly report the resulting server state. 9. Document rollback procedures and require separate confirmation before cancellation or deletion.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (7)

Credential Access

High
Category
Privilege Escalation
Content
# Ready-to-run requests

Shapes come from the SchoolPass Swagger spec and `docs/SCHOOLPASS-API.md`. Run
the live check (`node --env-file=.env scripts/live-check.mjs`) once to confirm
the auth-response fields on your account before trusting the `jq` recipes below.

## Helper — source this first
Confidence
80% confidence
Finding
The documentation directs use of a .env file containing SchoolPass credentials and then performs authenticated API calls for parent/student data. While credential use is necessary for the feature, referencing and encouraging local credential storage without explicit handling guidance increases the risk of credential leakage through source control, shell history, shared environments, or misconfigured file permissions.

Description-Behavior Mismatch

High
Confidence
99% confidence
Finding
The skill metadata presents this as a read-only, one-off terminal checker, but the file includes live write and delete operations that can modify student dismissal and arrival records. That mismatch is dangerous because users may invoke or adapt these commands believing the skill is non-destructive, leading to unauthorized or accidental changes affecting real-world student pickup workflows.

Vague Triggers

Medium
Confidence
95% confidence
Finding
The skill description uses broad natural-language trigger phrases such as "check SchoolPass from the terminal" and "any dismissal changes today," which can match ordinary user requests and cause the skill to activate in situations the user may not realize will invoke direct API access with sensitive parent-account credentials. In this context, unintended activation is more concerning because the skill handles personal school/family data and authenticates directly to a live service.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The documentation instructs users to authenticate with parent credentials and query student-related data, but it lacks an explicit warning that credentials and sensitive parent/student information will be transmitted to a third-party SchoolPass endpoint. In this context, the skill handles education-related personal data, so failing to clearly disclose sensitivity increases the risk of unsafe operational use and accidental exposure.

External Transmission

Medium
Category
Data Exfiltration
Content
# on disk, but keep this skill's state self-contained regardless).
SP_SESSION="${SCHOOLPASS_CURL_SESSION:-$HOME/.schoolpass-mcp/curl-token.json}"

# sp_curl <method> <path> [body-json] [-- extra-curl-args...]
# Adds the AppCode header, Authorization (if $SP_TOKEN set), and JSON accept.
sp_curl() {
  local method="$1" path="$2" body="${3:-}"
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Content
| jq -r '.access_token // .payload.access_token // .accessToken')
  [ -n "$token" ] && [ "$token" != "null" ] || { echo "login failed" >&2; return 1; }
  export SP_TOKEN="$token" SP_MEMBER_ID="$uid"
  mkdir -p "$(dirname "$SP_SESSION")" && chmod 700 "$(dirname "$SP_SESSION")"
  printf '{"memberId":%s}\n' "$uid" > "$SP_SESSION"   # never write the token to disk
}
```
Confidence
80% confidence
Finding
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Missing User Warnings

Medium
Confidence
97% confidence
Finding
The examples perform live create and delete operations against dismissal records without a strong user-facing warning that they change production data. Because these actions affect real attendance/dismissal state for students, omission of a conspicuous warning makes accidental misuse materially more likely.

Static analysis

No suspicious patterns detected.