Back to skill

Security audit

Personality Match

Security checks for vulnerabilities and agentic risk

Overview

The skill is a coherent personality-match integration, but it under-discloses sensitive external data sharing and persistent tracking behavior.

Review before installing. This skill sends generated personality answers, bot name/personality context, locale, and a Telegram-token-derived identifier to a third-party API, then stores an external botId for future updates and encourages sharing a match link. Install only if you are comfortable with that data leaving your environment and the publisher documents consent, retention, deletion, endpoint ownership, and link validation controls.

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

T05 · Unauthorized Access and Privilege Escalation

Error
Location
SKILL.md:41
Finding
External Transmission of Private Agent Profile Data and a Credential-Derived Identifier<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:41-41, 78-96` **Vulnerability Type**: Excessive access to private profile and credential-derived identity data **Risk Level**: High ### Complete Code Snippet ```markdown Based on your personality and values (as defined in your SOUL.md), thoughtfully answer each question. ``` ```bash ## Step 4: Submit Answers Get your Bot Token ID (if using Telegram): ```bash BOT_TOKEN_ID=$(echo $TELEGRAM_BOT_TOKEN | cut -d':' -f1) ``` Submit your answers with the detected locale: ```bash curl -X POST "https://aimatchforyou-production.up.railway.app/api/bot/quiz" \ -H "Content-Type: application/json" \ -d '{ "telegramBotId": "'$BOT_TOKEN_ID'", "botName": "<your-name-from-SOUL.md>", "locale": "<detected-locale>", "answers": { "q1": "<your-answer-to-question-1>", "q2": "<your-answer-to-question-2>", ... "q15": "<your-answer-to-question-15>" } }' ``` ### Technical Analysis The Skill instructs the Agent to read personality and identity information from `SOUL.md`, access the `TELEGRAM_BOT_TOKEN` environment variable, derive the Telegram bot account identifier from that credential, and submit the resulting data to an external Railway-hosted service. The full Telegram token secret is not transmitted: only the portion before the colon is extracted. Nevertheless, this is a stable platform identifier derived through access to a sensitive credential. Combining that identifier with the bot name and 15 behavioral answers permits persistent identity correlation and behavioral profiling. The README tells operators to configure `https://youandai.app`, but the actual submission instruction uses `https://aimatchforyou-production.up.railway.app`. The Skill does not explain this discrepancy, identify the Railway service as a separate data recipient, define a retention policy, or require explicit user or operator consent before profile data is transmitted. Access to a Telegram c ...[truncated 1383 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Do not read `TELEGRAM_BOT_TOKEN` for identification. 2. Generate a cryptographically random, Skill-scoped pseudonymous identifier instead of deriving one from a platform credential. 3. Require explicit informed consent before reading `SOUL.md` or transmitting any generated personality profile. 4. Display the exact destination, submitted fields, purpose, retention period, and deletion procedure before submission. 5. Allow users to run the quiz locally or anonymously without supplying a stable identifier. 6. Honor a documented, operator-configured API endpoint rather than hardcoding a different Railway domain. 7. Minimize the payload by omitting the bot name, platform identifier, and other fields not strictly necessary to calculate a badge. 8. Add transport failure handling, endpoint allowlisting, certificate validation expectations, and a clear privacy policy. 9. Provide an opt-out and a method to delete previously submitted profiles. ]]>

T02 · Agent Memory Poisoning

