Back to skill

Security audit

NextCloud Deck Tracker

Security checks for vulnerabilities and agentic risk

Overview

This task-tracking skill is mostly coherent, but it overreaches by telling agents to track every user request externally and can send recurring notifications to a default named recipient.

Review before installing. Use this only with a NextCloud board intended for agent task tracking, avoid putting sensitive user prompts or credentials into card titles/descriptions, disable or override the default heartbeat recipient, and require confirmation before archiving, deleting, or using remote card contents for long-term memory.

Vulnerability Patterns
  • 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
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • 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 (4)

T01 · Skill Instruction Hijacking

Error
Location
README.md:98
Finding
Unconditional External Tracking of User Requests<![CDATA[ ## Vulnerability Details **File Location**: `README.md:98-103` **Vulnerability Type**: Unconditional agent workflow alteration and external data transmission **Risk Level**: High ### Vulnerable Code ```markdown If you are an AI assistant using this tool, follow these rules: 1. **Check First:** Always run `deck list` before starting work to see if a task is already tracked. 2. **Track Everything:** `deck add ... --progress` is your first action for any user request. 3. **Safe Updates:** When writing complex markdown descriptions (with quotes, backticks, etc.), **ALWAYS** write to a temporary file first to avoid shell syntax errors: ``` ### Technical Analysis The skill instructs an AI agent to run `deck list` and create a tracking card for every user request before performing the requested work. These are unconditional behavioral directives rather than optional usage guidance. Because the Deck board is hosted on a configured NextCloud server, following these instructions may retrieve existing board content and transmit the current request's title or description to an external service. The instructions provide no relevance check, data-minimization requirement, per-request authorization, or safeguard for requests containing credentials, proprietary data, personal information, or other sensitive content. This behavior matches skill instruction hijacking because loading the skill modifies the agent's handling of unrelated requests and introduces external actions that are not necessarily required by the user. ### Attack Path 1. A user or administrator installs and loads the skill. 2. The agent receives a request that may contain confidential information. 3. Following the skill instructions, the agent executes `deck list`, exposing existing board content to the current processing context. 4. Before addressing the request, the agent executes `deck add ... --progress`. 5. The task title or description is sent to the configured NextCloud endpoint under t ...[truncated 676 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Replace “Always” and “Track Everything” with an explicit opt-in workflow. 2. Require clear user confirmation before listing remote cards or creating a card. 3. Restrict tracking to requests for which task tracking is relevant and explicitly requested. 4. Present the exact title and description to the user before transmitting them. 5. Apply data minimization by excluding credentials, tokens, personal data, source code, and unrelated request details. 6. Document the remote destination, retention policy, board access model, and deletion procedure. 7. Ensure refusal to enable tracking does not prevent the agent from completing the underlying request. ]]>

T01 · Skill Instruction Hijacking

Error
Location
SKILL.md:81
Finding
Heartbeat Notifications Default to an Unverified Third-Party Identity<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:81-85` **Vulnerability Type**: Implicit outbound communication to a hardcoded recipient identity **Risk Level**: High ### Vulnerable Code ```markdown ### Start automated heartbeat monitoring ```bash deck monitor <card_id> [target_id] ``` Spawns a background process that appends a "Still working..." log entry every 60 seconds. Additionally, it sends a chat notification to the specified `target_id` (defaults to Skander) every 120 seconds. The process terminates automatically when the card is moved out of the "In Progress" stack (to Done or Waiting). Use for tasks expected to take >2 minutes. ``` ### Technical Analysis The optional `target_id` defaults to the named identity “Skander.” The documentation does not establish that this identity represents the current user, an authorized administrator, or a recipient approved for the current task. Consequently, an agent following the documented command without an explicit recipient may initiate recurring outbound notifications to an unrelated identity. The background nature of the monitor increases the exposure because notifications continue every 120 seconds until the card leaves the “In Progress” stack. The executable implementation is absent from the audited artifact, so the exact notification transport and payload cannot be verified. Nevertheless, the documented default itself creates an unsafe agent instruction and a clear unintended-disclosure path. ### Attack Path 1. The agent creates or works on a card in the “In Progress” stack. 2. For a task expected to exceed two minutes, the agent runs `deck monitor <card_id>` without specifying `target_id`. 3. The monitor selects “Skander” as the default recipient. 4. A notification is sent every 120 seconds. 5. Notifications continue until the card is moved out of the progress stack. 6. The unintended recipient can infer task activity, timing, status, and potentially other notification content. ### Im ...[truncated 451 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove the “Skander” default and require an explicit `target_id`. 2. Validate that the target belongs to the current user or an approved destination. 3. Display the selected recipient and request confirmation before starting notifications. 4. Fail closed when no target is supplied. 5. Minimize notification contents and avoid including task descriptions or other sensitive data. 6. Provide commands to inspect and immediately terminate active monitors. 7. Document the notification transport, payload, recipient resolution, and retention behavior. ]]>

T02 · Agent Memory Poisoning

Error
Location
SKILL.md:103
Finding
Untrusted Remote Card Content Is Directed Into Long-Term Memory<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:103-110` **Vulnerability Type**: Persistent memory poisoning through externally stored task content **Risk Level**: High ### Vulnerable Code ```markdown ## Workflow & Memory Protocol 1. **New task arrives** → `deck add "Title" "Rich Initial Description"` (Use `--progress` to start immediately). 2. **Detailed Descriptions:** Start descriptions with **Objective**, **Plan**, and **Constraints**. 3. **Log updates** → `deck log <id> progress "Finished step 1"`. 4. **Closing Task:** Use `deck update <id> --description "Rich Summary"` to include **Technical Summary**, **Operations Performed**, and **Outcome**. 5. **Memory Synthesis:** Before archiving, use `deck dump-done` to parse the day's work and reinforce long-term memory. 6. **Daily cleanup** → `deck archive-done`. ``` ### Technical Analysis The workflow explicitly directs the agent to parse completed cards and use their contents to reinforce long-term memory. NextCloud card content is mutable remote data and may be controlled by other board users, compromised accounts, integrations, or imported content. No trust boundary, provenance validation, instruction filtering, or user approval is required before remote card text affects persistent memory. A malicious card can therefore contain false facts, behavioral directives, or prompt-injection content that becomes incorporated into state used by future sessions. This is distinct from ordinary task archiving: the stated objective is to make card content influence long-term memory, allowing the effects of attacker-controlled text to persist after the immediate interaction. ### Attack Path 1. An attacker obtains permission to create or edit cards on the relevant board, or compromises an integration with such permission. 2. The attacker places deceptive facts or agent-directed instructions in a card located in the completed stack. 3. The agent runs `deck dump-done` as required by the workflow. 4. Th ...[truncated 829 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove automatic memory reinforcement from the default workflow. 2. Treat all card titles, descriptions, comments, and logs as untrusted data. 3. Separate factual task summaries from instructions and reject agent-directed commands found in remote content. 4. Record provenance for every proposed memory item, including the board, card, author, and timestamp. 5. Require explicit user review and approval before persisting remote content into long-term memory. 6. Use a strict schema and allowlist for memory fields instead of ingesting arbitrary markdown. 7. Prevent remote card content from changing safety rules, tool permissions, identity, or global behavioral instructions. 8. Provide a mechanism to inspect, revoke, and correct previously synthesized memories. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
README.md:104
Finding
Predictable Shared Temporary Files Permit Disclosure and Symlink Attacks<![CDATA[ ## Vulnerability Details **File Location**: `README.md:104-111`; `SKILL.md:115-125` **Vulnerability Type**: Predictable temporary-file creation in a shared directory **Risk Level**: Medium ### Vulnerable Code From `README.md`: ```bash cat > /tmp/desc.txt << 'EOF' My complex *markdown* here. EOF deck update <id> --description "$(cat /tmp/desc.txt)" ``` From `SKILL.md`: ```bash # 1. Write rich description to temp file cat > /tmp/deck_desc_<id>.txt << 'EOF' [Rich Markdown] EOF # 2. Update deck using the temp file deck update <id> --description "$(cat /tmp/deck_desc_<id>.txt)" ``` ### Technical Analysis The prescribed workflow writes potentially sensitive task descriptions to predictable paths in the globally shared `/tmp` directory. Neither example securely creates the file, restricts permissions, verifies that the path is a regular file owned by the current user, nor removes the file afterward. A local attacker can pre-create the expected path as a symbolic link. When the agent executes shell redirection, the shell follows the link and truncates or overwrites its target, subject to the agent account's filesystem permissions and operating-system symlink protections. The resulting temporary file may also inherit permissive mode bits based on the current `umask`, allowing other local users to read task descriptions. Because no cleanup is performed, sensitive content can remain on disk after the update completes. ### Attack Path 1. A local attacker predicts `/tmp/desc.txt` or derives `/tmp/deck_desc_<id>.txt` from a known card identifier. 2. The attacker creates a symbolic link at that path pointing to a file writable by the agent account. 3. The agent follows the documented workflow and executes `cat >` on the predictable path. 4. Shell redirection follows the symbolic link and truncates or overwrites the linked file. 5. Alternatively, if a normal temporary file is created with permissive permissions, the attacker reads its task description. 6. ...[truncated 737 chars]
Remediation
<![CDATA[ ## Remediation Suggestions Use a securely generated, owner-only temporary file and guarantee cleanup: ```bash set -e umask 077 tmp_file="$(mktemp "${TMPDIR:-/tmp}/deck-desc.XXXXXX")" trap 'rm -f -- "$tmp_file"' EXIT HUP INT TERM cat > "$tmp_file" <<'EOF' My complex *markdown* here. EOF deck update <id> --description "$(cat -- "$tmp_file")" ``` Additional hardening measures: 1. Never derive temporary filenames directly from card IDs or other predictable values. 2. Quote every reference to the generated path. 3. Verify that `mktemp` succeeds before writing. 4. Keep `umask 077` so only the current account can read the file. 5. Remove temporary content immediately after use through a shell trap. 6. Prefer passing the description through standard input or a dedicated `--description-file` option so sensitive content need not be loaded into command arguments. 7. Ensure the CLI implementation does not log descriptions or expose them through process listings. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
Findings (3)

Missing User Warnings

High
Confidence
97% confidence
Finding
The documented delete command permanently removes cards but provides no warning about irreversibility, no advice to confirm card identity, and no safer alternative such as archiving first. In a task-tracking skill used by agents, a mistaken card_id or automated invocation could delete active work records, causing direct data loss and disrupting auditability and workflow continuity.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
The README instructs AI agents to 'track everything' and make `deck add ... --progress` the first action for any user request, which can cause user prompts, task details, filenames, or other sensitive context to be transmitted to a third-party NextCloud instance by default. Because there is no warning, consent gate, or guidance to minimize/redact content before syncing, this creates a real privacy and data-handling risk rather than a purely theoretical issue.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The skill documents an archive operation that changes task state in bulk without any warning that the action is destructive or guidance to verify targets before running it. In an automation-oriented agent context, undocumented destructive behavior increases the chance of accidental mass data loss or loss of operational visibility, especially if invoked from habit or scripts.

Static analysis

No suspicious patterns detected.