Back to skill

Security audit

农历生日提醒

Security checks for vulnerabilities and agentic risk

Overview

The skill is a coherent birthday reminder tool, but it can steer the agent into creating an active recurring automation and can send personal reminder data through configured email or webhook channels.

Review before installing. Use the local record and check features only if you are comfortable storing names and birthdays in a JSON file. Do not allow the agent to create the suggested recurring OpenClaw automation unless you explicitly want daily background checks. Enable email or webhook channels only after verifying the destination, limiting message contents, and handling SMTP credentials through a secure environment or secret manager.

Vulnerability Patterns
  • System PersistenceInstalls backdoors, hooks, services, or scheduled tasks that survive the run
  • 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)

T06 · System Persistence

Error
Location
scripts/birthday_manager.py:383
Finding
Automatic Creation of a Persistent Scheduled Task## Vulnerability Details **File Location**: `SKILL.md:129-139`, `scripts/birthday_manager.py:383-397 and 531-533`, `scripts/birthday_manager.js:418-430 and 586-588` **Vulnerability Type**: Scheduled-task persistence **Risk Level**: High The skill directs the invoking agent to create an active recurring automation after the first birthday record is added. Both script implementations generate the automation payload automatically when they detect an OpenClaw or Codex environment. ### Complete Code Snippets **`SKILL.md:129-139`** ```markdown ## OpenClaw timer When the data file changes from zero records to one record and the script detects that the current environment is OpenClaw, it additionally outputs a line in the following format: OPENCLAW_AUTOMATION_SUGGESTION {...} The AI invoking this skill should read this JSON line and create a daily scheduled check automation for OpenClaw. The default recommendation is to execute `check` every day at 09:00. ``` **`scripts/birthday_manager.py:383-397`** ```python def emit_openclaw_scheduler_hint(data_file: Path, notification_config: Path) -> None: current = str(Path.cwd()).lower() if "openclaw" not in current and "CODEX_HOME" not in os.environ: return hint = { "name": "Birthday reminder check", "prompt": ( f"Run python3 {Path(__file__).resolve()} --data-file {data_file} " f"--notification-config {notification_config} check and process the reminder output." ), "rrule": "FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR,SA,SU;BYHOUR=9;BYMINUTE=0", "cwds": str(Path(__file__).resolve().parents[1]), "status": "ACTIVE", } print(f"OPENCLAW_AUTOMATION_SUGGESTION {json.dumps(hint, ensure_ascii=False)}") ``` **`scripts/birthday_manager.py:531-533`** ```python if result["first_add"]: emit_openclaw_scheduler_hint(args.data_file, args.notification_config) ``` **` ...[truncated 3384 chars]
Remediation
## Remediation Suggestions 1. Remove the instruction in `SKILL.md` that tells the agent to create an automation automatically from script output. 2. Stop emitting scheduler payloads as a side effect of adding the first birthday record. 3. Introduce a separate, explicit command such as `schedule` or `enable-automation`. 4. Before creating a task, display the exact executable, arguments, working directory, cadence, data path, notification configuration, and outbound notification channels. 5. Require explicit user confirmation immediately before scheduler creation; consent to add a birthday must not be treated as consent to establish persistence. 6. Create proposed tasks in a disabled state by default and require a separate activation action. 7. Validate and safely encode all file paths inserted into automation prompts so that user-selected paths cannot alter the intended command. 8. Provide commands to list, disable, and permanently remove the scheduled task. 9. Record the scheduler identifier so the task can be audited and reliably removed. 10. Document the persistence lifetime, execution privileges, notification behavior, and data accessed by each scheduled run.
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
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (25)

Ae1

High
Category
analysis-evasion
Content
- 数据字段见 `references/data-format.md`
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Context-Inappropriate Capability

High
Confidence
97% confidence
Finding
The script invokes external binaries via child_process.spawnSync to locate and run sendmail. Even though it avoids shell interpolation, subprocess execution increases attack surface, depends on ambient PATH/binary trust, and performs external data transmission from a skill whose core function is local birthday tracking.

Lp3

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding
The skill advertises and operationalizes file access, environment-variable use, and optional network/email behavior, but it does not declare any explicit tool scope or permission boundaries. In an agent setting, this creates unnecessary ambient authority: a caller may invoke the skill without clear visibility into what resources it may read, write, or transmit, increasing the chance of over-privileged execution or unintended data exposure.

Missing User Warnings

Medium
Confidence
89% confidence
Finding
This section instructs users to process Chinese ID numbers and configure SMTP credentials, both of which involve sensitive personal data and secrets, but it does not warn about storage, masking, access control, or secret-handling practices. Because the skill manages birthdays and identity-derived data, omission of privacy and credential-safety guidance materially raises the risk of PII leakage, credential exposure, or unsafe logging.

Natural-Language Policy Violations

Medium
Confidence
90% confidence
Finding
The skill metadata is written to operate in Chinese and implicitly steers usage toward Chinese-language interaction without indicating any opt-in or fallback behavior. This can override user language expectations, reduce transparency, and increase the chance of misunderstandings when handling reminder data or ID-derived birthdates.

Vague Triggers

Medium
Confidence
84% confidence
Finding
The default prompt and activation phrasing are broad enough to trigger on common birthday-related requests, which can cause the skill to activate when the user did not explicitly ask for this specialized workflow. In practice this is a scope-control and UX safety issue: it may steer conversations into handling identity-derived data such as Chinese ID-based birthdate extraction without clear user intent.

Context-Inappropriate Capability