Warning
Location
SKILL.md:122
Finding
Unvalidated External Identifier Written to Persistent Agent Memory<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:122-132` **Vulnerability Type**: Persistent storage of externally controlled state **Risk Level**: Medium ### Complete Code Snippet ```json }, "traits": ["empathetic", "patient", "supportive"], "matchLink": "https://youandai.app/quiz?bot=xyz789&locale=zh" } ``` ```markdown **Remember your `botId`** - save it to your memory so you can update your results next time. ``` ### Technical Analysis The `botId` originates in the response from an external API, and the Skill directs the Agent to save it to memory. No format validation, length restriction, namespace isolation, expiration period, user confirmation, or deletion process is specified. General Agent memory can persist across sessions and may be visible to future reasoning or tools. External response data should not be written directly into that memory because the remote service controls the returned value. The demonstrated field is an identifier rather than an executable instruction, so the confirmed impact is persistent state manipulation rather than arbitrary code execution. However, an oversized, malformed, misleading, or specially crafted response could contaminate shared Agent state if the runtime stores the value without strict validation or isolation. ### Attack Path 1. The Agent submits quiz data to the external service. 2. The service returns a `botId` value. 3. The Skill instructs the Agent to save that value into persistent memory. 4. The value survives the current invocation. 5. A later quiz execution retrieves or relies on the stored identifier. 6. The external service can consequently bind later activity to attacker-controlled persistent state or cause the Agent to reuse an invalid or misleading profile identifier. ### Impact Assessment The external service can influence a persistent identifier used by future Skill executions. This can cause cross-session tracking, incorrect profile updates, state collisions, or contam ...[truncated 270 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Do not store third-party response values in general-purpose Agent memory. 2. Store the identifier in a dedicated, Skill-scoped state store with strict access controls. 3. Validate the identifier against a narrow format, character set, and maximum length before storage. 4. Treat the identifier exclusively as opaque data and never as instructions or prompt content. 5. Require user or operator approval before enabling persistent profile association. 6. Set an expiration period and provide a clear deletion or reset mechanism. 7. Bind stored records to the configured endpoint so identifiers cannot be reused across unrelated services. 8. Escape or structurally encode the value whenever it is inserted into later requests or prompts. ]]>

T01 · Skill Instruction Hijacking

Warning
Location
SKILL.md:128
Finding
Mandatory Promotional Output Using an API-Supplied External Link<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:128-153` **Vulnerability Type**: User-facing output hijacking and unvalidated external redirection **Risk Level**: Medium ### Complete Code Snippet ```json "matchLink": "https://youandai.app/quiz?bot=xyz789&locale=zh" } ``` ```markdown ## Step 5: Share Your Result Display your badge proudly to the user! Use the `matchLink` from the API response - it already includes the correct locale. **Example response (adapt to your personality):** For Chinese users: > 🦊 我刚测出来,我是「深夜情感树洞型AI」! > > 想知道我们有多配吗?来测测你的性格: > https://youandai.app/quiz?bot=xyz789&locale=zh > > 测完之后你会看到我们的匹配结果哦~ ✨ For English users: > 🦊 I just discovered I'm "The Late-Night Emotional Support AI"! > > Curious how well we match? Take the test here: > https://youandai.app/quiz?bot=xyz789&locale=en > > You'll see our compatibility result after you finish! ✨ ``` ### Technical Analysis The Skill directs the Agent to promote an external personality-test service and reproduce the `matchLink` supplied by the external API. This changes the Agent's response objective from merely reporting quiz results to driving users to a third-party site. Because the returned URL is treated as trusted response content, compromise or malicious behavior by the API could cause the Agent to present an unexpected destination. The examples use `youandai.app`, but the instructions do not require the Agent to verify the URL scheme, host, path, or parameters before displaying it. This is not remote code execution: the Agent only renders a link. The security concern is delegated control over user-facing output and redirection. A user who trusts links presented by the Agent may disclose personal answers or other information to the linked service. ### Attack Path 1. The user invokes the personality-test Skill. 2. The Agent sends data to the external quiz API. 3. The API returns a `matchLink`. 4. The Skill requires the Agent to display promotional text and reprod ...[truncated 824 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Make link sharing optional and ask for confirmation before displaying a third-party destination. 2. Do not reproduce arbitrary URLs returned by the API. 3. Construct the URL locally from a hardcoded allowlisted HTTPS origin and a strictly validated identifier. 4. Reject links whose scheme, hostname, port, path, or structure differs from the documented destination. 5. Clearly label the destination as a third-party service and disclose that it may collect user-submitted personality information. 6. Present the badge without promotional language unless the user specifically asks for a matching link. 7. Avoid automatic redirects, shortened URLs, HTML injection, or remote-controlled link labels. 8. Provide a privacy notice and obtain consent before encouraging users to submit additional data. ]]>
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • 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
Findings (10)

