Back to skill

Security audit

Ticktick Linux

Security checks for vulnerabilities and agentic risk

Overview

The skill is mostly a straightforward TickTick CLI wrapper, but its command templates expose user-provided task fields to shell injection risk.

Review before installing. This skill should only be used in a controlled environment with trusted task input unless its commands are changed to use shell-free argument arrays or robust escaping and validation. Expect it to use your TickTick CLI credentials and modify TickTick task data when creating or completing tasks.

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

Error
Location
SKILL.md:27
Finding
Shell Command Injection Through Unsafely Interpolated Tool Parameters## Vulnerability Details **File Location**: `SKILL.md`, lines 27-32, 47-55, and 66-69 **Vulnerability Type**: OS command injection through shell command templates **Risk Level**: High The skill directly interpolates caller-controlled values into shell commands. Several values are enclosed in double quotes, while `status` and `priority` are not quoted at all. ```bash /home/david/.cargo/bin/tickrs task list --json \ {{#if project}}--project-name "{{project}}"{{/if}} \ {{#if status}}--status {{status}}{{/if}} ``` ```bash /home/david/.cargo/bin/tickrs task create --json \ --title "{{title}}" \ {{#if content}}--content "{{content}}"{{/if}} \ {{#if date}}--date "{{date}}"{{/if}} \ {{#if project}}--project-name "{{project}}"{{/if}} \ {{#if priority}}--priority {{priority}}{{/if}} ``` ```bash /home/david/.cargo/bin/tickrs task complete "{{id}}" --json ``` ### Technical Analysis The dynamic parameters `project`, `status`, `title`, `content`, `date`, `priority`, and `id` are embedded in command strings without shell-safe argument handling. Double quotes do not provide adequate protection when an attacker can inject a double quote that terminates the intended argument. The attacker may then append shell metacharacters and an arbitrary command. For example, a malicious title shaped like: ```text "; arbitrary_command; # ``` can terminate the `--title` value, introduce another command, and comment out the remaining generated command. The unquoted `status` and `priority` substitutions are even more directly exposed to shell separators, expansions, redirections, and substitutions. The documented enum restrictions for `status` and `priority` do not establish that runtime validation is enforced. Therefore, they cannot be relied upon as a security boundary. ### Attack Path 1. An attacker or untrusted caller supplies a crafted value for a tool parameter such as `title`, `content`, `project`, `id`, ...[truncated 1526 chars]
Remediation
## Remediation Suggestions 1. Do not construct shell command strings with interpolated parameters. Invoke `/home/david/.cargo/bin/tickrs` directly through an execution API that accepts a program path and an argument array, with shell processing disabled. ```text executable: /home/david/.cargo/bin/tickrs arguments: ["task", "create", "--json", "--title", title] shell: false ``` 2. Append optional flags and their values as separate argument-array elements. Never concatenate user input with flag syntax. 3. Enforce strict allowlists for enumerated fields: - `status`: only `incomplete` or `complete` - `priority`: only `none`, `low`, `medium`, or `high` 4. Validate task IDs against the exact format emitted by `tickrs`. Reject values containing whitespace, quotes, control characters, or shell metacharacters. 5. Apply reasonable length and character restrictions to project names, titles, content, and dates. Treat these checks as defense in depth rather than a substitute for shell-free execution. 6. If a shell is absolutely unavoidable, use a proven argument-escaping routine for the exact target shell on every dynamic value. Do not implement escaping through simple quote replacement. 7. Add negative tests using quotes, semicolons, command substitutions, newlines, redirections, and backticks to verify that malicious input is passed only as literal data.
Vulnerability Patterns
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (1)

Description-Behavior Mismatch

Low
Confidence
90% confidence
Finding
The manifest description at L04 says the skill manages TickTick tasks via add, list, and complete operations. However, the documented tools also include `ticktick_projects`, which lists all projects (L71-L77), a capability outside the stated task-only scope. This is a small but real mismatch between the claimed behavior and the documented implementation.

Static analysis

No suspicious patterns detected.