T09 · Insecure Skill Coding Practices
- Location
index.js:31- Finding
Google OAuth Tokens Stored in an Unprotected Plaintext File
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill matches its stated Edsby-to-Google-Calendar purpose, but it handles sensitive school data and account credentials with too little user control and protection.
Review before installing. Use a dedicated Google Calendar instead of the primary calendar, grant the least Google OAuth scope possible, keep google-tokens.json and the Edsby browser profile out of shared folders and source control, and avoid scheduled or repeated sync until the skill has confirmation, duplicate prevention, and secure credential storage.
index.js:31Google OAuth Tokens Stored in an Unprotected Plaintext File
index.js:8Persistent Edsby Browser Session Stored Without Explicit Access Controls
package.json:6Non-Reproducible Installation of Security-Sensitive Dependencies
The skill explicitly performs Google Calendar synchronization and scheduled checks, which can cause ongoing automated modifications to an external user data store. Because the description does not clearly state consent, scope of changes, frequency, or safeguards such as confirmation and dry-run behavior, users may be surprised by persistent calendar edits, duplicate events, or unintended disclosure of school-related schedule information.
The skill retrieves sensitive educational records including classes, grades, and assignments from Edsby, but the executable path contains no user-facing notice or consent mechanism. Because this data is highly personal and potentially regulated student information, silent collection increases privacy risk and the chance of misuse by downstream tools or prompts.
The skill can create Google Calendar events from Edsby assignment data, which is an external side effect involving a third-party account. Even if this is arguably feature-related, the code provides no in-tool justification, consent gate, or scope limitation, so a user may trigger calendar modification without clearly understanding that student data will be exported and written externally.
The code writes calendar events to Google Calendar without preview, confirmation, or any user-visible warning. This is dangerous because it transfers assignment details to an external service and modifies user data stores, which can cause privacy leakage, unwanted changes, or event spam if inputs are malformed or repeated.
The daily check tool appears to be a simple assignment check, but it also performs calendar synchronization as a hidden side effect. This increases risk because a user or calling agent may invoke a benign-sounding tool and unintentionally cause external writes and data transfer to Google.
The daily check tool triggers calendar synchronization as a side effect with no direct warning in that execution flow. Hidden side effects are especially risky in agent environments because a scheduler or higher-level agent may repeatedly invoke the tool, causing ongoing disclosure of assignment data and repeated modifications to the user's calendar.
The dependency uses a caret range (^1.41.0), which permits automatic installation of newer compatible releases rather than a single audited version. In a security-sensitive skill that uses browser automation, this weakens supply-chain control and can unexpectedly introduce vulnerable or malicious upstream changes.
"description": "OpenClaw skill for Edsby student data and Google Calendar sync",
"main": "index.js",
"dependencies": {
"playwright": "^1.41.0",
"googleapis": "^128.0.0"
},
"scripts": {
Playwright has a referenced advisory, and because the manifest does not pin an exact version, it is not possible to verify whether deployed installations avoid the affected release(s). This is more concerning here because Playwright can download and manage browser binaries, expanding supply-chain exposure in an automation-focused skill.
The googleapis dependency is also specified with a caret range (^128.0.0), so installs may resolve to different versions over time. For a skill handling student data and Google Calendar access, unpinned dependencies increase supply-chain and reproducibility risk.
"main": "index.js",
"dependencies": {
"playwright": "^1.41.0",
"googleapis": "^128.0.0"
},
"scripts": {
"auth": "node index.js --auth"
The manifest includes googleapis with an unpinned version while a known advisory exists for the package, making it impossible to confirm that installations are on a fixed release. Because this skill is intended to sync student data and Google Calendar, any authorization weakness in the API client can have direct consequences for sensitive data access and calendar operations.
No suspicious patterns detected.