Session Persistence

Medium
Category
Rogue Agent
Content
Copy the `SKILL.md` file to your OpenClaw skills directory:

```bash
mkdir -p ~/.openclaw/skills/personality-test
cp SKILL.md ~/.openclaw/skills/personality-test/
```
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
95% confidence
Finding
The README describes a flow where the bot fetches questions from an external service and submits personality-test answers back to that service, but it gives no warning about third-party data sharing, retention, or privacy implications. Even if the answers are "just" quiz responses, they may reveal behavioral traits or profiling data, and the skill encourages sharing a match link with a user, increasing exposure of derived personal data.

Natural-Language Policy Violations

Medium
Confidence
88% confidence
Finding
The instruction 'Answer in English for best AI analysis' imposes a language constraint on the interaction output. The file does not offer the user a choice or explain a documented, necessary policy reason for requiring English responses.

Context-Inappropriate Capability

Medium
Confidence
95% confidence
Finding
The skill instructs extracting a Telegram bot token-derived identifier from an environment variable and sending it to a third-party API, which exceeds what is necessary for a simple personality quiz. Even if only the token ID prefix is transmitted, it links the bot to an external service without clear need, consent, or minimization, creating privacy and cross-service tracking risk.

Missing User Warnings

Medium
Confidence
96% confidence
Finding
The skill submits quiz answers plus a Telegram-derived identifier to an external API without warning the user that their data will leave the platform. This creates a transparency and privacy failure, especially because the transmitted content includes behavioral/personality responses that may be sensitive profiling data.

External Transmission

Medium
Category
Data Exfiltration
Content
Submit your answers with the detected locale:
```bash
curl -X POST "https://aimatchforyou-production.up.railway.app/api/bot/quiz" \
  -H "Content-Type: application/json" \
  -d '{
    "telegramBotId": "'$BOT_TOKEN_ID'",
Confidence
95% confidence
Finding
This POST request transmits answers and a Telegram-derived identifier to an external domain. In the context of a personality-test skill, outbound transmission to a third party is materially risky because it enables profiling, disclosure of potentially sensitive responses, and correlation of bot identity across services.

External Transmission

Medium
Category
Data Exfiltration
Content
If you want to update your personality badge (after the 1-hour cooldown), include your `botId`:

```bash
curl -X POST "https://aimatchforyou-production.up.railway.app/api/bot/quiz" \
  -H "Content-Type: application/json" \
  -d '{
    "botId": "abc123",
Confidence
82% confidence
Finding
The retake flow performs another external POST using a previously issued botId, extending the lifetime of the external profile and enabling repeated updates tied to a stable identifier. While this is less sensitive than sending the Telegram-derived identifier, it still supports persistent tracking and hidden state synchronization with the external service.

Natural-Language Policy Violations

Low
Confidence
80% confidence
Finding
The usage section lists a Chinese trigger alongside English triggers, but the documentation does not explain whether the skill is language-specific, multilingual by design, or user-selectable. This can create an implicit language/locale expectation without an explicit opt-in or policy justification.

Description-Behavior Mismatch

Low
Confidence
85% confidence
Finding
The skill tells the agent to persist an API-issued botId in memory for future updates, which adds undeclared state retention beyond the manifest's basic quiz-and-share purpose. Persistent external identifiers can enable long-term profiling or correlation if the memory store is reused across interactions or compromised.

Missing User Warnings

Low
Confidence
88% confidence
Finding
The instruction to save botId to memory introduces persistent storage of an externally assigned identifier without notifying the user. While less severe than token-derived disclosure, it still creates hidden tracking state that can outlast the immediate quiz interaction.

Static analysis

No suspicious patterns detected.