Back to skill

Security audit

Skill Openclaw Library Monitor

Security checks for vulnerabilities and agentic risk

Overview

This skill appears purpose-built for library book monitoring, but it should be reviewed because it combines shell, filesystem, network, scheduled monitoring, and plaintext SMTP credential handling with broad activation triggers and weak install dependency controls.

Install only if you are comfortable with a skill that can run local shell commands, write a local book list, make network requests to Shenzhen Library, optionally run continuously, and use email credentials for SMTP notifications. Prefer pinning installer and Python dependency versions, avoid putting a real email account password directly in `config.yaml`, use an app-specific SMTP password or environment-based secret, and invoke state-changing actions only with clear book IDs and explicit intent.

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

T08 · Insecure Dependencies

Warning
Location
requirements.txt:1
Finding

Mutable and Unpinned Third-Party Dependencies

Content
View full analysis
=2.31.0 beautifulsoup4>=4.12.0 lxml>=4.9.0 schedule>=1.2.0 python-dotenv>=1.0.0 pyyaml>=6.0 ``` The README also directs users to execute a mutable version of external installation tooling: ```bash npx clawhub@latest install openclaw-community/skill-library-book-monitor ``` The Skill setup instructions install all dependencies without hashes or a lock file: ```bash pip install -r requirements.txt ``` ### Technical Analysis All Python requirements use lower-bound constraints without upper bounds, exact versions, or integrity hashes. Consequently, an installation performed after the audit may resolve to dependency versions that were not reviewed. The `npx ...@latest` instruction similarly executes a mutable release of an external package. The audited source imports `requests`, `schedule`, and `yaml`. No use of `beautifulsoup4`, `lxml`, or `python-dotenv` was found, so those packages unnecessarily expand the dependency and installation attack surface. No evidence was found that the currently named packages are typosquatted or malicious. The vulnerability is the unsafe dependency-resolution policy, not confirmed malicious behavior by any current dependency. ### Attack Path 1. An attacker compromises a dependency publisher account, package registry entry, distribution artifact, or a future release of the mutable `clawhub` installer. 2. The user follows the documented `npx ...@latest` or `pip install -r requirements.txt` command. 3. The package manager retrieves a version released after this Skill was reviewed. 4. Malicious package installation or import-time code executes with the privileges of the user running the installer or Skill. 5. That code ...[truncated 810 chars]
Remediation
View remediation
schedule== PyYAML== ``` 2. Generate a reproducible lock file and require package hashes, such as with `pip-compile --generate-hashes`. 3. Install with hash enforcement: ```bash pip install --require-hashes -r requirements.lock ``` 4. Remove `beautifulsoup4`, `lxml`, and `python-dotenv` unless they are required by code that is added and audited. 5. Replace `npx clawhub@latest` with a specific reviewed version. 6. Verify package provenance and integrity in CI, and use automated dependency vulnerability scanning. 7. Review and deliberately update pinned versions rather than allowing installations to resolve arbitrary future releases. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
notifier.py:50
Finding

SMTP Credential Stored in Plaintext Configuration

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • 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
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (30)

Lp1

High
Category
MCP Least Privilege
Confidence
75% confidence
Finding

The skill uses 'file_read' capability that is not listed in its permissions. This may indicate deceptive intent or missing permission declarations.

Content

No source excerpt is available for this finding.

Lp1

High
Category
MCP Least Privilege
Confidence
75% confidence
Finding

The skill uses 'file_write' capability that is not listed in its permissions. This may indicate deceptive intent or missing permission declarations.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
91% confidence
Finding

The README instructs users to execute npx clawhub@latest install ..., which fetches and runs the latest remote package without version pinning. This creates a supply-chain risk: if the package is compromised or a breaking/malicious version is published, users may execute unreviewed code during installation.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The documentation shows an email configuration containing SMTP username/password fields but does not warn users about secure secret storage, least-privilege app passwords, or the fact that notification contents are transmitted to an external service. In a skill with network, filesystem, and shell permissions, this omission increases the chance that users place long-lived credentials in plaintext config files that could be exposed or misused.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The trigger set contains several generic terms (library, book monitor, book availability, 借书, 图书馆) without boundaries, examples, or exclusion rules. In a skill that can execute shell commands and write local state, ambiguous activation increases the chance of unintended execution from benign user discussion, especially in multilingual contexts.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The trigger phrase library is extremely broad and can activate during ordinary conversation unrelated to this skill. Because the skill has shell, filesystem, and network permissions and its entrypoint directs immediate command execution, accidental invocation could cause unintended local actions or monitoring state changes without sufficiently clear user intent.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The user-facing description focuses on library monitoring but does not clearly warn that the skill will execute shell commands and persist data to local files such as book_list.json. This reduces informed consent and makes accidental or surprising side effects more likely when the skill is invoked.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The trigger phrase on line 17 is a very generic term likely to appear in ordinary user requests unrelated to this skill. Because the skill has network, filesystem, and shell permissions, broad activation increases the chance of unintended invocation and execution with elevated capabilities, creating a meaningful security boundary issue.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The trigger phrases on lines 18–21 are broadly scoped and ambiguously worded, so common requests about books, libraries, or borrowing could activate this skill unintentionally. In this context, accidental activation is more dangerous because the skill is authorized for shell, filesystem, and network access, which can turn a routing mistake into unauthorized external requests or local actions.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The natural-language text in docstrings and comments is consistently Chinese, with no indication that the skill supports other languages or that Chinese-only operation is required. This can violate language or locale policy when a skill implicitly forces a specific language without user choice or documented regional scope.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The code hard-codes "Accept-Language: zh-CN,zh;q=0.9,en;q=0.8", which imposes a specific locale preference on all requests. Under the policy, locale constraints should be user-selectable or clearly documented and justified; this file provides neither.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

