T09 · Insecure Skill Coding Practices
- Location
scripts/exporter.py:31- Finding
CSV Formula Injection Through Untrusted Time-Entry Fields
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This time-tracking skill is mostly purpose-aligned, but it needs review because it persists sensitive work logs and can export them to unrestricted file paths with CSV export hardening gaps.
Review before installing if your time entries may contain client names, billing details, confidential projects, or sensitive notes. Use it only if local persistence under ~/.openclaw/data/time-guru and third-party parsing of individual activity descriptions are acceptable, and avoid exporting CSVs from untrusted imported data until formula-cell sanitization and export path restrictions are added.
scripts/exporter.py:31CSV Formula Injection Through Untrusted Time-Entry Fields
Mixing characters from multiple Unicode scripts in a single identifier is a common technique to create visually ambiguous tool names.
Reminder or nudging functionality can introduce undeclared trigger-driven behavior, which is more sensitive than passive reporting because it may act on schedules or user activity patterns automatically. If those triggers are not declared, users and the platform may be unable to predict when the skill runs or what contextual data it uses, creating privacy and trust risks.
Reminder or nudging functionality can introduce undeclared trigger-driven behavior, which is more sensitive than passive reporting because it may act on schedules or user activity patterns automatically. If those triggers are not declared, users and the platform may be unable to predict when the skill runs or what contextual data it uses, creating privacy and trust risks.
Reminder or nudging functionality can introduce undeclared trigger-driven behavior, which is more sensitive than passive reporting because it may act on schedules or user activity patterns automatically. If those triggers are not declared, users and the platform may be unable to predict when the skill runs or what contextual data it uses, creating privacy and trust risks.
Reminder or nudging functionality can introduce undeclared trigger-driven behavior, which is more sensitive than passive reporting because it may act on schedules or user activity patterns automatically. If those triggers are not declared, users and the platform may be unable to predict when the skill runs or what contextual data it uses, creating privacy and trust risks.
Reminder or nudging functionality can introduce undeclared trigger-driven behavior, which is more sensitive than passive reporting because it may act on schedules or user activity patterns automatically. If those triggers are not declared, users and the platform may be unable to predict when the skill runs or what contextual data it uses, creating privacy and trust risks.
Reminder or nudging functionality can introduce undeclared trigger-driven behavior, which is more sensitive than passive reporting because it may act on schedules or user activity patterns automatically. If those triggers are not declared, users and the platform may be unable to predict when the skill runs or what contextual data it uses, creating privacy and trust risks.
Reminder or nudging functionality can introduce undeclared trigger-driven behavior, which is more sensitive than passive reporting because it may act on schedules or user activity patterns automatically. If those triggers are not declared, users and the platform may be unable to predict when the skill runs or what contextual data it uses, creating privacy and trust risks.
The skill advertises local storage and lists scripts for persistence/import/export, but it does not declare any explicit tool scope or permissions. That creates a transparency and least-privilege problem: users and platforms cannot easily constrain file read/write behavior, increasing the chance of unintended access or modification of local data.
The skill explicitly selects an external model provider, which can expose user-entered activity descriptions and possibly metadata to a third party. In a time-tracking context, these descriptions may contain sensitive work details, customer names, schedules, and billing information, so undisclosed or weakly governed external model use creates material privacy risk.
author: Golden Bean (coder)
category: Productivity
description: Natural language time tracking with smart activity classification, multi-dimensional reports, productivity analytics, and billing.
model: deepseek/deepseek-v4-flash
input_schema: schemas/input.schema.json
output_schema: schemas/output.schema.json
---
The schema restricts language to "zh-CN" or "en-US" but sets the default to "zh-CN" with no indication of user choice or region-specific justification. This can violate language/locale policy by forcing a specific locale behavior when the user has not explicitly opted in.
The skill returns a fixed currency of "CNY" and formats output with the yuan symbol in user-facing text. This enforces a specific locale/currency convention without offering a user choice or documenting that the tool is region-specific, which matches the natural-language locale policy concern.
The skill returns and operates on fixed Chinese category names such as "开发", "会议", and "其他", which imposes a specific language/locale in its user-visible outputs. There is no opt-in, configuration, or documented justification for restricting output labels to Chinese only.
The exporter writes user time-entry data to any caller-supplied filesystem path without validation, restriction, or user-consent checks. In an agent context, this can enable unintended persistence of sensitive work logs and writing to unexpected locations, especially since the skill description does not disclose file creation behavior.
Time-entry records can include sensitive descriptions, notes, projects, and billing details, and this function writes them to disk without any user-facing disclosure or warning. In a natural-language agent skill, undisclosed file creation materially increases privacy risk because users may not realize their conversation-derived data is being persisted locally.
The reminder string includes a fixed Chinese prompt (刚才做了什么) embedded directly in the suggested command. This forces a specific language in user-facing output without any opt-in, language selection, or documented region-specific justification, which is a natural-language policy violation.
The fallback category label is hard-coded as "其他", which forces a specific language in generated reports when category data is missing. The file also mixes English report text with Chinese labels/currency conventions, and there is no documented user choice or locale configuration to opt into this behavior.
The manifest description uses very broad trigger language such as 'Use when tracking work hours, analyzing time usage, generating productivity reports, or calculating billable time,' which can match a wide range of common user requests. Overly generic invocation criteria increase the chance that the platform routes unrelated or only loosely related prompts to this skill, expanding its access surface and creating opportunities for unintended data exposure or inappropriate tool use.
This JSON file defines all visible category labels using only Chinese strings such as "开发", "会议", and "文档". Because the file provides no alternative locale, opt-in, or documented region-specific justification, it appears to enforce a specific language, which matches the natural-language policy violation criteria.
This markdown file contains user-facing example invocations predominantly in Chinese, while not stating that the skill is Chinese-only or offering any language/locale choice. That can imply a language-specific interaction model without documented opt-in or justification.
This JSON schema is a manifest-type file, so vague-trigger checks apply. The required "action" field allows generic values like "start", "stop", "report", and "project" without any surrounding activation-context constraints, negative examples, or narrower invocation wording, which could contribute to unintended matching if this schema is used for skill activation or routing.
The code uses the Chinese string "其他" as a default category label when no category is present. This forces a specific language in user-visible output without any indication of user choice or documented locale constraint, which is a natural-language policy concern.
The code silently creates a fixed export directory under the user's home folder and stores exported time data there by default. While less severe than arbitrary path writes, this creates undisclosed local persistence of potentially sensitive activity and billing information, which may surprise users and increase data exposure on shared or monitored systems.
The code assigns the category value "开发" unconditionally for GitHub-derived entries. This forces a specific language in generated output without offering user choice or documenting a locale-specific justification, which is a natural-language policy concern.
The Jira importer also sets the category field to the fixed Chinese label "开发". Because the file provides no opt-in or locale selection, this may impose a language choice on users contrary to policy expectations.
No suspicious patterns detected.