Back to skill

Security audit

Clawwork Learning Checkin

Security checks for vulnerabilities and agentic risk

Overview

This skill is a disclosed workplace check-in wrapper, but it can run another local Python skill found through broad filesystem search without verifying that dependency.

Review before installing. This skill is not showing clear malicious behavior, but only use it if you trust the installed learning-checkin dependency and can verify the path it will run. Avoid environments where sibling skill directories or OPENCLAW_DIR can be influenced by untrusted users.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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)

T08 · Insecure Dependencies

Warning
Location
clawwork_checkin.py:262
Finding

Unverified Dependency Discovery and Execution

Content
View full analysis

Vulnerability Details

File Location: clawwork_checkin.py:262-275, 374-385, 500-511
Vulnerability Type: Unverified third-party dependency execution
Risk Level: Medium

Vulnerable Code

python
# Current directory (skill next to this one)
possible_paths.append(os.path.join(SCRIPT_DIR, "..", "learning-checkin"))
possible_paths.append(os.path.join(SCRIPT_DIR, "..", "learning_checkin"))

# Parent of parent
possible_paths.append(os.path.join(SCRIPT_DIR, "..", "..", "learning-checkin"))

# Look in active_skills
if "OPENCLAW_DIR" in os.environ:
    possible_paths.append(os.path.join(os.environ["OPENCLAW_DIR"], "active_skills", "learning-checkin"))

# Check if learning_checkin.py exists in any of these paths
for path in possible_paths:
    check_file = os.path.join(path, "learning_checkin.py")
    if os.path.exists(check_file):
        return True, path

The discovered dependency is executed by the checkin command:

python
checkin_script = os.path.join(path, "learning_checkin.py")
import subprocess

try:
    proc = subprocess.run(
        [sys.executable, checkin_script, "checkin"],
        capture_output=True,
        text=True,
        timeout=10,
        encoding="utf-8",
        errors="ignore"
    )

The same dependency is executed by the status command:

python
checkin_script = os.path.join(path, "learning_checkin.py")
import subprocess

try:
    proc = subprocess.run(
        [sys.executable, checkin_script, "status"],
        capture_output=True,
        text=True,
        timeout=10,
        encoding="utf-8",
        errors="ignore"
    )

Technical Analysis

The application considers any file named learning_checkin.py in one of several searched locations to be a trusted dependency. The only validation is os.path.exists; the code does not verify the file's cryptographic hash, signature, package identity, ownership, permissions, or provenance.

The search includes parent-relative directories and a location der ...[truncated 1811 chars]

Remediation
View remediation

Remediation Suggestions

  1. Resolve the dependency exclusively through a trusted skill registry or a single administrator-controlled installation root instead of probing parent directories.
  2. Canonicalize both the approved root and candidate path with os.path.realpath, then verify that the candidate remains inside the approved root.
  3. Pin an audited dependency version and validate a signed manifest or trusted cryptographic hash before every execution.
  4. Reject symbolic links and non-regular files. Where supported, verify that the dependency and its parent directories have trusted ownership and are not writable by untrusted users.
  5. Do not derive executable dependency locations directly from an untrusted environment variable. If OPENCLAW_DIR is required, validate it against trusted configuration established outside the skill process.
  6. Install the dependency only through an explicit, user-approved workflow that verifies package identity and provenance.
  7. Fail closed when validation cannot be completed; do not execute a candidate merely because its filename exists.
  8. Consider running the dependency in a restricted subprocess environment with minimized inherited variables, filesystem permissions, and network access.
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
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (13)

Anti-Refusal Statement

High
Category
Anti-Refusal
Confidence
70% confidence
Finding

Skill instructs the agent to never refuse or to always comply. Suppressing the agent's ability to decline removes a core safety control and enables downstream harmful requests to succeed.

Content

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

md
6. Show messages to user in their language

### Language
- Always respond in the language the user established
- Pass `user_language` to the LLM for message generation
- If unsure, default to English

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The README says only 'Use this skill for workplace check-in,' which describes a general purpose rather than clear activation criteria. Without explicit trigger phrases, scope boundaries, or negative examples, the skill could be invoked for loosely related everyday check-in requests.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
90% confidence
Finding

The skill instructs the agent to execute Python commands, read and write local files, and potentially install another skill, but it does not declare any explicit tool scope or permissions. This creates an authorization gap where a host may grant broader capabilities than users expect, increasing the risk of unintended shell or filesystem actions.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The trigger guidance uses broad examples like 'check in' or 'I'm done', which are ambiguous in normal conversation and may cause the agent to invoke the skill when the user did not intend a workplace check-in. Because invocation leads to shell execution and local state changes, accidental activation can produce unintended actions and data writes.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The implementation materially exceeds the declared behavior of a simple greeting/check-in skill by acting as a wrapper and dependency manager for another skill. This mismatch is dangerous because users and reviewers may grant trust based on the manifest while the code introduces hidden execution of an external component.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The skill's stated purpose is personalized greeting/check-in, but it delegates core behavior to another local skill discovered on disk and then executes it. That creates a trust-boundary problem: a malicious or replaced learning_checkin.py in one of the searched locations would run with the current user's privileges, turning this wrapper into an execution trampoline.

Content

No source excerpt is available for this finding.

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · clawwork_checkin.py (reported line 377)May include surrounding context.

python
import subprocess

        try:
            proc = subprocess.run(
                [sys.executable, checkin_script, "checkin"],
                capture_output=True,
                text=True,

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · clawwork_checkin.py (reported line 503)May include surrounding context.

python
import subprocess

        try:
            proc = subprocess.run(
                [sys.executable, checkin_script, "status"],
                capture_output=True,
                text=True,

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
86% confidence
Finding

The markdown documents that profile.json stores nickname and language and greetings.json stores message history, but it presents this as technical storage detail rather than a user-facing privacy warning. Because the skill persists personal preference data and recent interaction content, the description should explicitly disclose this behavior so users understand the privacy impact.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

The skill stores profile data and message history to local disk without any visible disclosure, consent flow, or retention notice. While the data is not highly sensitive by itself, silent persistence can expose personal preferences and usage patterns to other local users or backups and violates least-surprise expectations.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Low
Category
Not specified by scanner
Confidence
81% confidence
Finding

The code probes multiple filesystem locations and an environment variable to discover another skill unrelated to its advertised narrow function. This broadens the attack surface by letting external filesystem state or OPENCLAW_DIR influence what component is later trusted and executed.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
76% confidence
Finding

The check-in workflow executes another local script without explicit disclosure at the point of use. Even if the dependency is legitimate, hidden delegation reduces transparency and can conceal execution of an unreviewed or tampered component discovered from the filesystem.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
75% confidence
Finding

The status command also invokes an external local script without making that behavior obvious to the user. This is a transparency and trust issue because even a seemingly harmless status lookup causes execution of another component under the user's privileges.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.