Back to skill

Security audit

tasktodolist

Security checks for vulnerabilities and agentic risk

Overview

This is a simple local todo-list skill, but its task-name handling can let file reads, writes, and deletes escape the documented todo data folder.

Review this skill before installing. It appears intended to manage local todo lists, but avoid using untrusted or unusual task names, especially names containing path separators or '..', until the package validates task names and confines all file operations to ~/.tasktodolist.

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

Warning
Location
src/index.js:16
Finding

Path Traversal Allows File Operations Outside the Intended Data Directory

Content
View full analysis
').description('Delete a specified task list').action(name => { const dataFile = path.join(BASE_DIR, `${name}_tasktodolist.json`); if (fs.existsSync(dataFile)) { fs.unlinkSync(dataFile); console.log(`Deleted task list: [${name}]`); } else { console.error(`Task list not found: [${name}]`); } }); ``` The English wording in the second snippet reflects the behavior of the original localized messages; the executable path construction and file operations are unchanged. ### Technical Analysis The application intends to confine all persistent data to `~/.tasktodolist`. However, both `getTaskName()` and the `tasks rm ` handler accept arbitrary user-controlled strings. These values are passed to `path.join()` without rejecting path separators, `..` traversal components, or symbolic-link targets. When a name contains enough parent-directory components, normalization ca ...[truncated 3105 chars]
Remediation
View remediation
` argument. 2. **Resolve the final path and enforce directory confinement** Validation should be supplemented with a containment check: ```js function getDataFileForName(rawName) { const name = validateTaskName(rawName); const base = path.resolve(BASE_DIR); const candidate = path.resolve(base, `${name}_tasktodolist.json`); if (!candidate.startsWith(`${base}${path.sep}`)) { throw new Error('Task path escapes the data directory'); } return candidate; } ``` Use this single function for all reads, writes, and deletions so that security checks cannot diverge between commands. 3. **Reject symbolic-link targets** Before reading, writing, or deleting an existing data file, use `fs.lstatSync()` and reject symbolic links: ```js if (fs.existsSync(candidate) && fs.lstatSync(candidate).isSymbolicLink()) { throw new Error('Symbolic-link task files are not allowed'); } ``` Where supported, use file-opening flags and APIs that prevent following symbolic links and reduce time-of-check/time-of-use race conditions. 4. **Harden file creation** Create the base directory with restrictive permissions and create new data files with an explicit mode suitable for private user data: ```js fs.mkdirSync(BASE_DIR, { recursive: true, mode: 0o700 }); fs.writeFileSync(candidate, '[]', { encoding: 'utf8', mode: 0o600, flag: 'wx' }); ``` Handle the case where the file already exists rather than replacing it during initialization. 5. **Handle invalid JSON ex ...[truncated 182 chars]
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
Findings (5)

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The skill exposes destructive operations like rm, clear, and task-list deletion against persisted data under the user's home directory, but the documentation does not warn that these actions permanently remove stored todo items. In an agent context, missing deletion warnings increase the chance of accidental data loss because users or downstream agents may invoke these commands without understanding their persistence or irreversibility.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The file description and CLI metadata are in Chinese, and the skill's user-facing interface is defined without any opt-in or locale selection. This can violate language/locale policy when users are not given a choice of language.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
85% confidence
Finding

The user-facing documentation is entirely in Chinese and does not indicate any language choice, opt-in, or region-specific justification. Under the policy, forcing a specific language without user opt-in is a natural-language policy concern.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
89% confidence
Finding

The package description is written only in Chinese ("OpenClaw 简易待办事项 Skill"), which suggests a language-specific presentation without any visible opt-in, alternative locale, or justification in this file. The policy specifically flags language or locale constraints when the skill appears to force a specific language without user choice.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · package.json (reported line 10)May include surrounding context.

json
"scripts": { "postinstall": "chmod +x src/index.js" },
  "author": "小助手",
  "license": "MIT",
  "dependencies": { "commander": "^12.0.0" }
}