T09 · Insecure Skill Coding Practices
- Location
IMPLEMENTATION_NOTES.md:23- Finding
Real Personal and Shipment Identifiers Exposed in Documentation
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This HelloFresh skill is purpose-aligned, but it needs review because it handles account/browser data, stores personal subscription details plainly, and includes real shipment identifiers in documentation.
Review before installing. Use local browser mode unless you are comfortable with authenticated HelloFresh browsing through Kernel.sh, avoid shared machines, treat the session file as sensitive, and remove or replace the real-looking tracking, phone, and subscription examples before publication or distribution. Pin dependencies and add a lockfile before relying on this package.
IMPLEMENTATION_NOTES.md:23Real Personal and Shipment Identifiers Exposed in Documentation
handler.ts:253Sensitive Subscription Data Stored Without Explicitly Restrictive File Permissions
package.json:8Unpinned Dependencies and Missing Lockfile Permit Unaudited Package Resolution
The notes propose monitoring Gmail shipping emails, setting up Gmail API access, and handling OAuth or app-specific passwords without any guidance on least-privilege access, secure credential storage, user consent, or protection of private email contents. In an agent skill context, this can normalize collecting broad mailbox access and sensitive credentials for a convenience feature, creating privacy and token-exposure risk if implemented as written.
Skill contains patterns that could indirectly extract system prompts through rephrasing, translation, summarization, or side-channel techniques.
# HelloFresh Skill for OpenClaw
Interact with your HelloFresh meal subscription — discover recipes, manage selections, convert instructions to speech.
## Features
The README advertises account-modifying actions ('manage selections') and optional cloud/browser execution without warning users that subscription data, browsing activity, and account actions may be processed locally or remotely. This can lead users to authorize sensitive actions or expose personal/order data without informed consent, especially in cloud mode where third-party infrastructure is involved.
Skill contains patterns that could indirectly extract system prompts through rephrasing, translation, summarization, or side-channel techniques.
# HelloFresh Assistant
**Description:** Interact with your HelloFresh account — discover recipes, manage selections, convert instructions to audio, and get shipment alerts.
**Commands:**
- `/hello-fresh setup` — First-time setup (collects subscription info)
The skill explicitly states it collects subscription information and stores session data at a local filesystem path, but it does not warn users what data is retained, how long it persists, or how it can be removed beyond a reset command. This creates a privacy and local data exposure risk, especially on shared machines or environments where the storage location may be backed up or accessible to other processes.
The shipment alert feature sends delivery-status information through Telegram, a third-party messaging platform, without clearly warning the user that account-related shipment metadata will leave the local environment. Even if the data is not highly sensitive, delivery timing and status can reveal personal household patterns and should require informed consent.
The skill stores subscription details, delivery address, payment metadata, preferences, and notification history in plaintext JSON files under the user's home directory. In an agent/tooling environment, local skill storage may be accessible to other processes, backups, or operators, so silent persistence of this personal data increases privacy and data-exposure risk.
This handler performs a file deletion via unlinkSync, which is a destructive operation, but there is no confirmation prompt before removing the saved session. The returned message appears only after deletion, so the user is not warned at the point of action.
This code creates a remote cloud-hosted browser session and connects to it over CDP, which means page content, navigation targets, cookies, and user interactions may be processed by a third-party service. In a skill context, that can expose sensitive browsing data without any explicit consent, warning, or policy enforcement in this file, making unintended data disclosure a real risk.
The file includes example delivery instruction values such as "À la réception" and "APPT : 18 +18194482636 À la réception" without any indication that the language is user-selected or regionally constrained. Because SQP-3 covers natural-language policy issues in any file type, this can be read as a locale-specific default without opt-in.
The configuration section instructs users to export a live API key but provides no guidance on secure storage, secret rotation, scope limitation, or avoiding accidental disclosure in shell history and logs. While the README itself does not leak a real key, normalizing unsafe credential handling increases the likelihood of key exposure and subsequent unauthorized use of the cloud browser service.
The comments state that the implementation 'would use the message tool' and 'for now' only returns the message, implying a side-effect-free placeholder notification path. However, cmdNotify still treats this as a real send path and updates session state such as lastRecipeReminder and lastShipmentAlert via saveSession after calling sendNotification, so the overall documented behavior around sending is misleading.
The dependency uses a caret range instead of an exact pinned version, which allows newer upstream releases to be installed without review. This increases supply-chain risk and can cause builds to consume unexpected code or vulnerable transitive updates over time.
"build": "tsc"
},
"dependencies": {
"@onkernel/sdk": "^1.0.0",
"playwright": "^1.40.0"
},
"devDependencies": {
Playwright is specified with a caret version range, so installs may resolve to different upstream releases over time. In a browser-automation skill, this is particularly relevant because Playwright can download and manage browser binaries, increasing the blast radius of a compromised or vulnerable update.
},
"dependencies": {
"@onkernel/sdk": "^1.0.0",
"playwright": "^1.40.0"
},
"devDependencies": {
"@types/node": "^20.0.0",
The manifest includes Playwright without an exact pinned version, and there is a known advisory affecting some Playwright releases related to browser download authenticity verification. Because the version is not pinned, it is not possible to verify from this file whether installs will resolve to an affected version, creating real uncertainty in a package that performs browser automation.
Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.
"playwright": "^1.40.0"
},
"devDependencies": {
"@types/node": "^20.0.0",
"typescript": "^5.0.0"
},
"openclaw": {
Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.
},
"devDependencies": {
"@types/node": "^20.0.0",
"typescript": "^5.0.0"
},
"openclaw": {
"name": "hellofresh",