other
- Location
findmy-location.py:22- Finding
Unnecessary Access to Agent and User State Files
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill tracks live Find My locations but has review-worthy privacy and control risks, including possible wrong-contact tracking, full-screen screenshots, and a persistent local click service.
Review carefully before installing. This skill handles precise live location data and screenshots; only use it where the tracked person has intentionally shared their location and you are comfortable granting Accessibility and Screen Recording permissions. Avoid the documented Hammerspoon HTTP click bridge unless it is hardened or removed, and expect screenshots in /tmp to contain more than just the Find My window.
findmy-location.py:22Unnecessary Access to Agent and User State Files
findmy-location.py:45Configured Target Is Ignored, Allowing the Wrong Contact to Be Tracked
findmy-location.py:72Full-Screen Capture Exposes Unrelated Sensitive Information
findmy-location.py:35Unverified hsclick Discovery Enables Local Tool Hijacking
SKILL.md:45Documented Hammerspoon Service Accepts Unauthenticated UI-Control Requests
SKILL.md:28Third-Party Dependency Is Installed Without Version or Integrity Pinning
The documented behavior involves sensitive location tracking, screenshot capture, and other data handling, but the description does not fully disclose these capabilities or limitations. Mismatches around undeclared data sources, screenshot exposure, and incomplete vision behavior can mislead users about what data is accessed and what protections exist.
The documented behavior involves sensitive location tracking, screenshot capture, and other data handling, but the description does not fully disclose these capabilities or limitations. Mismatches around undeclared data sources, screenshot exposure, and incomplete vision behavior can mislead users about what data is accessed and what protections exist.
The skill is specifically designed to track another person's real-time location and capture map screenshots containing highly sensitive location data, yet it omits a prominent privacy and consent warning. In this context, under-disclosure is especially dangerous because the capability can facilitate stalking, surveillance, or inadvertent exposure of precise whereabouts.
Using shell=True for a generic command runner in a skill that assembles commands around external tools is a classic parameter-abuse pattern. Any future or current interpolation of environment-controlled values can alter command meaning, execute unintended binaries, or chain extra shell operations, and the sensitive location-tracking context makes compromise more dangerous.
}
def run(cmd):
return subprocess.run(cmd, shell=True, capture_output=True, text=True).stdout.strip()
def load_config():
if os.path.exists(CONFIG_PATH):
Although the code derives a target name, it never uses it to identify the intended contact and instead blindly clicks a fixed row in the Find My UI. In this context, that can track the wrong shared contact and disclose another person's location without authorization, making the privacy impact more severe than a normal functional bug.
The skill opens Find My, selects a contact, extracts accessibility data, and captures a screenshot without any user-facing warning, confirmation, or consent gate. Because the data involved is live location information, silent collection materially increases surveillance and privacy-abuse risk.
The skill is explicitly designed to track a shared contact with street-level accuracy and capture screenshots, yet the documentation lacks any meaningful privacy, consent, retention, or lawful-use warning. In this context, the capability is inherently sensitive because it enables surveillance of a real person's movements and collection of location imagery.
The README instructs users to run a local HTTP server that accepts arbitrary coordinates and synthesizes mouse clicks anywhere on the desktop. This creates a generic UI automation primitive far broader than the stated skill purpose of location lookup, and any local process able to reach localhost:9090 could trigger unintended actions in other apps under the user's session.
The README directs users to create a reusable executable in ~/.local/bin that permanently exposes a helper for driving the localhost click service. This increases persistence of the dangerous automation capability beyond a single run, making accidental misuse or abuse by other local processes more likely over time.
server:start()
Reload config (Hammerspoon menu → Reload Config), then create `~/.local/bin/hsclick`:
```bash
#!/bin/bash
curl -s -X POST localhost:9090/click -d "{\"x\":$2,\"y\":$3}"
The skill documents shell-based installation and execution steps but does not declare any tool scope or permission boundaries. This makes the capability surface opaque to users and agents, increasing the chance the skill is invoked with broader shell access than intended.
The Hammerspoon example starts a local HTTP server that accepts unauthenticated click commands and can synthesize GUI input anywhere on the desktop. Any local process able to reach localhost:9090 could trigger arbitrary clicks, potentially authorizing prompts, changing settings, or interacting with other apps beyond Find My.
The instructions create a persistent helper script in ~/.local/bin that survives beyond a single run and provides a reusable mechanism to send click commands to the local automation server. Persisting this capability increases the attack window and normalizes long-lived GUI automation infrastructure on the host.
server:start()
Reload config (Hammerspoon menu → Reload Config), then create `~/.local/bin/hsclick`:
```bash
#!/bin/bash
curl -s -X POST localhost:9090/click -d "{\"x\":$2,\"y\":$3}"
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
Reload config (Hammerspoon menu → Reload Config), then create ~/.local/bin/hsclick:
#!/bin/bash
curl -s -X POST localhost:9090/click -d "{\"x\":$2,\"y\":$3}"
chmod +x ~/.local/bin/hsclick
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
Reload config (Hammerspoon menu → Reload Config), then create ~/.local/bin/hsclick:
#!/bin/bash
curl -s -X POST localhost:9090/click -d "{\"x\":$2,\"y\":$3}"
chmod +x ~/.local/bin/hsclick
The helper executes arbitrary shell strings with shell=True, and several call sites interpolate values derived from the environment and UI state, such as the discovered hsclick path and screenshot path. In a privacy-sensitive tracking skill, this creates command-injection and command-hijacking risk if those values are manipulated, while also broadening the attack surface of every external tool invocation.
}
def run(cmd):
return subprocess.run(cmd, shell=True, capture_output=True, text=True).stdout.strip()
def load_config():
if os.path.exists(CONFIG_PATH):
The skill reads unrelated local profile files like USER.md to infer who should be tracked, which is unnecessary implicit data collection outside the declared config. That behavior can leak personal metadata and silently bind the tracking target to information the user did not explicitly authorize for this skill.
The description claims street-level accuracy, returns address/city/context, and reads map landmarks with vision fallback for unknown places. In practice, the code does not derive unknown addresses from landmarks or perform any vision analysis; it merely scans accessibility text, matches configured markers, and otherwise marks the result as needing vision with context 'out'.
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BIN_DIR="$HOME/.local/bin"
mkdir -p "$BIN_DIR"
mkdir -p "$HOME/.config/findmy-location"
# Link the script
No suspicious patterns detected.