Back to skill

Security audit

Remind Myself

Security checks for vulnerabilities and agentic risk

Overview

This reminder skill is mostly coherent, but its documented shell execution pattern can turn crafted reminder text into arbitrary local commands.

Review before installing. This skill should only be used if you are comfortable sending reminder text to Telegram and storing a Telegram chat ID in the expected OpenClaw workspace file. The command-injection issue should be fixed before use by invoking the script with structured arguments or robust escaping rather than interpolating reminder content into a shell command string; absolute-time handling should also confirm the user's timezone.

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

Error
Location
SKILL.md:55
Finding

Shell Command Injection Through Unescaped Reminder Parameters

Content
View full analysis

Vulnerability Details

File Location: SKILL.md, lines 55–60
Vulnerability Type: Shell command injection through unsafe command construction
Risk Level: High

Vulnerable Code

json
{
  "tool": "exec",
  "command": "bash {baseDir}/scripts/remind.sh \"<when>\" \"<text>\""
}

Technical Analysis

The documented execution workflow inserts the user-derived when and text values directly into a shell command string. Placing these values inside double quotes does not safely escape embedded quotation marks, command substitutions, backticks, or other shell syntax.

For example, crafted reminder text conceptually shaped like the following can terminate the quoted argument and append another command:

text
legitimate reminder"; id; #

This would produce a command equivalent to:

bash
bash {baseDir}/scripts/remind.sh "20m" "legitimate reminder"; id; #"

The shell executes the injected command separately from remind.sh. Although scripts/remind.sh correctly quotes the arguments it receives, that protection applies only after shell parsing. It therefore cannot prevent injection occurring while the outer command string is being constructed and parsed.

The confirmation step reduces accidental execution but does not neutralize malicious shell syntax. A user may confirm crafted input without being shown the exact shell representation, and reminder content could also originate from untrusted text processed by the Agent.

Attack Path

  1. An attacker supplies reminder text or a time value containing an embedded quotation mark and shell syntax.
  2. The Agent parses the attacker-controlled value and asks for confirmation.
  3. The reminder request is confirmed.
  4. The Agent substitutes the value into the exec command template.
  5. The shell interprets the injected syntax before remind.sh starts.
  6. The attacker-supplied command executes with the same operating-sy ...[truncated 902 chars]
Remediation
View remediation

Remediation Suggestions

  1. Replace the shell command string with a structured process invocation that accepts an argument array, ensuring when and text are passed as literal arguments without shell interpretation. Conceptually:

    text
    executable: bash
    arguments:
      - {baseDir}/scripts/remind.sh
      - <when>
      - <text>
    
  2. If the execution interface cannot avoid a shell, do not interpolate reminder text directly. Transfer it through standard input or encode it using a non-executable representation such as Base64, then decode it inside the script.

  3. Apply strict allowlist validation to when. Relative durations should match a constrained expression such as digits followed by an approved unit. Absolute values should be parsed and regenerated as valid ISO 8601 timestamps rather than passed through verbatim.

  4. Treat reminder text as arbitrary data. Do not attempt to secure it using double quotes alone. If shell construction is unavoidable, use a well-tested shell-escaping routine that produces one safe argument rather than manually replacing selected characters.

  5. Display the normalized reminder values during confirmation and reject control characters, embedded newlines, or unexpected binary data.

  6. Add regression tests using payloads containing quotation marks, semicolons, command substitution syntax, backticks, newlines, and shell redirection. Verify that every payload reaches remind.sh as one literal argument and that no secondary command executes.

Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (6)

Behavior Manipulation

Medium
Category
Prompt Injection
Confidence
70% confidence
Finding

Subtle instructions detected that may alter agent decision-making or introduce hidden biases.

Content

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

md
---
name: remind-myself
description: "Set a one-shot reminder delivered via Telegram at a specific time or after a duration. Use when the user asks to be reminded of something, set an alarm, or schedule a future notification. Always use this skill instead of the cron tool directly — it handles chat ID resolution and delivery."
metadata: {"openclaw":{"requires":{"bins":["openclaw"]}}}
---

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The description says to use this skill whenever the user asks to be reminded of something, set an alarm, or schedule a future notification, which is broad natural language likely to overlap with many ordinary requests. It does not provide explicit exclusion conditions or narrow trigger constraints beyond the general task category.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The skill hardcodes Europe/Paris for absolute-time conversion without obtaining user consent or deriving timezone from user settings. This can cause reminders to be scheduled at the wrong real-world time, which is especially risky for time-sensitive tasks such as medication, travel, or meetings.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The script automatically resolves a Telegram chat ID from a local file and sends the reminder text to Telegram, which is an external service, without any explicit confirmation or warning at the point of transmission. Because reminder text may contain sensitive personal data, this creates a real privacy and data-handling risk, especially if the user does not realize the skill will exfiltrate content off-host or if the TOOLS.md chat ID is stale or belongs to the wrong recipient.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
93% confidence
Finding

This markdown file contains natural-language content specifying that prompts and examples were made English-only. Under the policy rule, forcing a specific language without offering user choice or documenting a justified locale constraint is a violation.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
96% confidence
Finding

The README describes reminder scheduling and Telegram delivery, but it does not clearly warn that the skill depends on storing and using the user's Telegram chat ID from a local configuration file. This can lead users to invoke the skill without understanding the privacy implications or the dependency on personally identifying messaging metadata, increasing the risk of unintended disclosure or misdelivery.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.