Back to skill

Security audit

WhatPulse AI Agent Skill

Security checks for vulnerabilities and agentic risk

Overview

The skill is mostly a read-only WhatPulse stats helper, but it handles very private activity data and documents recurring remote/cloud database syncing without enough safeguards.

Install only if you are comfortable letting the agent read detailed WhatPulse activity history, including app use, website activity, input statistics, bandwidth, and work patterns. Prefer local-only use. If you enable remote access, avoid shared cloud folders, encrypt snapshots, restrict permissions, and document how to disable the scheduled sync and delete old copies.

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
SKILL.md:223
Finding
Recurring Unencrypted Synchronization of Sensitive Activity Data## Vulnerability Details **File Location**: `SKILL.md:223-235`; additional user-facing instructions at `README.md:79-91` **Vulnerability Type**: Sensitive data exposure through unencrypted database snapshots **Risk Level**: Medium ### Vulnerable Code `SKILL.md:223-235`: ```markdown ## Remote / Synced Database Access For remote instances (e.g., OpenClaw running on a different machine), the database can be made available by: 1. **Cloud sync**: Copy the DB to a synced folder (Dropbox, OneDrive, iCloud). Use `sqlite3 original.db ".backup '/path/to/synced/copy.db'"` for a safe snapshot. 2. **Set the env var**: `export WHATPULSE_DB="/path/to/synced/whatpulse.db"` on the remote machine. 3. **Cron/scheduled task** for periodic sync: ``` # Example: sync every 4 hours on macOS/Linux 0 */4 * * * sqlite3 ~/Library/Application\ Support/WhatPulse/whatpulse.db ".backup '/path/to/synced/whatpulse.db'" ``` The `.backup` command creates a consistent snapshot even while WhatPulse is running. ``` `README.md:79-91`: ```markdown ## Remote Access For AI agents running on a remote server, sync the database periodically. 1. On the WhatPulse machine, schedule a snapshot: ```bash # cron: every 4 hours (adjust as wanted) 0 */4 * * * sqlite3 ~/Library/Application\ Support/WhatPulse/whatpulse.db ".backup '/path/to/synced/whatpulse.db'" ``` 2. Sync via cloud storage (Dropbox, OneDrive, etc.) or `rsync`. 3. On the remote machine: ```bash export WHATPULSE_DB="/data/whatpulse.db" ``` ``` ### Technical Analysis The documented workflow creates a complete SQLite snapshot and places it in a synchronized directory every four hours. No encryption, restrictive file permissions, destination validation, retention controls, or warning about shared-folder and cloud-account exposure is included. The database may contain sensitive behavioral information, including website activity, application usage, keyboard and ...[truncated 2158 chars]
Remediation
## Remediation Suggestions 1. Prefer local-only database access and clearly identify remote synchronization as an optional, privacy-sensitive operation. 2. Encrypt snapshots before placing them in any synchronized directory. Encryption keys must be stored separately from the snapshot and cloud account. 3. Apply restrictive permissions to the snapshot and destination directory, such as owner-only access on supported systems. 4. Use an authenticated, encrypted, least-privilege transfer mechanism instead of a generally shared cloud folder. 5. Configure the remote account or service with read-only access to only the required snapshot, rather than broader filesystem or cloud-storage access. 6. Validate that the destination is not publicly accessible or shared with unintended users before enabling synchronization. 7. Define retention and secure-deletion policies so obsolete behavioral snapshots do not accumulate indefinitely. 8. Obtain explicit user consent and explain which categories of behavioral data will be copied off-device. 9. Avoid recommending a recurring scheduled task as the default. Prefer an explicit, user-initiated export or an opt-in schedule with documented removal instructions. 10. Document how to disable the cron entry, revoke remote access, remove historical snapshots, and rotate encryption credentials after suspected exposure.
Vulnerability Patterns
  • Rogue AgentSelf-Modification, Session Persistence
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • 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
Findings (7)

Skill Enumeration

Medium
Category
Agent Snooping
Content
Claude Code:
```bash
mkdir -p ~/.claude/skills/whatpulse
cp SKILL.md ~/.claude/skills/whatpulse/
```
Confidence
85% confidence
Finding
Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

Session Persistence

Medium
Category
Rogue Agent
Content
Claude Code:
```bash
mkdir -p ~/.claude/skills/whatpulse
cp SKILL.md ~/.claude/skills/whatpulse/
```
Confidence
60% confidence
Finding
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.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The skill accesses highly sensitive behavioral data including keystroke counts, application usage, website activity, bandwidth, and uptime, but the description does not prominently warn about the privacy sensitivity of that information. Users may invoke the skill without understanding that it can reveal intimate work habits, browsing patterns, and activity timelines.

Vague Triggers

Medium
Confidence
95% confidence
Finding
The manifest-style description lists generic triggers such as "keystrokes," "app usage," "screen time," "bandwidth," and "computer stats" without any narrowing context or exclusion conditions. These phrases are common in normal user requests and could cause unintended invocation outside a clearly scoped WhatPulse intent.

Session Persistence

Medium
Category
Rogue Agent
Content
1. **ALL queries MUST use `sqlite3 -readonly`**. No exceptions.
2. **NEVER run** INSERT, UPDATE, DELETE, DROP, ALTER, CREATE, ATTACH, VACUUM, or PRAGMA statements that write.
3. **NEVER use WAL mode** or any operation that creates journal/lock files.
4. If a query fails, diagnose. Do NOT attempt workarounds that might write to disk.

Query format: **ALWAYS use a heredoc** to pass SQL to sqlite3. This avoids shell interpretation issues (e.g. `!` in `!=` triggers bash history expansion inside double quotes). **NEVER pass SQL as a quoted string argument.** Always use this exact pattern:
Confidence
60% confidence
Finding
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.

Intent-Code Divergence

Medium
Confidence
88% confidence
Finding
The skill claims 'strict read-only mode' while explicitly allowing the database path to come from an environment variable that may point to a remote or cloud-synced copy. This broadens the trust boundary from a local personal database to arbitrary external files, increasing the chance of unintended disclosure of highly sensitive activity telemetry or querying a tampered database.

Description-Behavior Mismatch

Medium
Confidence
93% confidence
Finding
The manifest and top-level description frame this as reading a local WhatPulse database, but later instructions describe cloud-synced copies and remote access via WHATPULSE_DB. That mismatch can mislead users and operators about the data exposure surface, causing the skill to access sensitive telemetry from shared folders or remote environments that were not expected to be in scope.

Static analysis

No suspicious patterns detected.