T09 · Insecure Skill Coding Practices
- Location
zettelkasten.py:17- Finding
Unsanitized User Identifier Controls the Note Database Path
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is mostly a local note-taking tool, but it ships an unsafe publishing helper and weak file scoping that users should review before installing or running it.
Install only if you are comfortable with local note persistence and Chinese runtime commands. Do not run publish.sh from a directory containing private files; if publishing is needed, package only an explicit allowlist of skill files and avoid using raw credentials in a broad upload script. The note database should be moved to a dedicated protected directory and user IDs should be sanitized or hashed before this is treated as low-risk.
zettelkasten.py:17Unsanitized User Identifier Controls the Note Database Path
publish.sh:20Publishing Fallback Archives and Uploads the Entire Working Directory
The declared purpose is local Zettelkasten note-taking, but the analyzed behavior includes reading credentials from ~/.clawhub/credentials, creating archives of local files, and making authenticated external network requests to publish data. That mismatch is highly suspicious because it suggests covert data collection and exfiltration beyond the user-expected scope of the skill.
The documented trigger phrase 'Record Idea: [your idea content]' is broad and does not define clear boundaries, confirmation requirements, or channel restrictions before the skill captures and stores user-provided content. In an agent environment, overly permissive activation can cause unintended invocation, accidental data capture, or abuse through prompt injection-style phrasing embedded in normal conversation.
The README states that user ideas are automatically recorded and structured into notes, but it does not clearly warn users that their content will be stored. In a note-taking skill, users may enter sensitive personal thoughts, health details, work information, or intellectual property, so silent persistence creates a meaningful privacy and consent risk.
The skill advertises AI-generated expansions, relationship detection, and automatic retrieval of related concepts without explaining that user note content will be analyzed for inference and linkage. Because notes can contain highly personal or confidential material, undisclosed AI processing and semantic analysis increase privacy exposure beyond simple storage.
The skill declares no explicit tool scope even though analysis detected capabilities consistent with file reads, file writes, and shell access. For a note-taking skill, undeclared powerful capabilities reduce user visibility and consent, making misuse or accidental overreach more likely.
All visible prompts and usage instructions are presented in Chinese, including the required invocation phrase, with no indication that the skill is intentionally region-specific or that other languages are supported. This creates a language-policy concern because the skill imposes a specific locale on all users without opt-in.
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
echo "📦 正在安装 Zettelkasten 卡片盒笔记法..."
# 创建技能目录
mkdir -p ~/.openclaw/skills/zettelkasten
# 复制文件
cp zettelkasten.py ~/.openclaw/skills/zettelkasten/
The fallback path creates a tarball from the current directory using tar -czf ... . and uploads it to a remote API, which can unintentionally include sensitive local files such as dotfiles, credentials, build artifacts, or unrelated workspace contents. Because the script gives no explicit warning, file manifest, or exclusion list, a user may transmit more data than intended.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
# 尝试用API发布
echo "📤 Publishing via API..."
curl -X POST "https://api.clawhub.com/v1/skills" \
-H "Authorization: Bearer $(cat ~/.clawhub/credentials)" \
-F "slug=zettelkasten" \
-F "name=Zettelkasten - 卡片盒笔记法" \
The skill persists user-provided note content to a local JSON database automatically, but the command flow never informs the user that their text will be stored on disk. This creates a privacy and consent issue because users may enter sensitive personal thoughts, health-related notes, or ideas assuming the interaction is ephemeral.
The skill not only stores the original user content but also automatically generates and saves derivative AI suggestion cards tied to the user's note, again without explicit notice or consent. This expands the amount of persisted potentially sensitive data and may infer additional topics about the user beyond what they expected to store.
The command interface only recognizes Chinese trigger phrases such as "记录灵感:", "每日回顾", and "统计", and all responses are produced in Chinese. This imposes a specific language/locale without any visible opt-in or alternative, which matches the language-policy violation criteria.
The README instructions and examples are entirely in Chinese, which can amount to an implicit language constraint. There is no statement that the skill is Chinese-only, region-specific, or that users may choose another language.
The manifest name and description are entirely in Chinese, which suggests the skill may be presented in a fixed language without any stated opt-in or locale-specific justification. Under the policy rule, forcing a specific language can be a natural-language policy violation when no user choice is documented.
This shell script creates a directory under ~/.openclaw/skills and copies multiple files into it, which are user-visible filesystem modifications. While the script prints progress messages, it does not disclose that it will write into the user's home directory before doing so or ask for confirmation.
The script reads an authentication token directly from ~/.clawhub/credentials and injects it into a network request without notifying the user or validating file permissions. While this is a common automation pattern, it increases the risk of unintended credential use, accidental disclosure through debugging/process inspection, or use from an unexpected account context.
No suspicious patterns detected.