Back to skill

Security audit

Casual Cron

Security checks for vulnerabilities and agentic risk

Overview

This skill appears to create scheduled reminders/messages as advertised, with no evidence of hidden exfiltration or destructive behavior.

Install only if you want the agent to create OpenClaw cron jobs that can send messages to channels such as Telegram, Slack, Discord, WhatsApp, or Signal. Review each parsed schedule before approving it, especially recurring jobs and destinations, because those jobs can continue running until removed.

Vulnerability Patterns
  • 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
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
Vulnerability Patterns
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (33)

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
100% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · skills/casual-cron/test/test_cron_builder.py (reported line 235)May include surrounding context.

python
class TestShellEscaping(unittest.TestCase):
    def test_name_with_semicolon(self):
        parsed = parse('daily reminder at 8am')
        parsed['name'] = 'test; rm -rf /'
        cmd = build_command(parsed)
        # shlex.quote wraps in single quotes — semicolon is safely quoted
        self.assertIn("'test; rm -rf /'", cmd)

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
100% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · skills/casual-cron/test/test_cron_builder.py (reported line 238)May include surrounding context.

python
class TestShellEscaping(unittest.TestCase):
    def test_name_with_semicolon(self):
        parsed = parse('daily reminder at 8am')
        parsed['name'] = 'test; rm -rf /'
        cmd = build_command(parsed)
        # shlex.quote wraps in single quotes — semicolon is safely quoted
        self.assertIn("'test; rm -rf /'", cmd)

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
100% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · skills/casual-cron/test/test_cron_builder.py (reported line 240)May include surrounding context.

python
class TestShellEscaping(unittest.TestCase):
    def test_name_with_semicolon(self):
        parsed = parse('daily reminder at 8am')
        parsed['name'] = 'test; rm -rf /'
        cmd = build_command(parsed)
        # shlex.quote wraps in single quotes — semicolon is safely quoted
        self.assertIn("'test; rm -rf /'", cmd)

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
100% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · test/test_cron_builder.py (reported line 243)May include surrounding context.

python
class TestShellEscaping(unittest.TestCase):
    def test_name_with_semicolon(self):
        parsed = parse('daily reminder at 8am')
        parsed['name'] = 'test; rm -rf /'
        cmd = build_command(parsed)
        # shlex.quote wraps in single quotes — semicolon is safely quoted
        self.assertIn("'test; rm -rf /'", cmd)

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
100% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · test/test_cron_builder.py (reported line 246)May include surrounding context.

python
class TestShellEscaping(unittest.TestCase):
    def test_name_with_semicolon(self):
        parsed = parse('daily reminder at 8am')
        parsed['name'] = 'test; rm -rf /'
        cmd = build_command(parsed)
        # shlex.quote wraps in single quotes — semicolon is safely quoted
        self.assertIn("'test; rm -rf /'", cmd)

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
100% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · test/test_cron_builder.py (reported line 248)May include surrounding context.

python
class TestShellEscaping(unittest.TestCase):
    def test_name_with_semicolon(self):
        parsed = parse('daily reminder at 8am')
        parsed['name'] = 'test; rm -rf /'
        cmd = build_command(parsed)
        # shlex.quote wraps in single quotes — semicolon is safely quoted
        self.assertIn("'test; rm -rf /'", cmd)

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
95% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · skills/casual-cron/test/test_cron_builder.py (reported line 235)May include surrounding context.

python
class TestShellEscaping(unittest.TestCase):
    def test_name_with_semicolon(self):
        parsed = parse('daily reminder at 8am')
        parsed['name'] = 'test; rm -rf /'
        cmd = build_command(parsed)
        # shlex.quote wraps in single quotes — semicolon is safely quoted
        self.assertIn("'test; rm -rf /'", cmd)

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
95% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · test/test_cron_builder.py (reported line 243)May include surrounding context.

python
class TestShellEscaping(unittest.TestCase):
    def test_name_with_semicolon(self):
        parsed = parse('daily reminder at 8am')
        parsed['name'] = 'test; rm -rf /'
        cmd = build_command(parsed)
        # shlex.quote wraps in single quotes — semicolon is safely quoted
        self.assertIn("'test; rm -rf /'", cmd)

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
100% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · skills/casual-cron/test/test_cron_builder.py (reported line 235)May include surrounding context.

