T09 · Insecure Skill Coding Practices
- Location
notifier.py:84- Finding
Documented Notification Opt-Out Is Not Enforced
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is a coherent library availability monitor, but it needs Review because broad triggers and permissions combine with weak email notification controls that can expose reading-interest data.
Review before installing. Use it only if you are comfortable with a skill that can run shell commands, read/write local files, contact Shenzhen Library, and optionally send book details through your SMTP provider. Do not place a primary email password in config.yaml; prefer a dedicated app password or remove email from methods. Be aware that setting notification.enabled: false does not stop notifier initialization in this version if email remains configured.
notifier.py:84Documented Notification Opt-Out Is Not Enforced
notifier.py:45SMTP Credential Is Stored in Plaintext Configuration
requirements.txt:1Unused and Loosely Constrained Dependencies Expand the Supply-Chain Surface
_meta.json:24Declared Agent Tools and Permissions Exceed Minimum Functional Requirements
The skill uses 'file_read' capability that is not listed in its permissions. This may indicate deceptive intent or missing permission declarations.
The skill uses 'file_write' capability that is not listed in its permissions. This may indicate deceptive intent or missing permission declarations.
The README instructs users to run npx clawhub@latest install ..., which pulls and executes the latest published package at install time rather than a pinned, reviewed version. This creates a supply-chain risk: if the package or one of its dependencies is compromised, users may execute attacker-controlled code during installation, and the skill's declared shell/network/filesystem context makes such execution more consequential.
The README includes plaintext SMTP credential configuration, including an email password field, without warning users about secret handling, use of app-specific passwords, or the risk of committing credentials to disk or source control. In practice, users often copy this into config.yaml, which can lead to credential leakage, unauthorized mailbox access, and unintended transmission of reading activity or personal data to external email infrastructure.
The trigger set as a whole does not sufficiently constrain when the skill should activate, especially for generic book-availability or library-related requests. In a skill with elevated permissions, ambiguous activation expands the attack surface by increasing accidental invocation and execution of shell-backed workflows.
The trigger phrase library is extremely broad and can activate during ordinary conversation unrelated to monitoring books. Overbroad activation can cause the agent to invoke a skill with network, filesystem, and shell permissions in contexts where the user did not clearly intend it, increasing the chance of unintended actions or data access.
The skill description and usage notes do not clearly warn users that monitored book data is stored locally and that email notifications require sensitive SMTP credentials. This creates a transparency and privacy risk: users may unknowingly persist reading-interest data on disk or configure credentials without understanding how they are handled.
The trigger list contains very broad phrases such as "library", "图书馆", and "借书" that are likely to match ordinary user requests unrelated to this specific monitoring skill. Because the skill has network, filesystem, and shell permissions, accidental activation expands the chance that a general conversation is routed into a privileged skill context, increasing misuse and unexpected side effects.
This file contains natural-language docstrings and comments exclusively in Chinese, including user-relevant descriptions such as class and method purposes. Under the policy, forcing a specific language without offering a language or locale choice is a natural-language policy violation.
The file's user-facing natural-language strings in docstrings and error messages are exclusively in Chinese, with no indication that the skill offers a language choice or is explicitly limited to a Chinese-language context. Under the stated policy, forcing a specific language without user opt-in can constitute a locale/language policy violation.
The scraper hard-codes Accept-Language: zh-CN,zh;q=0.9,en;q=0.8, which imposes a specific locale preference in network requests. Under the policy, forcing a language/locale without user opt-in or clear documented justification is a natural-language policy violation.
The file's docstrings, status messages, email subject, and formatted notification content are all hard-coded in Chinese. Because there is no user opt-in, fallback, or configurable locale selection, this creates a language-policy issue if the skill is expected to operate in general contexts.
The trigger phrase "library" is so broad that it can match many ordinary user requests unrelated to this skill, causing the agent to invoke a network/filesystem/shell-capable skill in unintended contexts. Because this skill has elevated permissions, accidental activation increases the chance of unnecessary external requests or other side effects beyond the user's actual intent.
The trigger phrase "图书馆" is similarly broad and can activate on many generic Chinese-language requests about libraries, not specifically book availability monitoring. In a skill with network, filesystem, and shell permissions, ambiguous triggering expands the attack surface by making unintended execution more likely during normal conversation.
The class docstring is written only in Chinese, and the file consistently presents user-facing messages in Chinese, indicating a fixed locale assumption. Under the policy, forcing a specific language without offering user choice or documenting a justified locale constraint is a natural-language policy violation.
Declared permissions with no matching code capability may indicate removed functionality or pre-staging for future abuse.
The trigger 借书 is very short and semantically broad, so it may match many normal Chinese-language borrowing discussions that are not requests to run this skill. While the direct impact is limited, unintended activation is still risky because the skill can invoke shell commands and access local/network resources.
This file includes a natural-language skill title in Chinese, but provides no indication that language selection is optional or that the skill is intentionally scoped to Chinese-speaking users. Under the policy, fixed language presentation without user opt-in can be a locale-policy concern.
This Python file contains natural-language descriptions, help text, examples, and user-facing output exclusively in Chinese. Under the policy criteria, forcing a specific language without offering the user a language choice or opt-in is a locale/language policy violation.
The manifest describes monitoring library book availability and notifying the user, but it does not explicitly scope notification channels to external email delivery. Implementing SMTP-based email sending introduces a broader outbound communication capability that is not clearly justified by the stated purpose alone.
The dependency specification for requests uses a lower-bound only constraint, which permits installation of many different future versions and makes builds non-reproducible. This increases supply-chain risk because a vulnerable or breaking version could be resolved at install time without review, especially in a skill with network permission that relies on HTTP interactions.
requests>=2.31.0
beautifulsoup4>=4.12.0
lxml>=4.9.0
schedule>=1.2.0
requests has multiple known advisories, and because the manifest does not pin an exact version, it is impossible to verify whether deployed installations are using a patched release. In a network-enabled skill that likely fetches library data over HTTP/HTTPS, an affected requests version could expose credentials or weaken transport security handling.
beautifulsoup4 is not pinned to an exact version, so dependency resolution may pull in different releases over time. While this is not directly exploitable by itself, it weakens build integrity and can introduce unreviewed changes or vulnerable transitive dependencies.
requests>=2.31.0
beautifulsoup4>=4.12.0
lxml>=4.9.0
schedule>=1.2.0
python-dotenv>=1.0.0
lxml is specified with only a minimum version, which allows unreviewed versions to be installed and makes it hard to determine exposure to known parser-related vulnerabilities. Because lxml processes structured content and this skill has network access, an unsafe resolved version could increase risk from malicious remote content.
requests>=2.31.0
beautifulsoup4>=4.12.0
lxml>=4.9.0
schedule>=1.2.0
python-dotenv>=1.0.0
pyyaml>=6.0
lxml has a history of security advisories, and the lack of exact version pinning means the actual installed version cannot be verified as patched. Since this skill appears to parse remote content from library systems, using an affected parser version could increase exposure to maliciously crafted HTML or XML.
No suspicious patterns detected.