This file presents its description and CLI help/messages entirely in Chinese, which imposes a specific language on users without opt-in. The stated policy flags language or locale constraints when the skill does not offer a choice or clearly justify that it is region-specific.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

This code uses Chinese-only user-facing text throughout docstrings, console output, email subject lines, and message bodies. The file does not offer any language selection or document that the skill is intentionally limited to a Chinese-speaking or region-specific context, which creates a locale policy violation under the stated rules.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The trigger phrase "library" is very broad and likely to match many unrelated user requests, which can cause the skill to activate unexpectedly. Because this skill has network, filesystem, and shell permissions, unintended activation increases the risk of unnecessary privileged execution and surprise actions in contexts where the user did not intend to invoke this skill.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
80% confidence
Finding

The natural-language description presents the skill as monitoring Shenzhen Library specifically, and the usage/configuration examples reinforce that locale-specific scope. The README does not explicitly state that the skill is region-specific by design or offer a user opt-in/choice regarding locale, which can violate language/locale policy requirements.

Content

No source excerpt is available for this finding.

Lp4

Low
Category
MCP Least Privilege
Confidence
65% confidence
Finding

Declared permissions with no matching code capability may indicate removed functionality or pre-staging for future abuse.

Content

No source excerpt is available for this finding.

Overly Broad Trigger

Low
Category
Trigger Abuse
Confidence
86% confidence
Finding

The trigger 借书 is only two characters and broadly means borrowing books, making it likely to match casual Chinese-language discussion. On its own this is low severity, but in combination with shell and filesystem permissions it raises the risk of accidental activation and unintended command execution.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
84% confidence
Finding

The _save_books method writes the full book collection to disk, replacing the contents of book_list.json. Although file persistence is part of this class's functionality, there is no user-facing disclosure such as logging, a warning comment, or confirmation around this data-modifying operation.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
79% confidence
Finding

This file's natural-language content in docstrings and messages is entirely Chinese, including user-visible exception text. Under the policy, forcing a specific language can be a locale violation unless the skill offers choice or clearly documents a justified region-specific constraint, which is not present here.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
97% confidence
Finding

The dependency specifier uses a lower bound only, which makes builds non-reproducible and can cause the skill to install unexpected newer releases, including vulnerable or breaking versions. In a skill with network, filesystem, and shell permissions, supply-chain uncertainty increases risk because any compromised dependency executes with elevated local capabilities.

Content

Scanner excerpt · requirements.txt (reported line 1)May include surrounding context.

text
requests>=2.31.0
beautifulsoup4>=4.12.0
lxml>=4.9.0
schedule>=1.2.0

Unverifiable Dependency: requests has 16 known advisory(ies) (CVE-2014-1830 (Exposure of Sensitive Information to an Unauthorized Actor in Requests); CVE-2024-47081 (Requests vulnerable to .netrc credentials leak via malicious URLs); CVE-2024-35195 (Requests `Session` object does not verify requests after making first request wi) +13 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
93% confidence
Finding

The manifest does not pin requests, and the package has multiple published advisories across versions, so there is no way to verify that installs will avoid affected releases. In a network-enabled skill, a vulnerable HTTP client can expose credentials, weaken TLS assumptions, or mishandle attacker-controlled URLs.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
97% confidence
Finding

Using beautifulsoup4>=4.12.0 allows any future release to be installed, preventing reproducible builds and weakening supply-chain control. While this package is commonly safe, the lack of pinning still creates avoidable exposure to malicious or incompatible upstream releases.

Content

Scanner excerpt · requirements.txt (reported line 2)May include surrounding context.

text
requests>=2.31.0
beautifulsoup4>=4.12.0
lxml>=4.9.0
schedule>=1.2.0
python-dotenv>=1.0.0

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
98% confidence
Finding

The unpinned lxml dependency is more concerning because lxml has a history of security advisories and native-code parsing complexity. Allowing arbitrary newer versions to resolve at install time can introduce vulnerable or malicious releases into a skill that processes remote content from library websites.

Content

Scanner excerpt · requirements.txt (reported line 3)May include surrounding context.

text
requests>=2.31.0
beautifulsoup4>=4.12.0
lxml>=4.9.0
schedule>=1.2.0
python-dotenv>=1.0.0
pyyaml>=6.0

Unverifiable Dependency: lxml has 14 known advisory(ies) (CVE-2021-43818 (lxml's HTML Cleaner allows crafted and SVG embedded scripts to pass through); CVE-2014-3146 (lxml Cross-site Scripting Via Control Characters); CVE-2021-28957 (lxml vulnerable to Cross-Site Scripting ) +11 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
95% confidence
Finding

lxml has numerous historical advisories, and the lack of version pinning makes it impossible to determine whether a safe version will be installed. Since this skill likely parses remote HTML/XML from library systems, parser vulnerabilities can become more relevant than in a purely local application.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
96% confidence
Finding

schedule>=1.2.0 is not pinned, so future installs may pull different versions with unreviewed behavior changes. This is a supply-chain hygiene issue rather than an immediate exploitable bug, but it still increases operational and security uncertainty.

Content

Scanner excerpt · requirements.txt (reported line 4)May include surrounding context.

text
requests>=2.31.0
beautifulsoup4>=4.12.0
lxml>=4.9.0
schedule>=1.2.0
python-dotenv>=1.0.0
pyyaml>=6.0