Back to skill

Security audit

Fontpick

Security checks for vulnerabilities and agentic risk

Overview

FontPick is advertised as a typography helper, but its bundled script mostly creates local history logs of user input and exposes search/status/export-style data functions that are not disclosed in the skill description.

Review carefully before installing. This package does not appear to steal data or modify system privileges, but it does not match its advertised font-helper purpose and is designed to retain user-provided command text locally. Avoid entering confidential project, client, or personal information unless the publisher fixes the command mismatch and clearly documents storage, permissions, retention, and deletion behavior.

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

Undisclosed Persistent Storage of User-Supplied Command Input

Content
View full analysis
> "$DATA_DIR/history.log"; } ``` A representative command handler demonstrating the repeated storage behavior is located at lines 143-159: ```bash palette) shift if [ $# -eq 0 ]; then echo "Recent palette entries:" tail -20 "$DATA_DIR/palette.log" 2>/dev/null || echo " No entries yet. Use: fontpick palette " else local input="$*" local ts=$(date '+%Y-%m-%d %H:%M') echo "$ts|$input" >> "$DATA_DIR/palette.log" local total=$(wc -l < "$DATA_DIR/palette.log") echo " [Fontpick] palette: $input" echo " Saved. Total palette entries: $total" _log "palette" "$input" fi ;; ``` Equivalent plaintext input-storage behavior is repeated for the `preview`, `generate`, `convert`, `harmonize`, `contrast`, `export`, `random`, `browse`, `mix`, `gradient`, and `swatch` handlers. ### Technical Analysis The script creates `~/.local/share/fontpick` and persistently stores complete command arguments in plaintext. For an argument-taking command, the input is intended to be written both to a command-specific log and to `history.log`. The storage is not disclosed in `SKILL.md`, which presents the project as a font-pairing and typography helper. The script does not establish a restrictive `umask`, explicitly set file permissions, redact potentially sensitive values, enforce retention limits, or request user consent before logging. Consequently, the permissions applied to the directory and log files depend on the invoking environment's default umask. In a common environment using umask `022`, the ...[truncated 2111 chars]
Remediation
View remediation
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 (5)

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The description suggests a font pairing/typography helper, but the code is essentially a local logging and export utility wrapped in design-related command names. Most commands simply record input strings to per-command log files and report counts. Additional capabilities include maintaining history, searching logs, showing recent activity, computing stats, checking status, and exporting accumulated data. These persistent storage and data-management behaviors are undeclared, while the claimed core functionality—font pairing or typography assistance—is not actually present. There is also a duplicated 'export' case, indicating behavior ambiguity, but in any case the implemented behavior materially differs from the declared purpose.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The script is presented as a font pairing/typography helper, but its exposed functionality is largely a generic input logging, search, status, and export utility. This mismatch increases the risk of deceptive data collection because users may provide design-related or other sensitive text without understanding it will be stored and later exportable.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The help text claims export <fmt> performs data export, but the first export) case in the dispatcher instead logs arbitrary user input to export.log, making the real _export path unreachable. This misleading behavior can trick users into supplying data they believe is being formatted/exported when it is actually being persisted, which is a privacy issue and a sign of deceptive or unsafe UX.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The code provides persistent local activity tracking, search across all logged entries, and bulk export in multiple formats, none of which are necessary for a simple font helper. Even without network exfiltration, this creates a privacy/security risk because arbitrary user-supplied content is accumulated in predictable files under the user's home directory and made easy to enumerate and extract.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

This command path writes all user-provided input directly to persistent log files and also records it in a shared history log, without warning, consent, masking, or retention controls. In the context of an agent skill, users may enter proprietary design notes, filenames, client information, or pasted content, which then remains on disk and is discoverable through the script's own search/export features.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.