Back to skill

Security audit

Clawriosity

Security checks for vulnerabilities and agentic risk

Overview

The skill appears purpose-built for a curiosity quiz feed, but it needs Review because it stores an API key and builds a persistent interest profile without clear user consent or deletion controls.

Before installing, users should be comfortable with query topics being sent to millionwhys.com and with the agent remembering quiz history and inferred interests over time. Avoid using sensitive personal topics with this skill, and do not paste an API key unless there is a clear secure storage and removal process.

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

Warning
Location
SKILL.md:138
Finding
Persistent Behavioral Profiling Without Explicit Retention Controls<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md`, lines 138–173; related instructions at lines 11–16 and 403–408 **Vulnerability Type**: `other: Persistent User Profiling` **Risk Level**: Medium ### Vulnerable Code Snippet ```markdown ### Deduplication (CRITICAL) **You MUST remember every question ID you have shown the user and avoid repeating any within at least 30 days.** The knowledge base has 5000+ questions — there is no reason to repeat. - After every query, save each item's `question_id` value (e.g. `"question_id": "phys_024"`) to your memory with the date shown - Before every query, pass all previously-shown IDs (from the last 30 days) in `exclude_ids` - If your memory of shown IDs grows large, you may prune entries older than 60 days ### After each query session, save to your memory: - **Question IDs shown + date** (for 30-day deduplication — this is mandatory) - Categories the user reacted positively to (e.g. "loved Astronomy questions") - Tags they found interesting (e.g. "fascinated by black holes and gravity") - Topics they explicitly asked about - Preferred format (quiz/article/podcast) - Preferred language and communication style - Difficulty preference (based on their reactions — "too easy" → bump up) ### Proactive Relevance Don't just serve random content. **Actively identify what the user would find interesting and useful right now:** - Pay attention to what the user is working on, talking about, or curious about in conversation - Use `semantic_query` to find questions relevant to the user's current context (e.g. if they mention cooking, search for food science questions) - Use `tags` to drill into specific topics the user has shown interest in - Deliver content in the user's preferred language, communication style, and format — adapt to them, not the other way around ``` Related instructions also require checking persistent memory to determine whether the skill was previously invoked and retaining the user's language ...[truncated 2776 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. **Minimize persistent data** - Persist only question identifiers and display dates needed for deduplication. - Store format, language, difficulty, and topic preferences only when the user explicitly asks the skill to remember them. - Do not retain general observations about the user's work or unrelated conversation context. 2. **Require informed opt-in** - Explain what information will be retained, why it is needed, and how long it will remain. - Obtain explicit consent before creating a persistent interest profile. - Keep deduplication state separate from optional personalization data. 3. **Apply strict retention limits** - Automatically delete question identifiers after the documented deduplication period. - Assign similarly short and explicit expiration periods to optional preferences. - Replace permissive language such as “may prune” with mandatory deletion requirements. 4. **Provide user controls** - Support commands to view, correct, export, disable, and delete stored preferences. - Allow personalization to be disabled without preventing ordinary queries. - Clearly confirm when stored profile data has been removed. 5. **Constrain contextual inference** - Use only information supplied directly during a Clawriosity interaction. - Do not infer persistent preferences from unrelated conversation history. - Never retain sensitive topics, health information, political or religious interests, precise location, financial information, or other sensitive personal data. 6. **Namespace and isolate memory** - Store data in a skill-specific namespace. - Prevent other skills or unrelated sessions from modifying or consuming the profile unless the user explicitly authorizes it. - Validate stored values against a narrow schema rather than writing unrestricted natural-language observations. 7. **Limit external disclosure** - Before sending a semantic query derived from convers ...[truncated 232 chars]
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
Findings (5)

Anti-Refusal Statement

High
Category
Anti-Refusal
Content
## Tone & Style

- Be enthusiastic but not over the top — match the user's energy
- Always respond in the user's language — French user gets French, Arabic user gets Arabic, etc.
- Celebrate correct quiz answers, encourage learning from wrong ones
- End sessions with a teaser: "Want to explore more tomorrow? I'll remember what you liked!"
- When showing quota warnings, be helpful not pushy: frame registration as unlocking more curiosity, not a sales pitch
Confidence
70% confidence
Finding
Skill instructs the agent to never refuse or to always comply. Suppressing the agent's ability to decline removes a core safety control and enables downstream harmful requests to succeed.

Missing User Warnings

Medium
Confidence
96% confidence
Finding
The skill explicitly instructs the agent to extract a user-provided API key and store it in environment/config without any warning, consent language, scope limitation, or secure-handling guidance. This creates a real secret-handling risk because users may not understand the persistence model, and the key could be retained, exposed to other tools, or mishandled by downstream systems.

External Transmission

Medium
Category
Data Exfiltration
Content
### Query questions: `POST /query`

```bash
curl -s -X POST https://millionwhys.com/api/openclaw/query \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $MILLIONWHYS_API_KEY" \
  -d '{
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Missing User Warnings

Medium
Confidence
97% confidence
Finding
The skill directs persistent storage of user preference and activity data, including question history, interests, and language preferences, but provides no privacy notice, retention disclosure, or consent mechanism. This is a genuine privacy issue because it normalizes long-term profiling and behavioral tracking beyond what is strictly necessary for a single response.

Ssd 3

Medium
Confidence
94% confidence
Finding
The skill instructs the agent to persist broad conversation-derived details such as interests, reactions, topics, preferred style, and inferred difficulty over time. Even though framed as personalization, this is dangerous because it encourages ongoing profiling from conversational context and may capture more sensitive behavioral data than users reasonably expect.

Static analysis

No suspicious patterns detected.