python
class TestShellEscaping(unittest.TestCase):
    def test_name_with_semicolon(self):
        parsed = parse('daily reminder at 8am')
        parsed['name'] = 'test; rm -rf /'
        cmd = build_command(parsed)
        # shlex.quote wraps in single quotes — semicolon is safely quoted
        self.assertIn("'test; rm -rf /'", cmd)

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
100% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · test/test_cron_builder.py (reported line 243)May include surrounding context.

python
class TestShellEscaping(unittest.TestCase):
    def test_name_with_semicolon(self):
        parsed = parse('daily reminder at 8am')
        parsed['name'] = 'test; rm -rf /'
        cmd = build_command(parsed)
        # shlex.quote wraps in single quotes — semicolon is safely quoted
        self.assertIn("'test; rm -rf /'", cmd)

Chaining Abuse

High
Category
Tool Misuse
Confidence
75% confidence
Finding

Tool calls are chained to bypass individual safety checks or escalate capabilities beyond what any single tool call would allow.

Content

Scanner excerpt · skills/casual-cron/test/test_cron_builder.py (reported line 235)May include surrounding context.

python
class TestShellEscaping(unittest.TestCase):
    def test_name_with_semicolon(self):
        parsed = parse('daily reminder at 8am')
        parsed['name'] = 'test; rm -rf /'
        cmd = build_command(parsed)
        # shlex.quote wraps in single quotes — semicolon is safely quoted
        self.assertIn("'test; rm -rf /'", cmd)

Chaining Abuse

High
Category
Tool Misuse
Confidence
75% confidence
Finding

Tool calls are chained to bypass individual safety checks or escalate capabilities beyond what any single tool call would allow.

Content

Scanner excerpt · skills/casual-cron/test/test_cron_builder.py (reported line 238)May include surrounding context.

python
class TestShellEscaping(unittest.TestCase):
    def test_name_with_semicolon(self):
        parsed = parse('daily reminder at 8am')
        parsed['name'] = 'test; rm -rf /'
        cmd = build_command(parsed)
        # shlex.quote wraps in single quotes — semicolon is safely quoted
        self.assertIn("'test; rm -rf /'", cmd)

Chaining Abuse

High
Category
Tool Misuse
Confidence
75% confidence
Finding

Tool calls are chained to bypass individual safety checks or escalate capabilities beyond what any single tool call would allow.

Content

Scanner excerpt · skills/casual-cron/test/test_cron_builder.py (reported line 240)May include surrounding context.

python
class TestShellEscaping(unittest.TestCase):
    def test_name_with_semicolon(self):
        parsed = parse('daily reminder at 8am')
        parsed['name'] = 'test; rm -rf /'
        cmd = build_command(parsed)
        # shlex.quote wraps in single quotes — semicolon is safely quoted
        self.assertIn("'test; rm -rf /'", cmd)

Chaining Abuse

High
Category
Tool Misuse
Confidence
75% confidence
Finding

Tool calls are chained to bypass individual safety checks or escalate capabilities beyond what any single tool call would allow.

Content

Scanner excerpt · test/test_cron_builder.py (reported line 243)May include surrounding context.

python
class TestShellEscaping(unittest.TestCase):
    def test_name_with_semicolon(self):
        parsed = parse('daily reminder at 8am')
        parsed['name'] = 'test; rm -rf /'
        cmd = build_command(parsed)
        # shlex.quote wraps in single quotes — semicolon is safely quoted
        self.assertIn("'test; rm -rf /'", cmd)

Chaining Abuse

High
Category
Tool Misuse
Confidence
75% confidence
Finding

Tool calls are chained to bypass individual safety checks or escalate capabilities beyond what any single tool call would allow.

Content

Scanner excerpt · test/test_cron_builder.py (reported line 246)May include surrounding context.

python
class TestShellEscaping(unittest.TestCase):
    def test_name_with_semicolon(self):
        parsed = parse('daily reminder at 8am')
        parsed['name'] = 'test; rm -rf /'
        cmd = build_command(parsed)
        # shlex.quote wraps in single quotes — semicolon is safely quoted
        self.assertIn("'test; rm -rf /'", cmd)

