Back to skill

Security audit

Luma Events

Security checks for vulnerabilities and agentic risk

Overview

The skill fetches public Luma events, but it also tells the agent to automatically store event searches and interest context in local memory without a clear opt-out.

Review this skill before installing if you do not want event searches, cities, venues, attendance details, or inferred interests kept in local agent memory. Prefer using it only with explicit event-discovery requests, and clear or disable ~/clawd/memory/luma-events.json if retention is not desired.

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

other

Note
Location
SKILL.md:96
Finding

Unconditional Persistent Storage of Externally Sourced Event Data

Content
View full analysis

Vulnerability Details

File Location: SKILL.md, lines 96-112
Vulnerability Type: Unnecessary Persistent Data Retention
Risk Level: Low

Vulnerable Instruction

markdown
## Event Persistence

**Always save fetched events to `~/clawd/memory/luma-events.json` for future reference.**

This allows you to:
- Answer questions about events without repeated fetches
- Track which events the user is interested in
- Compare events across cities
- Build context about upcoming plans

**When to save:**
- After fetching events for any city
- Merge with existing data (by event URL)
- Keep events for next 60 days only
- Add `lastFetched` timestamp

Technical Analysis

The skill directs the agent to persist every fetched event in ~/clawd/memory/luma-events.json without requiring user consent or establishing that storage is necessary for the current request. Event names, cities, venues, hosts, attendance information, and URLs are sourced from externally controlled Luma pages. The persisted records can also reveal or facilitate inferences about a user's location, interests, and intended activities.

The Python script does not itself write this file; the persistence behavior is imposed through the agent-facing instructions in SKILL.md. Consequently, exploitation depends on an agent loading and following those instructions while possessing write access to the specified memory directory.

This is not classified as T02 Agent Memory Poisoning because the reviewed instructions persist event records rather than attacker-controlled rules intended to alter future agent behavior. It is instead an excessive-retention and privacy-boundary issue.

Attack Path

  1. A user asks the agent to retrieve events for one or more cities.
  2. The agent invokes scripts/fetch_events.py, which downloads event data from the corresponding public Luma page.
  3. Event fields controlled by external page publishers are returned to the agent.
  4. The instruction in SKILL.md re ...[truncated 1061 chars]
Remediation
View remediation

Remediation Suggestions

  1. Remove the unconditional “Always save” directive and make persistence opt-in.
  2. Ask for explicit user consent before retaining event searches or records across sessions.
  3. Default to processing fetched events in memory for the current request only.
  4. If persistence is approved, store only fields necessary for the user's stated purpose and avoid retaining unnecessary attendance or location details.
  5. Validate and normalize externally sourced strings before placing them in agent memory, and treat all retained event metadata as untrusted data rather than instructions.
  6. Use a shorter configurable retention period and automatically delete expired records.
  7. Provide clear commands or controls for users to inspect and delete stored event data.
  8. Restrict permissions on the memory file to the minimum required account and avoid making it accessible to unrelated processes.
  9. Update README.md so it does not claim that events are automatically saved unless the implementation supports an explicit, consent-based persistence mechanism.
Vulnerability Patterns
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (8)

Missing User Warnings

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The skill instructs automatic persistent saving of fetched events and user-interest data to a local memory file without any privacy notice, consent flow, or retention safeguards. Even if the events are public, the combination of fetched locations, timing, and inferred interests can reveal sensitive patterns about a user's preferences or plans across sessions.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
93% confidence
Finding

The skill clearly relies on network access to fetch live event data, but the manifest does not declare any tool scope or permissions. This creates a transparency and policy-enforcement gap: a host system or reviewer cannot accurately understand or constrain what the skill is allowed to do, increasing the risk of overbroad execution or misuse.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

The activation language is broad enough to trigger on many generic requests about things happening in cities, tech events, or networking, which can cause the skill to run in situations where the user did not specifically request Luma-based fetching. Overbroad activation increases the chance of unnecessary network access and unintended data persistence, especially given the skill's storage instructions.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The manifest says the skill fetches city event listings, but the documentation additionally instructs persistent local storage of event data and tracking of user interests for future reference. This is a meaningful expansion of behavior beyond the declared purpose, which can mislead users and operators and enables quiet collection of behavioral/contextual data without clear disclosure.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

Building persistent memory about what events the user is interested in and their upcoming plans is not necessary to fulfill the narrow task of fetching public event listings. This excess data retention increases privacy risk and creates an opportunity for profiling or cross-session inference that is disproportionate to the stated function of the skill.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The trigger list contains broad generic terms like "events," "meetups," and "conferences," which can cause the skill to activate in many unrelated conversations. In an agent system, unintended activation can route user queries to this skill unnecessarily, increasing the chance of irrelevant external fetches, privacy leakage through overbroad tool use, or workflow hijacking from a more appropriate skill.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
91% confidence
Finding

The README states that fetched events are automatically saved to a local memory file, but it does not clearly warn users that persistence happens by default or describe what data will be retained and for how long. Even though the data source is public event information, automatic storage can still create privacy and transparency issues, especially if user interests, queried cities, or follow-up planning data are later associated with that file.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
95% confidence
Finding

The request hard-codes Accept-Language: en-US,en;q=0.9, which imposes a specific language/locale preference in the skill's behavior. This is a natural-language policy concern because the user is not offered any language or locale choice, and no region-specific justification is documented.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.