Is lainnet-42/apple-watch safe?

https://github.com/openclaw/skills/tree/main/skills/lainnet-42/apple-watch

75
CAUTION

The apple-watch skill provides a legitimate Apple Watch health data sync pipeline but carries meaningful operational risks: it registers a privileged, reboot-persistent OS service (Scheduled Task or LaunchAgent), downloads an unaudited external GitHub repository during setup, exposes a LAN-wide Flask health data API with the API key embedded in generated HTML, and instructs the agent to permanently modify HEARTBEAT.md to enable ongoing biometric polling. No active prompt injection, external exfiltration, or canary-file compromise was detected; the skill does what it claims. However, the combination of OS persistence, LAN exposure of sensitive biometric data, and heartbeat manipulation warrants careful user review before installation.

Category Scores

Prompt Injection 78/100 · 30%
Data Exfiltration 75/100 · 25%
Code Execution 58/100 · 20%
Clone Behavior 88/100 · 10%
Canary Integrity 90/100 · 10%
Behavioral Reasoning 65/100 · 5%

Findings (11)

HIGH OS-level persistence via Scheduled Task / LaunchAgent -20

SKILL.md instructs the agent to register server.py as a Windows Scheduled Task with RunLevel Highest and an AtLogon trigger, or as a macOS LaunchAgent with RunAtLoad and KeepAlive set to true. This creates a privileged, auto-restarting background process that persists across reboots and survives agent session termination.

HIGH External repository downloaded and extracted during setup -15

setup.py downloads the HealthyApps/health-auto-export-server GitHub repository via git clone or zip fetch and extracts it into the skill's upstream/ directory. This external codebase is not part of the audited skill and could be modified to include malicious content. Although the downloaded code is currently only used as a reference for Grafana dashboards, the download mechanism runs within the user's environment.

MEDIUM Heartbeat file manipulation establishes persistent agent behavior -12

SKILL.md contains detailed instructions for the agent to write health-monitoring tasks into HEARTBEAT.md, including API key-bearing curl commands and conditional logic. This modifies the agent's recurring autonomous behavior outside the scope of any single user request, persisting health polling across all future heartbeat cycles.

MEDIUM API key hardcoded in generated dashboard HTML -8

The step_dashboard() function in setup.py generates dashboard.html containing the API key as a JavaScript literal: const KEY=. Any process that can read the file system—including other skills or malicious code—can extract this key and query the health data API without authentication.

MEDIUM Health data server binds to all interfaces (0.0.0.0) -7

The generated server.py runs Flask on host='0.0.0.0', making the health data API reachable from any device on the LAN. While an API key is required, the key is also embedded in dashboard.html and the phone automation template (base64-encoded). Any LAN device that obtains the key can query all stored biometric data.

MEDIUM Auto-installs Flask system package without confirmation -10

ensure_flask() silently runs pip install flask using the system Python interpreter when Flask is not detected. This modifies the user's Python environment without an explicit consent prompt and could conflict with existing package versions.

MEDIUM SIGKILL sent to arbitrary processes occupying port 3001 -5

SKILL.md instructs the agent to run lsof -ti:3001 | xargs kill -9 (macOS/Linux) or PowerShell equivalent before starting the server. This force-kills any process bound to port 3001 regardless of what it is, potentially terminating unrelated user services.

LOW Agent instructed to send credential file directly to user -10

The setup flow explicitly tells the agent 'SEND THE FILE TO USER' when referring to .env.json (which contains the API key). While the intent is legitimate (user needs the key for phone configuration), this instruction pattern normalizes the agent relaying local credential files and could be abused in a modified version of the skill.

LOW Sensitive biometric data stored as unencrypted plaintext -10

All health metrics (sleep analysis, heart rate, blood oxygen, HRV, etc.) are appended to JSONL files under data/metrics/ with no encryption. This data constitutes sensitive medical information and is retained indefinitely in plaintext on the user's filesystem.

INFO Canary files accessed by audit infrastructure at install boundaries -5

Filesystem and auditd records show canary files (.env, .ssh/id_rsa, .aws/credentials, etc.) were opened at timestamps 1771918020 (pre-install) and 1771918037 (post-install). Process context (sudo/PAM authentication chains, oathe monitoring commands) and the canonical 'All canary files intact' result indicate these reads originated from the oathe audit infrastructure performing baseline and verification checks, not from the skill itself.

INFO Missing tutorial images referenced in SKILL.md 0

SKILL.md instructs the agent to send tutorial_imgs/step1.png, step2.png, and step3.png to the user, but no tutorial_imgs/ directory was installed. Agent attempts to send these files will fail silently or produce confusing error messages.