Back to skill

Security audit

YunShi

Security checks for vulnerabilities and agentic risk

Overview

The skill is a fortune-telling helper, but it automatically persists private birth-chart data and can send recurring forecasts through messaging channels despite describing itself as offline.

Review this before installing if you plan to paste real birth-chart details. Use it only in a private workspace, avoid saving raw chart text unless you want reuse, confirm any scheduled delivery target carefully, and know how to remove user_chart_profile.json and disable host schedules if you no longer want persistence or pushes.

Vulnerability Patterns
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • 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
Findings (1)

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:73
Finding
Automatic Plaintext Persistence of Sensitive User Profile Data<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:73-88`, `fortune_rules.md:295-324`, and `user_chart_profile.md:37` **Vulnerability Type**: Automatic storage of sensitive personal data in plaintext without explicit consent or adequate protection **Risk Level**: Medium ### Evidence The skill requires profile initialization when a user provides a chart for the first time: ```text When the user provides a chart for the first time, perform one initialization and profile-creation operation. Initialization procedure: 1. Extract and organize fields from the chart text supplied by the user. 2. Generate a structured profile and write it to: - {baseDir}/user_chart_profile.json 3. Record the update timestamp and schema version. 4. If the user requests an update, reset, or replacement, overwrite the JSON file and recreate the profile. ``` The deterministic rules also allow profile creation to be triggered merely by detecting complete chart text and define storage of the unredacted input: ```json { "profileVersion": "1.0.0", "updatedAt": "<YYYY-MM-DDTHH:mm:ss+08:00>", "basic": { "gender": "<value>", "clockTime": "<YYYY-MM-DD HH:mm>", "trueSolarTime": "<YYYY-MM-DD HH:mm>", "lunarTime": "<value>", "baziJieqi": "<value>", "baziNonJieqi": "<value>", "mingZhu": "<value>", "shenZhu": "<value>" }, "chartRaw": "<raw chart text>", "chartSummary": "<structured summary>" } ``` The profile template separately warns that real profile data should only be generated in a private local environment and should not be committed to the repository: ```text If a real profile is written, generate it in a private local environment and avoid committing it to the repository. ``` ### Technical Analysis The skill automatically writes user-supplied chart information to `{baseDir}/user_chart_profile.json` when a complete chart is detected. The stored data may include gender, exact birth-related timestamps, lunar and astrological bir ...[truncated 2741 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. **Require explicit opt-in before persistence** - Treat chart submissions as session-only by default. - Present a clear consent prompt before creating a persistent profile. - Explain what fields will be stored, where they will be stored, and how the user can delete them. 2. **Minimize stored data** - Do not retain `chartRaw` by default. - Store only the normalized fields and derived scores required for future calculations. - Allow raw-text retention only through a separate, explicit opt-in. 3. **Use private application storage** - Store profiles in a host-managed, per-user private data directory rather than `{baseDir}`. - Prevent profile sharing between users or tenants. - Require owner-only file permissions where the platform supports them. 4. **Protect data at rest** - Use a platform secret store or encrypted profile storage when available. - Avoid writing sensitive data if secure storage is unavailable; use session-only memory instead. 5. **Implement a defined retention policy** - Add automatic expiration or a configurable retention period. - Provide a deterministic deletion operation that removes the file rather than only marking it inactive. - Confirm successful deletion to the user. 6. **Prevent accidental publication** - Add `user_chart_profile.json` and equivalent generated profile files to source-control ignore rules. - Add a startup check that warns if a generated profile is inside a repository or shared skill installation. 7. **Resolve documentation conflicts** - Make `SKILL.md`, `fortune_rules.md`, and `user_chart_profile.md` consistently require explicit consent and private storage. - Remove the automatic trigger based solely on detecting complete chart text. ]]>
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
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (8)

Description-Behavior Mismatch

High
Confidence
97% confidence
Finding
The skill markets itself as a local offline fortune-telling tool, but later instructs the agent to directly send generated content to external messaging channels during scheduled runs. That expands the capability surface from local content generation to outbound communication, creating a data exfiltration and unauthorized messaging risk if user profile data or generated content is sent without explicit per-use consent.

Context-Inappropriate Capability

High
Confidence
96% confidence
Finding
The documentation grants the skill the ability to use multiple external messaging channels even though the stated purpose is a local offline oracle. Unnecessary outbound-channel authority violates least privilege and could be abused to spam third parties, leak stored profile content, or bypass user expectations about the skill's network behavior.

Natural-Language Policy Violations

Medium
Confidence
88% confidence
Finding
The natural-language content of the skill is presented entirely in Chinese, including usage examples, with no indication that users may choose another language or that the skill is intentionally limited to a Chinese-language audience. Under the stated policy, forcing a specific language without opt-in is a locale/language policy concern.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The README states that a user's astrology chart/profile may be automatically persisted to a local JSON file, but it does not clearly warn users that personal profile data will be stored beyond the current session. Even if storage is local and offline, silent persistence of personal data can create privacy surprises, unauthorized reuse on shared systems, and retention risks if the workspace is later accessed by others.

Intent-Code Divergence

Medium
Confidence
90% confidence
Finding
The skill claims to be 'local offline' and forbids network retrieval, yet elsewhere mandates remote delivery to Telegram/Slack/Discord and similar services. This inconsistency is dangerous because it can mislead reviewers and users about the actual trust boundary, causing them to provide personal data under a false assumption that nothing leaves the local environment.

Natural-Language Policy Violations

Medium
Confidence
95% confidence
Finding
The instruction "中文输出" forces a specific language for all responses. This is a natural-language locale policy issue because the skill does not offer the user a language choice or describe this as an explicitly region-limited tool.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The skill explicitly defines persistent local storage for a user's astrological profile, including raw chart text and related personal profile fields, but does not require clear notice, consent UX, retention limits, or protection for that stored data. Even if stored only locally, this creates privacy risk because sensitive personal data can be retained across sessions, accessed by other local users/processes, or unintentionally reused after the user no longer expects it.

Missing User Warnings

Low
Confidence
87% confidence
Finding
The README advertises nightly scheduled fortune pushes but does not clearly warn that this may create recurring automated behavior when the host supports task scheduling. Users may not realize the action persists beyond the initial request, which can lead to unwanted notifications, confusion, or repeated execution without informed consent.

Static analysis

No suspicious patterns detected.