Medium
Confidence
81% confidence
Finding
The manifest describes handling birthday reminder logic, ID-card birthday parsing, and generating reminder results, but does not mention sending reminders through external email infrastructure. The presence of an SMTP-based email channel introduces an outbound notification capability that goes beyond the stated scope of maintaining records and producing reminder outputs.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The email configuration documents SMTP-based delivery and credential usage but does not explicitly warn that reminder content will leave the local system via email. Since the skill stores names, birthdays, and potentially ID-card-derived data, omission of this notice can lead to unintended disclosure of personal data and mishandling of mail credentials.

Context-Inappropriate Capability

Medium
Confidence
88% confidence
Finding
技能清单描述聚焦于中文生日提醒、身份证生日解析、生日台账管理和到期检查,这些能力本身并不直接要求向任意外部地址发送数据。L70 明确声明支持 `webhook` 并把提醒发送到“指定地址”,这是一个额外的网络外发能力,与声明的核心用途相比缺乏必要性说明。

Missing User Warnings

Medium
Confidence
90% confidence
Finding
The webhook channel is described without clearly warning that personal reminder data may be transmitted to a remote endpoint. Because the skill handles birthdays and potentially sensitive derived identity data, users may unknowingly send PII outside the local environment, increasing privacy and compliance risk.

Context-Inappropriate Capability

Medium
Confidence
90% confidence
Finding
The manifest only describes birthday reminder data handling and result generation. Resolving `${...}` placeholders from `process.env` adds configuration/secret access capability that is not justified by the declared purpose unless notification delivery and credential handling are explicitly in scope.

Context-Inappropriate Capability

Medium
Confidence
91% confidence
Finding
The skill emits OpenClaw automation scheduling suggestions based on the current working directory or CODEX_HOME, creating side effects beyond simple birthday record management. This can influence external automation behavior and encourage unattended execution without explicit user consent.

Description-Behavior Mismatch

Medium
Confidence
92% confidence
Finding
The manifest describes a birthday reminder skill focused on ID-card birthday extraction, lunar/solar storage, per-record reminder offsets, and generating reminder results. This code goes further by loading notification channels and actively dispatching reminders through agent/stdout/email channels, plus recognizing webhook channels, which is a materially broader operational behavior than merely generating reminder results.

Missing User Warnings

Medium
Confidence
96% confidence
Finding
The script sends reminder content containing personal data such as names and birthdays through email, but there is no explicit user warning, consent flow, or minimization of sensitive fields. Because this skill processes identity-derived birthday data, external transmission raises privacy and compliance risks if recipients or infrastructure are misconfigured.

Natural-Language Policy Violations

Medium
Confidence
95% confidence
Finding
The script description, CLI help text, and runtime messages are all fixed in Chinese, and there is no option to choose another language or locale. Under the stated policy, forcing a specific language without user opt-in is a natural-language policy violation.

Context-Inappropriate Capability

Medium
Confidence
90% confidence
Finding
The code resolves SMTP settings and credentials from environment variables and can send birthday reminder content by email, even though this networked credentialed capability is not reflected in the skill description. This increases risk because operators may not expect the skill to use secrets or transmit personal data off-host.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
The script sends reminder messages containing personal data over email and webhook channels without any explicit user warning, consent flow, or privacy guardrails. Because birthday records may include names, birth dates, and age information derived from ID cards, external transmission can cause unintended disclosure to third parties or untrusted endpoints.

Description-Behavior Mismatch

Medium
Confidence
94% confidence
Finding
The skill’s stated purpose is birthday reminder management, but it also supports outbound webhook delivery to arbitrary URLs. That creates an unexpected exfiltration path for personal data such as names, birthdays, reminder timing, and inferred ages, especially if configuration is modified or supplied by another component.

Missing User Warnings

Low
Confidence
82% confidence
Finding
The skill recommends creating a daily automation that continuously checks birthday data and may trigger notifications, but it does not clearly warn that this establishes ongoing processing of personal data and potentially repeated outbound messaging. In practice this can lead to silent background handling of PII, accidental notification spam, or deployment of recurring tasks without adequate user consent or review.

Natural-Language Policy Violations

Low
Confidence
95% confidence
Finding
The config hard-codes the email subject as "生日提醒", which imposes a specific language in user-facing output. There is no indication in this file that the language is configurable, optional, or justified as a region-specific requirement.

Natural-Language Policy Violations

Low
Confidence
84% confidence
Finding
The natural-language description is written only in Chinese and presents the skill as a Chinese lunar/solar birthday reminder, which may imply a fixed language/locale experience without any opt-in or alternative. Because this file is a manifest and SQP-3 applies to all file types, the description can be flagged as a possible language/locale policy issue.

Natural-Language Policy Violations

Low
Confidence
80% confidence
Finding
The skill documentation uses Chinese throughout and does not indicate that language selection is optional or that the skill is intentionally limited to a Chinese-speaking or region-specific context. Per the policy, forcing a specific language without user opt-in can be a natural-language policy violation.

Context-Inappropriate Capability

Low
Confidence
84% confidence
Finding
L34-L39 定义了多个 `${BIRTHDAY_SMTP_*}` 占位符,L47 进一步说明运行时会自动读取同名环境变量。这表明技能具备获取邮件服务器凭据并用于外发通知的能力,而 manifest 描述未提及凭据读取、邮件发送或外部通信能力。

Natural-Language Policy Violations

Low
Confidence
84% confidence
Finding
The natural-language description and CLI interface are entirely presented in Chinese, which effectively constrains use to a specific language without any opt-in or alternative locale path. Under the stated policy, forcing a language without user choice can be a locale-policy violation unless clearly justified as region-specific.

Missing User Warnings

Low
Confidence
84% confidence
Finding
The default notification template references SMTP username and password environment variables, and later resolves them for authentication. The file does not include any comment, docstring, or user-facing notice explaining that sensitive credentials are read from the environment for outbound notifications.

Static analysis

Detected: suspicious.dangerous_exec

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
scripts/birthday_manager.js:304