T09 · Insecure Skill Coding Practices
Untrusted Stored Verification Commands Can Induce Arbitrary Command Execution
scripts/cmds/cmd_complete.sh:22Security audit
Security checks for vulnerabilities and agentic risk
The skill is a coherent local task manager, but its verification checkpoint workflow can steer agents into running task-stored shell commands without strong trust boundaries.
Install only if you trust the workspace and agents that can create or edit tasks. Treat every displayed verification checkpoint as untrusted text: inspect it independently before running it, prefer project-owned test scripts over pasted shell, and avoid sharing a writable .tasks.db with untrusted collaborators or agents.
scripts/cmds/cmd_complete.sh:22- **Swarm Engine (`task claim`)**: Atomic SQLite `UPDATE ... RETURNING` locks prevent race conditions, allowing native parallel execution across multiple AI workers. Safely honors `depend` relationship mapping. - **Agent Tracking (`task claim --agent="NAME"`)**: Introduced the `assignee` schema attribute natively to the database. All read-only views (dashboard, list, export) now dynamically trace orchestrator assignment visibility. - **Kanban Dashboard (`task board`)**: A visual ASCII Kanban board that dynamically aligns active tasks, blocked tasks, and real-time nested assignee identifiers without text wrapping limits. - **Execution Checkpoints (`--verify`)**: `task create` and `task edit` now accept `--verify="<cmd>"`. Completing the task will automatically execute the bash subshell test, blocking the task completion on non-zero exit codes. - **Context Persistence (`task note`)**: Agents can now attach timestamped runtime logs or error traces directly to task payloads natively, allowing context to survive agent death dynamically. - **Data Export Pipelines**: - `task list --format=chat`: Bypasses ASCII column padding to synthesize native GitHub-flavored Markdown strings.
The autonomous behavior itself is not automatically a flaw, but here it is tied to automatic execution of verification commands during task completion. In the context of a multi-agent orchestration skill, autonomous execution increases the likelihood that unreviewed or attacker-influenced task data will trigger code execution without a human checkpoint.
The changelog documents a feature where a user-supplied string passed via --verify is automatically executed in a Bash subshell during task completion. In an agent-oriented task system, task metadata may be created, edited, or consumed across trust boundaries, so treating stored task data as executable shell commands creates a command-injection and arbitrary code execution path.
The skill explicitly instructs the agent to run shell commands such as bash install.sh, task, and task-heartbeat, but it does not declare any tool scope, permissions, or allowed-tools constraints. That mismatch matters because an agent may execute shell-capable actions without an explicit trust boundary, increasing the chance of unintended command execution from a skill that is treated as documentation rather than privileged code.
# Install (creates DB only, no PATH changes) bash install.sh # Or install AND create easy CLI symlinks in ~/.local/bin bash install.sh --symlink # Create and work tasks
The skill offers an install mode that creates CLI symlinks in ~/.local/bin, which is a persistent modification to the user's environment outside the project workspace. Persistent changes are risky because they can outlive the session, affect future command resolution, and make it easier for a compromised or tampered install script to plant long-lived execution paths.
if ! command -v sqlite3 &>/dev/null; then
die "sqlite3 is required but not found. Install it:
Debian/Ubuntu: sudo apt install sqlite3
Arch: sudo pacman -S sqlite
macOS: brew install sqlite"
fiCommands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
if ! command -v sqlite3 &>/dev/null; then
die "sqlite3 is required but not found. Install it:
Debian/Ubuntu: sudo apt install sqlite3
Arch: sudo pacman -S sqlite
macOS: brew install sqlite"
fiCommands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
ok "sqlite3 found: $(sqlite3 --version | head -1)" # ── 2. Create seed database with schema (for testing) ─────────────────────── DB="$PWD/.tasks.db" if [ -f "$DB" ]; then
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
The script sources every matching shell file from the cmds directory at startup, which executes their contents with the privileges of the current user. If an attacker can place or modify a file in that directory, running the task tool becomes arbitrary code execution; this is especially risky because the skill presents itself primarily as a local SQLite task manager, not as a plugin executor.
Broad runtime sourcing is more permissive than necessary for a task-management utility and expands the trusted code base to any *.sh file in the target directory. In agent environments where skills may be unpacked, updated, or combined automatically, this increases the chance that an unexpected file leads to code execution or behavior tampering.
This code creates and modifies the SQLite database file automatically via sqlite3 and ALTER TABLE statements. Although the script's purpose is task management, these filesystem and data-changing operations are not disclosed to the user through a visible runtime message, confirmation, or nearby comment explaining that the command may initialize or migrate the database.
Detected: suspicious.dynamic_code_execution