Back to skill

Security audit

Symptom

Security checks for vulnerabilities and agentic risk

Overview

This appears to be a local health logging skill, but it stores sensitive symptom data in plaintext and has misleading or broken export behavior that users should review before installing.

Install only if you are comfortable with health and wellness entries being kept as plaintext files under your home directory. Avoid using it on shared or heavily synced machines unless you lock down file permissions yourself, and do not rely on the advertised export feature until the duplicate export handler and privacy documentation 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

Sensitive Health Records Are Stored Without Enforced Restrictive Permissions

Content
View full analysis

Vulnerability Details

File Location: scripts/script.sh, lines 6–9 and 120–127; equivalent writes occur in the other record-handling branches
Vulnerability Type: Plaintext sensitive-data storage with umask-dependent permissions
Risk Level: Medium

Vulnerable Code

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

_log() { echo "$(date '+%m-%d %H:%M') $1: $2" >> "$DATA_DIR/history.log"; }
bash
        else
            local input="$*"
            local ts=$(date '+%Y-%m-%d %H:%M')
            echo "$ts|$input" >> "$DATA_DIR/log.log"
            local total=$(wc -l < "$DATA_DIR/log.log")
            echo "  [Symptom] log: $input"
            echo "  Saved. Total log entries: $total"
            _log "log" "$input"

Technical Analysis

The skill stores health information and activity history as plaintext files beneath ~/.local/share/symptom/. It creates the directory and files without setting a restrictive umask or explicitly enforcing directory and file permissions.

Consequently, permissions are inherited from the invoking process's umask. With a common umask such as 022, the directory may be created as 0755 and log files as 0644. If the user's home-directory hierarchy is traversable by other local users, those users may be able to read symptom records.

The same pattern is used by the track, chart, goal, remind, weekly, monthly, compare, export, streak, milestone, and trend branches. The history log also duplicates submitted values, increasing the number of files containing sensitive information.

Attack Path

  1. A user invokes the skill with private health information, such as symptom log severe headache.
  2. The script creates ~/.local/share/symptom and its log files using permissions derived solely from the current umask.
  3. Under a permissive umask, the resulting directory or files are readable by group membe ...[truncated 886 chars]
Remediation
View remediation

Remediation Suggestions

  1. Set a restrictive umask before creating or writing any application data:

    bash
    umask 077
    DATA_DIR="${HOME}/.local/share/symptom"
    mkdir -p -- "$DATA_DIR"
    chmod 700 -- "$DATA_DIR"
    
  2. Enforce secure permissions on existing data files:

    bash
    find "$DATA_DIR" -type f -exec chmod 600 {} +
    
  3. Create new files with mode 0600, rather than relying only on the environment's umask. Where appropriate, initialize files with install -m 600 /dev/null "$file" before appending to them.

  4. Consider encrypting health records at rest when the expected threat model includes privileged backup operators, stolen disks, or accounts capable of bypassing ordinary file permissions.

  5. Avoid duplicating sensitive values in history.log, or retain only non-sensitive event metadata there.

  6. Add automated tests that run the skill under permissive umasks and verify that the data directory remains 0700 and all record files remain 0600.

Vulnerability Patterns
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • 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
Findings (9)

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The description suggests a symptom-focused tool that logs health symptoms and helps track patterns and chart trends. The code does perform local logging and offers basic review helpers like recent/search/stats/export, so it is adjacent in theme. However, there is a material mismatch: many advertised health-analysis behaviors are not actually implemented—'track', 'chart', 'compare', and 'trend' are just separate append-only text logs rather than real tracking, charting, or pattern analysis. Additionally, the script exposes several broader, undeclared capabilities and categories unrelated to the narrow description, including goal, remind, weekly, monthly, streak, milestone, search, status, and export. Therefore the declared description does not accurately represent the code's actual behavior.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The help text promises export <fmt> will export stored data, but the actual reachable export command records input into export.log. In a health-data tool, this deceptive behavior increases privacy risk because users may provide format arguments or additional sensitive content under the false assumption that the command is a non-mutating export operation.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The dispatcher defines an export) case that logs arbitrary user input instead of performing export, while a later export) branch intended to call _export is unreachable. In a health-tracking context, this can mislead users into typing expected export formats or sensitive data, which is then silently persisted to local logs rather than exported as requested.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

This skill handles sensitive health data and supports export, but the documentation does not prominently warn users about the privacy implications of storing and exporting medical-like information. In context, this makes the skill more dangerous because users may assume 'offline' alone is sufficient protection and may export or retain sensitive data without understanding local exposure, backup leakage, or shared-machine risks.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
85% confidence
Finding

The documentation says the tool works entirely offline and presents itself as a simple local symptom logger, but the command table later includes shell-expanded status lines that run du, cat, wc, tail, and reference $DATA_DIR. That behavior goes beyond the manifest's described symptom logging/trend tracking role by exposing general host-level filesystem inspection mechanics rather than just symptom-management functionality.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The manifest describes a health-symptom tool focused on logging symptoms, tracking patterns, charting trends, and reviewing patterns. The help text and command handlers expand the scope into generic habit/productivity-style features that are not clearly tied to symptom tracking, indicating behavior beyond the stated purpose.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The export routine aggregates all stored health records into plaintext JSON, CSV, or TXT files in the same local data directory without warning about the increased disclosure risk. Exported consolidated files are easier to copy, sync, or accidentally share than the original logs, amplifying privacy exposure for sensitive symptom histories.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

Health-related input is written verbatim to plaintext files under the user's home directory without any explicit privacy notice, consent prompt, retention policy, or file-permission hardening. Because symptom data is sensitive personal information, local persistence materially raises confidentiality risk if the host is shared, backed up insecurely, or compromised.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Low
Category
Not specified by scanner
Confidence
82% confidence
Finding

The manifest scope is symptom logging, pattern tracking, and charting trends, but the documented command set expands into broader habit/productivity-style functions such as goals, reminders, milestones, and generic comparisons. Those capabilities are not clearly tied to the stated health-symptom tracking purpose and suggest feature creep beyond the declared intent.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.