Chaining Abuse

High
Category
Tool Misuse
Confidence
75% confidence
Finding

Tool calls are chained to bypass individual safety checks or escalate capabilities beyond what any single tool call would allow.

Content

Scanner excerpt · test/test_cron_builder.py (reported line 248)May include surrounding context.

python
class TestShellEscaping(unittest.TestCase):
    def test_name_with_semicolon(self):
        parsed = parse('daily reminder at 8am')
        parsed['name'] = 'test; rm -rf /'
        cmd = build_command(parsed)
        # shlex.quote wraps in single quotes — semicolon is safely quoted
        self.assertIn("'test; rm -rf /'", cmd)

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
95% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · skills/casual-cron/test/test_cron_builder.py (reported line 238)May include surrounding context.

python
parsed['name'] = 'test; rm -rf /'
        cmd = build_command(parsed)
        # shlex.quote wraps in single quotes — semicolon is safely quoted
        self.assertIn("'test; rm -rf /'", cmd)
        # Verify it's passed as --name value (not bare)
        self.assertIn("--name 'test; rm -rf /'", cmd)

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
95% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · skills/casual-cron/test/test_cron_builder.py (reported line 240)May include surrounding context.

python
parsed['name'] = 'test; rm -rf /'
        cmd = build_command(parsed)
        # shlex.quote wraps in single quotes — semicolon is safely quoted
        self.assertIn("'test; rm -rf /'", cmd)
        # Verify it's passed as --name value (not bare)
        self.assertIn("--name 'test; rm -rf /'", cmd)

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
95% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · test/test_cron_builder.py (reported line 246)May include surrounding context.

python
parsed['name'] = 'test; rm -rf /'
        cmd = build_command(parsed)
        # shlex.quote wraps in single quotes — semicolon is safely quoted
        self.assertIn("'test; rm -rf /'", cmd)
        # Verify it's passed as --name value (not bare)
        self.assertIn("--name 'test; rm -rf /'", cmd)

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
95% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · test/test_cron_builder.py (reported line 248)May include surrounding context.

python
parsed['name'] = 'test; rm -rf /'
        cmd = build_command(parsed)
        # shlex.quote wraps in single quotes — semicolon is safely quoted
        self.assertIn("'test; rm -rf /'", cmd)
        # Verify it's passed as --name value (not bare)
        self.assertIn("--name 'test; rm -rf /'", cmd)

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
100% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · skills/casual-cron/test/test_cron_builder.py (reported line 238)May include surrounding context.

python
parsed['name'] = 'test; rm -rf /'
        cmd = build_command(parsed)
        # shlex.quote wraps in single quotes — semicolon is safely quoted
        self.assertIn("'test; rm -rf /'", cmd)
        # Verify it's passed as --name value (not bare)
        self.assertIn("--name 'test; rm -rf /'", cmd)

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
100% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · test/test_cron_builder.py (reported line 246)May include surrounding context.

python
parsed['name'] = 'test; rm -rf /'
        cmd = build_command(parsed)
        # shlex.quote wraps in single quotes — semicolon is safely quoted
        self.assertIn("'test; rm -rf /'", cmd)
        # Verify it's passed as --name value (not bare)
        self.assertIn("--name 'test; rm -rf /'", cmd)

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
100% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · skills/casual-cron/test/test_cron_builder.py (reported line 240)May include surrounding context.

python
# shlex.quote wraps in single quotes — semicolon is safely quoted
        self.assertIn("'test; rm -rf /'", cmd)
        # Verify it's passed as --name value (not bare)
        self.assertIn("--name 'test; rm -rf /'", cmd)

    def test_name_with_single_quote(self):
        parsed = parse('daily reminder at 8am')

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
100% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · test/test_cron_builder.py (reported line 248)May include surrounding context.

python
# shlex.quote wraps in single quotes — semicolon is safely quoted
        self.assertIn("'test; rm -rf /'", cmd)
        # Verify it's passed as --name value (not bare)
        self.assertIn("--name 'test; rm -rf /'", cmd)

    def test_name_with_single_quote(self):
        parsed = parse('daily reminder at 8am')

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
70% confidence
Finding

Without declared permissions the skill's intent is opaque and cannot be validated.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.