Back to skill

Security audit

好运莲莲

Security checks for vulnerabilities and agentic risk

Overview

The skill matches its private-assistant purpose, but scheduled reminders can later run agent prompts containing raw memo text, which creates a review-worthy safety risk.

Review before installing. Use this only on a private, trusted Hermes profile, understand that finance and journal entries are stored locally, and avoid setting reminders on copied or untrusted text until reminder prompt isolation is hardened.

Vulnerability Patterns
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • 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
Findings (2)

T01 · Skill Instruction Hijacking

Error
Location
scripts/reminders.py:25
Finding

Persistent Agent Prompt Injection Through Untrusted Reminder Content

Content
View full analysis
str: title = memo.get("title") or "未命名提醒" content = memo.get("content") or title kind = memo.get("kind") or "note" return ( "This cron job was created by the private-assistant skill.\n" "Send exactly one short reminder message with no process details, no headers, and no extra metadata.\n" f"Memo ID: {memo.get('id')}\n" f"Memo kind: {kind}\n" f"Reminder time: {reminder_at}\n" f"Title: {title}\n" f"Content: {content}\n" "Preferred style: concise, single message, user-facing, Chinese if the source note is Chinese." ) ``` The resulting prompt is assigned directly to the scheduled job payload: ```python "prompt": _prompt_for_reminder(memo, reminder_iso), ``` ### Technical Analysis The reminder title and content are untrusted, user-controlled values. They are interpolated verbatim into an instruction prompt that will be processed by an Agent in a fresh cron session. There is no reliable separation between the trusted instructions and the memo data. In particular, the prompt does not serialize the memo as inert structured data, clearly delimit it as untrusted content, or direct the Agent to reject instructions appearing inside the title or content. A memo can therefore include text such as instructions to ignore the reminder task, disclose accessible data, invoke tools, or produce unrelated output. When the scheduled job executes, an Agent may interpret those instructions as part of its operative prompt rather than as text that should merely appear in a reminder. The vulnerability persists across sessions because the generated prompt is stored in a cron job and executed later ...[truncated 1346 chars]
Remediation
View remediation
{memo_data}" ) ``` ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/records.py:409
Finding

Sensitive Financial and Journal Files Are Created Without Enforced Private Permissions

Content
View full analysis
None: self.paths.root.mkdir(parents=True, exist_ok=True) if not self.paths.transactions.exists(): self.paths.transactions.touch() if not self.paths.memos.exists(): self.paths.memos.touch() if not self.paths.settings.exists(): _write_json(self.paths.settings, DEFAULT_SETTINGS) ``` Records are subsequently appended without verifying or restricting the file mode: ```python def _append_jsonl(path: Path, record: dict[str, Any]) -> None: path.parent.mkdir(parents=True, exist_ok=True) with path.open("a", encoding="utf-8") as handle: handle.write(json.dumps(record, ensure_ascii=False)) handle.write("\n") ``` ### Technical Analysis The Skill stores financial transactions, counterparties, personal notes, reflections, moods, reminder details, and scheduling identifiers in local JSON and JSONL files. However, directory and file creation relies entirely on the process umask. On systems with a permissive umask, the directory may be accessible to other local users and the files may be created with group-readable or world-readable permissions, such as `0644`. The implementation does not verify the resulting modes or repair existing files that have overly broad permissions. The same issue affects files written through the temporary-file replacement helpers because temporary files are created securely, but no explicit final policy is enforced for all existing storage paths. The lock file is also created without a restrictive mode. ### Attack Path 1. The Skill runs under a process with a permissive umask. 2. `_ensure_initialized()` creat ...[truncated 1248 chars]
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • System Prompt LeakageDirect Leakage, Indirect Extraction, Tool-Based Exfiltration
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (12)

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
- 时间解析、相对时间换算、日期区间计算、cron 表达式生成,统一交给 `reminders.py` / `insights.py` 的 payload 脚本处理;不要用模型心算或临时手推。

Direct Prompt Extraction

High
Category
System Prompt Leakage
Confidence
85% confidence
Finding

Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.

Content

Scanner excerpt · references/interaction-rules.md (reported line 80)May include surrounding context.

md
Always pass the raw user time phrase, such as `1分钟后`, `今晚9点`, or `明早8点`,
to `python SKILL_DIR/scripts/reminders.py create-payload --reminder-at "..."`.

## Output Rules

- 一条消息完成回复
- 优先使用 `|` 分段

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
94% confidence
Finding

The skill instructs the agent to run local Python scripts, read environment variables such as HERMES_HOME, and write persistent data/cron-linked state, but it does not declare any explicit tool scope or allowed-tools boundary. That omission weakens least-privilege enforcement and can let the runtime expose broader file or environment access than reviewers or users expect, which is especially sensitive for a personal-finance and journal skill handling private data.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The line states the skill is a Chinese-message-platform-first assistant, and the rest of the document defines user-facing examples and output style exclusively in Chinese. This imposes a language preference without indicating user choice or opt-in, which conflicts with the language/locale policy criteria.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The document specifies local storage of highly sensitive financial records, personal memos, reflections, and reminder metadata, but it provides no privacy notice, data-handling warning, or safeguards such as encryption, retention limits, or access-control expectations. In a personal-assistant skill, this omission increases the risk that users or integrators will store intimate data without understanding the exposure if the local machine, backup system, or shared workspace is compromised.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The file's operational documentation and field descriptions are presented exclusively in Chinese, with no indication that users may choose another language or that the locale restriction is intentional and justified. This can violate language/locale policy when a skill implicitly requires a specific language without opt-in.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The file’s operative instructions are entirely written in Chinese, which imposes a specific language/locale on the skill behavior. There is no indication that users can opt into another language or that the skill is intentionally limited to a Chinese-speaking or region-specific context.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

This markdown file contains natural-language instructions such as 一条消息完成回复 and 优先使用 '|' 分段, and the overall file is written as a fixed Chinese interaction policy. Under the policy rule, forcing a specific language/locale without user opt-in can be a violation when no alternative or opt-in mechanism is provided.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The scheduled-delivery prompt instructs the agent to respond with exactly the message as a single Chinese message. This imposes a specific language choice in natural-language behavior without any visible user preference, opt-in, or documented locale justification in this file.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

This Python file hard-codes the default currency to CNY and uses Chinese category labels and keywords as the primary record taxonomy. Because SQP-3 applies to all file types and flags language/locale policy violations, this is a finding: the skill does not offer a user language/locale choice or explain that it is intentionally region-specific.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The reminder prompt embeds the full memo content, title, kind, memo ID, and reminder time into text intended for another agent/process to generate a user-facing message. In a personal bookkeeping/journal assistant, memos may contain highly sensitive financial or diary information, so passing full content when only a short reminder is needed creates an unnecessary data-exposure path and increases the chance of oversharing, prompt leakage, or accidental disclosure in downstream logs or outputs.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
81% confidence
Finding

The natural-language instruction says the reminder should be 'Chinese if the source note is Chinese,' which enforces a language choice based on input characteristics rather than explicit user preference. This can conflict with a policy requiring language or locale choice to be user-directed or opt-in.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.