Back to skill

Security audit

Quicknote

Security checks for vulnerabilities and agentic risk

Overview

This is a local note/productivity logger, but it needs review because it stores private entries persistently and its script does not match the advertised commands.

Install only if you are comfortable with a local plaintext productivity log stored in ~/.local/share/quicknote. Do not treat the advertised pin, delete, list, or markdown export features as reliable in this artifact, and avoid entering highly sensitive information unless permissions, deletion, and retention controls are fixed.

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
scripts/script.sh:6
Finding

Private Notes Stored Without Enforced Access Controls

Content
View full analysis

Vulnerability Details

File Location: scripts/script.sh:6-7, with representative data writes at scripts/script.sh:140-148 and export creation at scripts/script.sh:53-91
Vulnerability Type: Plaintext sensitive data stored with inherited filesystem permissions
Risk Level: Medium

Vulnerable Code

bash
DATA_DIR="${HOME}/.local/share/quicknote"
mkdir -p "$DATA_DIR"

_log() { echo "$(date '+%m-%d %H:%M') $1: $2" >> "$DATA_DIR/history.log"; }

Representative note storage:

bash
else
    local input="$*"
    local ts=$(date '+%Y-%m-%d %H:%M')
    echo "$ts|$input" >> "$DATA_DIR/add.log"
    local total=$(wc -l < "$DATA_DIR/add.log")
    echo "  [Quicknote] add: $input"
    echo "  Saved. Total add entries: $total"
    _log "add" "$input"
fi

Representative export creation:

bash
_export() {
    local fmt="${1:-json}"
    local out="$DATA_DIR/export.$fmt"
    case "$fmt" in
        json)
            echo "[" > "$out"

Technical Analysis

QuickNote stores user-provided notes, activity history, and exported data as plaintext files under ~/.local/share/quicknote. The script creates the directory with mkdir -p and creates or appends to files using ordinary shell redirection, but it does not set a restrictive umask or explicitly enforce permissions on the directory and files.

Consequently, access permissions depend on the environment from which the script is launched. Under a permissive umask such as 0022, newly created files can receive mode 0644 and directories can receive mode 0755. If parent-directory permissions permit traversal, other local accounts may be able to read notes and exports. Existing directories or files with overly broad permissions are also not corrected.

The application describes its notes as private, so relying exclusively on ambient process permissions does not provide an adequate confidentiality guarantee for potential ...[truncated 1495 chars]

Remediation
View remediation

Remediation Suggestions

  1. Set a restrictive umask before creating any storage:

    bash
    umask 077
    
  2. Create and enforce a private data-directory mode:

    bash
    DATA_DIR="${HOME}/.local/share/quicknote"
    mkdir -p -- "$DATA_DIR"
    chmod 700 -- "$DATA_DIR"
    
  3. Ensure existing and newly created log and export files are owner-readable and owner-writable only:

    bash
    find "$DATA_DIR" -maxdepth 1 -type f -exec chmod 600 -- {} +
    
  4. Create exports through securely initialized files rather than relying only on redirection. Apply mode 0600 immediately and use atomic replacement where practical.

  5. Consider warning users that data is stored locally in plaintext. If the application is expected to protect notes from privileged local access or offline disk inspection, add authenticated encryption using a well-reviewed platform credential or key-storage mechanism.

  6. Add automated tests that launch the script under permissive umasks and verify that the data directory remains 0700 and every stored or exported file remains 0600.

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 (5)

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The description partially matches that this is a local, zero-config CLI tool that stores text entries and supports searching and exporting. However, key advertised features are missing: there is no pin/important-notes mechanism and no markdown export. More importantly, the code’s main interface is not a straightforward note app; it is a broader productivity toolkit with many specialized logging commands (plan, track, review, streak, remind, prioritize, timeline, report, weekly-review) plus stats and status reporting. That makes the actual behavior materially different from the declared purpose.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The script creates a persistent data directory and history log immediately, but this storage/export behavior is not prominently disclosed up front at the interface boundary. For a tool presented as a lightweight quick-note utility, silent persistence can lead users to enter sensitive information they would not have provided if retention and export capabilities were made explicit.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The script’s advertised behavior does not match what it actually implements: it claims quick note-taking with pinning and markdown export, but instead exposes a broader workflow logging tool with multiple category-specific commands and no markdown export. This kind of capability mismatch is security-relevant because users may grant trust, run, or integrate the skill under false assumptions while it persists and organizes data differently than disclosed.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
90% confidence
Finding

This markdown skill description lists a delete <id> command that removes a note, but it does not warn users about deletion behavior, reversibility, or confirmation. For markdown files, operations that can affect user data should include some disclosure so users understand the impact.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Low
Category
Not specified by scanner
Confidence
87% confidence
Finding

The implementation persistently stores many workflow-specific logs across numerous categories rather than operating as a simple ephemeral quick-note utility described by the skill. While not directly code-execution dangerous, this increases data collection and retention beyond user expectations, which can expose sensitive personal or workflow information through local log accumulation and later export.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.