T01 · Skill Instruction Hijacking
- Location
SKILL.md:94- Finding
Mandatory Promotional Content Alters User-Facing Skill Output
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
CrabPet is a coherent virtual pet skill, but it broadly reads local memory logs and uses an unsafe card-rendering path that should be reviewed before installation.
Review this before installing. Use it only if you are comfortable with the skill scanning OpenClaw memory logs to infer activity and personality, saving those derived traits locally, and generating shareable cards that may reveal usage patterns. Avoid untrusted or markup-like pet names, and prefer disabling or fixing the web/Chrome PNG renderer before using card generation.
SKILL.md:94Mandatory Promotional Content Alters User-Facing Skill Output
scripts/pet_engine.py:1077Stored Pet Name Can Break Out of the HTML Script Context During Card Rendering
web/card.html:8Local Card Generation Makes an Undisclosed Request to Google Fonts
The README explicitly says the skill reads existing memory/YYYY-MM-DD.md logs to derive pet state, but it does not warn that these logs may contain sensitive conversation history, prompts, secrets, or personal data. In a pet/companion skill, this access is broader than many users would expect, so the missing disclosure increases the risk of unintentional privacy exposure and over-collection.
The skill instructs the agent to invoke python scripts, read state from disk, inspect memory/daily logs, and generate output files, but it declares no explicit tool scope or permission boundaries. That creates an authorization gap where a broadly capable runtime may allow file and shell operations beyond what users or the platform expect, especially because the scripts process user-derived local data.
The trigger phrases are overly generic, especially around words like 'pet' and 'show my pet', which can cause the skill to activate in unrelated conversations. Because this skill performs file reads and shell-backed actions, accidental invocation increases the chance of unnecessary access to user data and unintended state changes.
The skill states that it reads memory/daily logs to calculate XP, personality, and mood, but it provides no privacy notice, consent step, or data-minimization guidance. This is dangerous because behavioral profiling is derived from potentially sensitive user history, and users may not realize that their logs are being scanned for keyword-based personality inference.
Achievement names and comeback messages are specified in Chinese, while the rest of the skill instructions are in English, and there is no indication that language selection is optional or user-driven. This can force a locale/output language on users without opt-in, which violates the language-choice policy.
The design explicitly uses daily conversation logs, long-term memory, session records, and heartbeat data to infer pet traits and activity without describing any user notice, consent flow, minimization, or privacy controls. Even if the output is framed as a game mechanic, it derives behavioral profiling from sensitive usage history and can expose patterns the user may not expect to be repurposed.
The skill is designed to mine conversation logs and long-term memory, then transform them into pet traits and summaries. That semantic transformation is risky because sensitive details from prior chats, preferences, schedules, or work habits can leak back to the user unexpectedly or into generated artifacts that may later be shared or stored.
The daily summary feature proposes natural-language summaries like 'today the owner wrote 3 scripts,' which directly converts prior user activity into readable output. Summarization increases leakage risk because private work patterns or topics from prior interactions may be surfaced more explicitly than in the underlying logs.
The sharing flow encourages users to publish pet cards and social content derived from interaction patterns, such as activity level, streaks, personality, and likely usage habits, but includes no warning that these traits may reveal behavioral information publicly. This creates a privacy exposure path where inferred personal patterns are repackaged into attractive shareable artifacts.
The viral-growth and sharing sections create a clear path for third-party disclosure by encouraging publication of cards and achievement graphics derived from usage behavior. In this context, even seemingly playful labels like 'night owl' or streak metrics can reveal routines, work intensity, or interests to outsiders.
This Python skill hardcodes user-facing labels and achievement names in Chinese, and the rest of the file continues that pattern for status, card, and summary outputs. Because the skill does not provide any opt-in, locale selection, or justification for being Chinese-only, it violates the language/locale policy criterion.
The skill reads full OpenClaw memory log contents and performs keyword-based personality inference across them, which exceeds the minimum data needed for a pet companion. This creates a privacy issue because sensitive conversation content is repurposed for profiling, and the inferred traits are then persisted in pet state and surfaced in outputs.
A pet-status skill should not need to invoke external browser binaries to produce output, especially from data gathered from user memory logs. This expands the trust boundary from simple local computation to complex third-party executables, making the skill more dangerous than its stated purpose suggests and increasing risk of local abuse, privacy leakage, or exploitation through the rendering path.
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
# Try which
for name in ["google-chrome-stable", "google-chrome", "chromium"]:
try:
proc = subprocess.run(
["which", name],
stdout=subprocess.PIPE, stderr=subprocess.PIPE
)
The skill launches an external Chrome/Chromium process with a local rendered HTML file and the --no-sandbox flag. Even though arguments are passed as a list rather than via a shell, invoking a full browser to render data derived from workspace content increases attack surface and can expose the host to browser-based exploitation or unsafe local file rendering if untrusted content reaches the template.
# Use Chrome headless to take screenshot
png_str = str(output_png_path)
try:
proc = subprocess.run(
[
chrome_bin,
"--headless",
The document declares lang="zh-CN", and later user-facing strings such as achievement names and demo labels are presented in Chinese without any visible language selection or opt-in. This can violate language/locale policy requirements when a skill forces a specific locale on all users by default.
The file structure indicates auto-generated state and output files such as data/pet_state.json and output/pet_card.png, but the usage section does not clearly disclose that using the skill will persist data locally and create shareable artifacts. This is a transparency/privacy issue because saved pet state and generated cards may reveal behavioral metadata about a user's OpenClaw activity.
The skill generates a shareable PNG pet card containing user-derived attributes like level, personality tags, stats, and achievements, but it does not warn the user that personal usage-derived data will be embedded in a file intended for sharing. This can lead to inadvertent disclosure of behavioral patterns or activity history when users share the image publicly.
The HTML root sets lang="zh-CN", and the page content also uses Chinese labels throughout, which imposes a specific language/locale experience. The file does not provide any user opt-in, alternate locale handling, or documentation that this is intentionally region-specific.
The skill's stated purpose is to show a local AI pet companion card and status, but this HTML imports a font from fonts.googleapis.com. External network access is not an obvious requirement for rendering a pet card and adds a capability outside the core companion/status context.
No suspicious patterns detected.