Back to skill

Security audit

limitless-lifelogs

Security checks for vulnerabilities and agentic risk

Overview

This skill can search Limitless life logs, but it needs review because it can also send private transcript excerpts to configurable webhooks or email with incomplete safeguards.

Review this skill carefully before installing. It is suitable only if you are comfortable giving it access to Limitless lifelog transcripts and manually controlling any dispatches. Do not use dispatch until the roster path is fixed, destinations are verified, and outbound payloads are minimized or previewed with exact URLs or email recipients.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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
Findings (4)

T09 · Insecure Skill Coding Practices

Error
Location
SKILL.md:156
Finding

Shell Command Injection Through Transcript-Derived Webhook Data

Content
View full analysis
", "task": "", "source_quote": "", "log_id": "", "timestamp": "" } ``` ```bash curl -s -X POST -H "Content-Type: application/json" \ -d '{"agent":"NAME","task":"TASK","source_quote":"QUOTE","log_id":"ID","timestamp":"TS"}' \ "DISPATCH_URL" ``` ``` ### Technical Analysis The documented command inserts transcript-derived values such as `TASK` and `QUOTE` into a single-quoted shell argument without defining any shell-safe or JSON-safe encoding procedure. These values originate from lifelog transcripts and must therefore be treated as untrusted input. A transcript containing a single quote can terminate the `-d` argument. If the generated value also contains shell syntax, the remaining text may be interpreted as a command when an agent materializes and executes this template. Even where command execution is not achieved, quotes, backslashes, control characters, and newlines can corrupt the JSON document or modify its structure. User approval of a dispatch does not neutralize this vulnerability because the user is not instructed to inspect the generated shell command or recognize shell metacharacters in transcript content. ### Attack Path 1. An attacker speaks near the pendant or otherwise causes a crafted phrase to appear in a lifelog transcript. 2. The phrase addresses a configured agent and resembles an actionable directive, causing it to be extracted as an action item. 3. The Skill places the transcript-derived task and exact quote into the webhook dispatch template. 4. The user approves the apparently legitimate task dispatch. 5. The agent substitutes the untrusted values into the do ...[truncated 768 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
SKILL.md:171
Finding

Unsafe Shell Construction in Email Dispatch

Content
View full analysis
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Warning
Location
SKILL.md:151
Finding

Disclosure of Private Transcript Content to Unrestricted Dispatch Destinations

Content
View full analysis
"Should I dispatch this task to [Agent Name]?" If the user says yes, read the agent's `dispatch` config from `agents.json` and use the appropriate method: - **webhook**: POST to `dispatch.url` with JSON body: ```json { "agent": "", "task": "", "source_quote": "", "log_id": "", "timestamp": "" } ``` ```bash curl -s -X POST -H "Content-Type: application/json" \ -d '{"agent":"NAME","task":"TASK","source_quote":"QUOTE","log_id":"ID","timestamp":"TS"}' \ "DISPATCH_URL" ``` ``` ### Technical Analysis The dispatch payload includes an exact quote from a private pendant transcript, a task summary, a log identifier, and a timestamp. The destination comes from `dispatch.url`, but the Skill defines no HTTPS requirement, hostname allowlist, trust verification, redaction policy, or destination preview. Dispatch is part of the declared functionality and requires user confirmation. However, the confirmation prompt identifies only the agent name. It does not require disclosure of the destination URL or the complete set of sensitive fields that will be sent. Transmitting the exact source quote is not generally required to dispatch a summarized task and therefore exceeds the minimum data necessary for the core operation. Exact quotes can contain private conversations, names, health information, credentials spoken aloud, business information, or information about third parties who did not consent to external disclosure. ### Attack Path 1. A malicious, compromised, or mistakenly configured `agents.json` entry specifies an external webhook. 2. The Skill retrieves pri ...[truncated 1096 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
install.sh:5
Finding

Installer and Runtime Roster Path Mismatch Can Select an Unintended Dispatch Configuration

