Back to skill

Security audit

Tire

Security checks for vulnerabilities and agentic risk

Overview

The skill is not clearly malicious, but its Tire branding does not match its generic local activity logger that stores, searches, and exports arbitrary user input.

Install only if you are comfortable with a local command-line logger that may save arbitrary text you pass to it under ~/.local/share/tire and later search or export it. Avoid entering secrets or sensitive personal data, and review or delete that directory if you stop using the skill.

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

Local Log Data Is Created Without Enforced Private Permissions or Symlink Protection

Content
View full analysis

Vulnerability Details

File Location: scripts/script.sh:6-9; repeated log writes at scripts/script.sh:123-137, 138-152, 153-167, 168-182, 183-197, 198-212, 213-227, 228-242, 243-257, 258-272, 273-287, and 288-302
Vulnerability Type: Insecure local file permissions and unsafe file handling
Risk Level: Medium

Vulnerable Code

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

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

Representative command handler:

bash
run)
    shift
    if [ $# -eq 0 ]; then
        echo "Recent run entries:"
        tail -20 "$DATA_DIR/run.log" 2>/dev/null || echo "  No entries yet. Use: tire run <input>"
    else
        local input="$*"
        local ts=$(date '+%Y-%m-%d %H:%M')
        echo "$ts|$input" >> "$DATA_DIR/run.log"
        local total=$(wc -l < "$DATA_DIR/run.log")
        echo "  [Tire] run: $input"
        echo "  Saved. Total run entries: $total"
        _log "run" "$input"
    fi
    ;;

The same append pattern is used for the other input-taking commands.

Technical Analysis

The script stores all supplied command input under ~/.local/share/tire, but it does not establish a restrictive umask, enforce mode 0700 on the data directory, or enforce mode 0600 on log files. Under a common default umask of 022, the directory can be created as 0755 and log files as 0644. On a multi-user system where home-directory traversal is permitted, other local users may therefore read recorded inputs.

The log files are also opened using ordinary append redirection without checking whether the destination is a symbolic link or a regular file. If an attacker can write to the data directory—for example, because it was previously created with overly permissive ownership or permissions—the attacker can replace a log path with a symbolic link. A subsequent inv ...[truncated 1852 chars]

Remediation
View remediation

Remediation Suggestions

  1. Set a restrictive umask before creating any persistent state:

    bash
    umask 077
    
  2. Create and validate the data directory with owner-only permissions:

    bash
    DATA_DIR="${HOME}/.local/share/tire"
    mkdir -p -- "$DATA_DIR"
    chmod 700 -- "$DATA_DIR"
    
    if [[ -L "$DATA_DIR" || ! -d "$DATA_DIR" || ! -O "$DATA_DIR" ]]; then
        printf 'Unsafe data directory: %s\n' "$DATA_DIR" >&2
        exit 1
    fi
    
  3. Before writing, reject symbolic links and non-regular existing files:

    bash
    ensure_safe_log() {
        local file="$1"
    
        if [[ -L "$file" ]]; then
            printf 'Refusing symbolic-link log: %s\n' "$file" >&2
            return 1
        fi
    
        if [[ -e "$file" && ( ! -f "$file" || ! -O "$file" ) ]]; then
            printf 'Refusing unsafe log file: %s\n' "$file" >&2
            return 1
        fi
    
        if [[ ! -e "$file" ]]; then
            (umask 077; : > "$file")
        fi
    
        chmod 600 -- "$file"
    }
    
  4. Apply the validation to every log destination, including history.log, immediately before opening it.

  5. Avoid recording secrets by documenting that command input is persisted, offering a no-log mode, and redacting known sensitive fields where applicable.

  6. For stronger protection against time-of-check/time-of-use races in hostile shared environments, perform file creation and append operations through a helper that uses open() with O_NOFOLLOW, verifies ownership and regular-file status with fstat(), and sets mode 0600.

Vulnerability Patterns
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • 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
Findings (10)

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The skill is presented as a tire-specific assistant, but the documented capabilities describe a much broader local logging and data-management tool. This mismatch can mislead users and host systems into invoking the skill in contexts they would not otherwise allow, increasing the chance of overbroad data collection and unintended use.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The manifest says the skill is for 'tire', implying a tire-focused assistant, but the help text and command surface expose a broad 'utility toolkit' with generic actions like run, convert, analyze, generate, compare, export, config, report, and stats. Nothing in the code is specific to tires; instead it records arbitrary user input into assorted local log files and provides generic search/export/status features.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The documentation claims a tire-focused assistant, yet the content describes generic home-management and activity logging features unrelated to tires. This deceptive or careless scoping weakens user consent and can cause the skill to be trusted in situations where broader data handling would be inappropriate.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The trigger phrase 'Use when you need tire' is vague and overly broad, making accidental or overly permissive invocation more likely. In an agent ecosystem, ambiguous activation conditions can route unrelated user requests into a skill that logs activity and persists local data.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The documentation advertises automatic history and activity logging without a prominent warning about persistence, retention, or sensitivity of stored inputs. This can lead users to disclose information they would not share if they understood it would be saved locally and searchable/exportable later.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
81% confidence
Finding

The file header presents this as 'Tire', which suggests a tire-specific utility, but the built-in help immediately rebrands it as a 'utility toolkit' and exposes broad generic commands unrelated to tires. This is more than incomplete documentation: the inline labeling implies a domain-specific tool while the implementation is domain-agnostic.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The script includes broad export and search features that aggregate previously stored user inputs across log files, despite the skill being presented as a simple tire assistant. In context, this unnecessary data-handling capability increases privacy risk because sensitive user text may be discoverable and recopied into new files without a clear need tied to the advertised function.

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 copies aggregated log contents into new export files in json/csv/txt formats, expanding the number of at-rest copies of potentially sensitive data. Because the skill is presented as a simple tire assistant, users are less likely to expect that prior interactions can be consolidated and preserved in easily shareable files.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

User-supplied input is written persistently to files under ~/.local/share/tire and echoed into history logs without any explicit notice or consent. In a skill context, users may assume ephemeral processing; silent retention can expose sensitive queries or personal data to other local users, backups, support bundles, or later exports.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
71% confidence
Finding

The 'Why Tire?' section says 'Works entirely offline — your data never leaves your machine', which communicates a fully local/offline intent. However, the same document includes external homepage, source, and feedback URLs, contradicting the absolute offline claim at the documentation level.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.