Dangerous exec
- Finding
- Shell command execution detected (child_process).
Security checks across static analysis, malware telemetry, and agentic risk
Review recommended: the scheduler is mostly coherent, but one cancellation path uses unsafe shell command construction, and the skill handles customer data, reminders, and calendar access.
Before installing, decide whether you are comfortable storing customer contact and no-show data under ~/.openclaw, using Google Calendar OAuth, and enabling cron-based reminders. Avoid using --notify-waitlist in cancel-booking.js until the shell command is fixed, or patch it to use safe argument passing.
65/65 vendors flagged this skill as clean.
Artifact-based informational review of SKILL.md, metadata, install specs, static scan signals, and capability signals. ClawScan does not execute the skill or run runtime probes.
Cancelling a booking with waitlist notification could become a path to run unintended local commands if a crafted booking ID is present.
The command interpolates bookingId into a shell string instead of passing it as an argument array. Generated booking IDs appear to be hex, but if local booking data is poisoned or a crafted ID reaches this path, extra shell commands could run under the user's account.
const output = execSync(`node "${scriptPath}" notify --booking-id ${bookingId}`, {Replace execSync with execFile or spawn using argument arrays, and validate booking IDs with a strict pattern such as /^[a-f0-9]{12}$/ before use.
Installing the skill's dependencies will pull code from the npm ecosystem.
The skill relies on npm packages for parsing and Google API access. This is expected for the stated purpose, and a package-lock is present, but users should recognize that setup installs third-party code.
"dependencies": { "chrono-node": "^2.7.0", "googleapis": "^128.0.0" }Install from a trusted copy of the skill, prefer npm ci when using the provided lockfile, and review dependency updates before refreshing them.
If enabled, the skill can create calendar events using the authorized Google account and calendar scope.
The Google Calendar sync uses a local OAuth token and requests the broad Calendar scope. That matches calendar sync, but it grants meaningful authority over the user's Google Calendar account.
const TOKEN_PATH = path.join(process.env.HOME, '.secrets', 'google-calendar-token.json'); ... scope: ['https://www.googleapis.com/auth/calendar']
Use a dedicated business calendar or account if possible, review the OAuth consent screen carefully, and revoke the token if you stop using the skill.
Customer appointment details may be stored in Google Calendar and become visible to anyone with access to that calendar.
Calendar sync sends customer names, phone numbers, and notes into Google Calendar events. This is purpose-aligned but is an external provider data flow involving customer information.
description: `고객: ${booking.customer.name}\n전화: ${booking.customer.phone || 'N/A'}\n메모: ${booking.notes || 'N/A'}` ... calendar.events.insert({ calendarId: calendarId, resource: event })Use a calendar with appropriate sharing settings, avoid placing unnecessary sensitive notes in bookings, and inform staff/customers as appropriate for your privacy obligations.
Customer contact details and no-show flags may remain on disk and influence later scheduling or deposit decisions.
The skill persists customer no-show history and flagged-customer records that can affect future booking decisions. This is part of the stated no-show feature, but it is sensitive persistent context.
history.push({ customer_name: booking.customer.name, customer_phone: booking.customer.phone, customer_email: booking.customer.email, ... }); ... flagged[key] = { ... require_deposit: ... }Set a retention policy for no-show records, restrict access to the workspace data directory, and periodically review or delete stale flagged-customer entries.
If you add the cron jobs, reminders or calendar sync can run repeatedly without a fresh manual prompt each time.
The README documents cron jobs for recurring reminders and calendar sync. This background automation is disclosed and purpose-aligned, but it can keep acting after initial setup.
0 9 * * * cd /Users/mupeng/.openclaw/workspace/skills/appointment-scheduler/scripts && node send-reminders.js --type day-before ... */30 * * * * cd /Users/mupeng/.openclaw/workspace/skills/appointment-scheduler/scripts && node sync-google-calendar.js
Only install the cron entries you actually want, monitor the first few runs, and remove the cron jobs when the business no longer uses the skill.