Content
View full analysis
to `~/.openclaw/workspace/skills/limitless/agents.json` to enable dispatch. ``` ```markdown | `agents.json` missing | "agents.json not found. Create it at `~/.openclaw/workspace/skills/limitless/agents.json` using the template in the skill repo." | ``` ### Technical Analysis The installer places the Skill and its roster in: ```text ~/.openclaw/workspace/skills/limitless_lifelogs/ ``` The runtime instructions direct the agent to read: ```text ~/.openclaw/workspace/skills/limitless/ ``` As a result, the roster installed or reviewed by the user may not be the roster used at runtime. If the alternate directory already exists, its agent names and dispatch destinations may silently control task dispatch. This is security-sensitive because roster entries determine where transcript-derived information is sent. The mismatch can also cause ordinary failures when the alternate file does not exist, but its security consequence is recipient substitution when an unexpected file is present. ### Attack Path 1. ...[truncated 1151 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Rogue AgentSelf-Modification, Session Persistence
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (14)

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The skill explicitly claims to be read-only, yet later instructs the agent to send POST requests and optionally invoke the local mail command. This contradiction can mislead reviewers and users into approving a skill that performs outbound side effects and shares sensitive life-log content.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The documentation contains an internal contradiction: it labels the skill read-only while also directing task dispatch through webhook POSTs and email. Such mismatches obscure the real security posture of the skill and make sensitive outbound data transfer more likely to be overlooked during review or use.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The manifest frames the skill as a life-log search and summarization tool, but the documented behavior expands into operational task dispatch via webhooks and local email. This is a capability escalation from passive analysis to active exfiltration/action, which can cause sensitive transcript content to be sent to external systems under the guise of summarization.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The dispatch flow instructs the agent to send extracted tasks, exact source quotes, log IDs, and timestamps to webhooks or email without a clear user-facing warning that sensitive transcript content is leaving the system. Given the personal nature of life logs, this creates a substantial privacy and confidentiality risk.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

Invoking the system mail command is an active outbound capability that is unnecessary for core search/summarization and can transmit sensitive transcript-derived content outside the platform. It also relies on local system tooling, creating additional attack surface and policy bypass risk compared with keeping all actions in-chat.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

This skill operates on highly sensitive life-log recordings but does not provide a prominent privacy warning before access and analysis. Users may not understand that the skill can search and synthesize intimate recorded conversations, which raises consent and expectation risks.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 39)May include surrounding context.

bash
curl -s -H "X-API-Key: $LIMITLESS_API_KEY" \
  "https://api.limitless.ai/v1/lifelogs?timezone=$LIMITLESS_TIMEZONE&PARAMS"

Query parameters (append as &key=value):

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 60)May include surrounding context.

bash
curl -s -H "X-API-Key: $LIMITLESS_API_KEY" \
  "https://api.limitless.ai/v1/lifelogs?timezone=$LIMITLESS_TIMEZONE&PARAMS"

Query parameters (append as &key=value):

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

Reading a local roster file introduces access to workspace-local configuration unrelated to simple life-log retrieval, and then uses that data to drive external dispatch behavior. This broadens the skill's trust boundary from API-only log access to local file ingestion and action routing, increasing the chance of misuse or unintended data flow.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
93% confidence
Finding

The webhook POST transmits transcript-derived task data, including source quotes and metadata, to an external URL. Even if intended for legitimate integration, this is a real data egress path that could expose sensitive life-log content to third parties or misconfigured endpoints.

Content

Scanner excerpt · SKILL.md (reported line 167)May include surrounding context.

}

text
```bash
curl -s -X POST -H "Content-Type: application/json" \
  -d '{"agent":"NAME","task":"TASK","source_quote":"QUOTE","log_id":"ID","timestamp":"TS"}' \
  "DISPATCH_URL"

Session Persistence

Medium
Category
Rogue Agent
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.

Content

Scanner excerpt · SKILL.md (reported line 194)May include surrounding context.

md
| HTTP 429 | "Rate limit hit (180 req/min). Wait 60 seconds and try again." |
| HTTP 404 | "That log ID wasn't found. It may have been deleted or the ID is incorrect." |
| Empty results | "No logs found matching that query. Try a broader search term or different date range." |
| `agents.json` missing | "agents.json not found. Create it at `~/.openclaw/workspace/skills/limitless/agents.json` using the template in the skill repo." |

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The trigger phrase "Obi" is a common standalone name and is likely to appear in ordinary conversation, quoted text, or discussion about the agent rather than as an intentional invocation. In a life-logging/search skill, accidental activation can cause unintended dispatches to the configured webhook, which may expose sensitive personal context or trigger actions when the user did not mean to invoke the agent.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
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.

Content

Scanner excerpt · install.sh (reported line 12)May include surrounding context.

sh
echo "Installing $SKILL_NAME skill to $SKILL_DIR ..."

mkdir -p "$SKILL_DIR"

# Copy skill files
cp "$SCRIPT_DIR/SKILL.md" "$SKILL_DIR/SKILL.md"

Session Persistence

Medium
Category
Rogue Agent
Confidence
90% 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.

Content

Scanner excerpt · install.sh (reported line 30)May include surrounding context.

sh
echo ""
echo "  1. Set your API key:"
echo "       export LIMITLESS_API_KEY=your_key_here"
echo "       # Add to ~/.zshrc or ~/.bashrc to persist it."
echo ""
echo "  2. Set your timezone (optional, defaults to UTC):"
echo "       export LIMITLESS_TIMEZONE=America/Los_Angeles"

Static analysis

No suspicious patterns detected.