Back to skill

Security audit

Jlm Coffee

Security checks for vulnerabilities and agentic risk

Overview

The skill is a coherent Jerusalem coffee-shop lookup tool, but its cache handling creates a real local file-safety concern users should review before installing.

Install only if you are comfortable with a small Python CLI that fetches public Google Docs data and caches it locally. Avoid running it as an administrator or in shared multi-user environments until the cache is moved to a private per-user cache directory and terminal output is sanitized.

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/jlm-coffee.py:18
Finding

Predictable Shared Temporary Cache Permits Cache Poisoning and Symlink-Based File Overwrite

Content
View full analysis
CACHE_TTL: return None with open(CACHE_FILE, "r", encoding="utf-8") as f: return json.load(f) except (json.JSONDecodeError, OSError): return None def _write_cache(shops): """Write shops list to cache file.""" try: os.makedirs(CACHE_DIR, exist_ok=True) with open(CACHE_FILE, "w", encoding="utf-8") as f: json.dump(shops, f, ensure_ascii=False) except OSError: pass # cache is best-effort ``` ### Technical Analysis The application stores cached data at the fixed, predictable path `/tmp/jlm-coffee/shops.json` on typical Linux systems. The system temporary directory is commonly shared among local users. Neither the cache directory nor the cache file is validated for ownership, file type, or symbolic-link status. The calls to `os.path.getmtime()` and `open()` follow symbolic links. The directory is also created without explicitly enforcing private permissions. This creates two related risks: 1. **Cache poisoning:** A local attacker can create the predictable cache file before the victim runs the application. If its modification time is sufficiently recent and its contents are valid JSON, `_read_cache()` trusts the attacker-controlled data. 2. **Symlink-based overwrite:** An attacker can place a symbolic link at the cache path. When `_write_cache()` ...[truncated 2342 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Note
Location
scripts/jlm-coffee.py:205
Finding

Untrusted Remote Dataset Fields Are Printed Without Control-Character Sanitization

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • 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 (2)

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
94% confidence
Finding

The skill advertises executable behavior that can read environment variables, access the filesystem, write local cache files, and make network requests, but it does not declare any explicit tool scope or permission boundaries. This creates a least-privilege and reviewability problem: a host may grant broader capabilities than users or operators expect, and network/file access can expose local data or enable unintended external communication if the implementation is modified or abused.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
82% confidence
Finding

This code defines English-only day names for displayed opening hours, which can impose a specific language in user-facing output. The file does not provide any user opt-in, locale selection, or justification for restricting output language.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.