Back to skill

Security audit

Clawfeed Digest

Security checks for vulnerabilities and agentic risk

Overview

The skill’s core news-to-Obsidian function is coherent, but it also encourages recurring local writes and unverified third-party sync components with too little safety guidance.

Review before installing. Use a dedicated output folder, back up the Obsidian vault, avoid unattended cron until paths and overwrite behavior are understood, pin or verify dependencies, and do not install the optional BRAT/plugin/executable sync components unless you trust and verify those upstream projects.

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 (3)

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/fetch_clawfeed.py:35
Finding
Remote Digest Content Can Overwrite Existing Notes<![CDATA[ ## Vulnerability Details **File Location**: `scripts/fetch_clawfeed.py:35-55` **Vulnerability Type**: Untrusted file-content and filename collision handling **Risk Level**: Medium ### Vulnerable Code ```python content = digest["content"] date_match = re.search(r'(\d{4}-\d{2}-\d{2})', content) if date_match: date_str = date_match.group(1) else: date_str = datetime.now().strftime("%Y-%m-%d") if args.type == '4h': filename = f"{date_str}-4h.md" elif args.type == 'weekly': filename = f"周报-{date_str}.md" else: filename = f"{date_str}.md" file_path = os.path.join(ai_news_dir, filename) with open(file_path, "w", encoding="utf-8") as f: f.write(content) ``` ### Technical Analysis The application uses remotely supplied digest content to derive the output date and therefore the destination filename. Although the date regular expression limits the matched value to digits and hyphens and prevents direct path traversal, it does not establish that the date is trusted metadata or even a valid calendar date. The destination is opened in `w` mode. If a file with the generated name already exists, Python truncates and replaces it without confirmation. The filenames are predictable, such as `2026-09-11.md`, so a malicious or compromised upstream service can deliberately select a date that collides with an existing note. ### Attack Path 1. An attacker compromises the ClawFeed API or otherwise causes it to return attacker-controlled digest content. 2. The attacker inserts a date matching `YYYY-MM-DD` that corresponds to an existing note. 3. The script extracts that date and creates the predictable destination filename. 4. The script opens the existing file in `w` mode. 5. The existing note is truncated and replaced with attacker-controlled Markdown. ### Impact Assessment Exploitation does not grant operating-system privileges or arbitrary file-path selection because the filename format is constrained. However, it permits modification ...[truncated 381 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Derive the date from a trusted, structured API field rather than searching the digest body. 2. Parse and validate the value with `datetime.strptime(date_value, "%Y-%m-%d")`. 3. Refuse replacement by default by opening files with exclusive creation mode: ```python with open(file_path, "x", encoding="utf-8") as f: f.write(content) ``` 4. Add an explicit `--overwrite` option if replacement is a required feature. 5. Alternatively, generate unique filenames using a digest identifier or timestamp. 6. Resolve the final path and verify that it remains beneath the intended output directory before writing. 7. Consider writing to a temporary file and using an atomic rename after successful validation. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/fetch_clawfeed.py:9
Finding
Missing Resource Limits Permit Network, Memory, and Disk Exhaustion<![CDATA[ ## Vulnerability Details **File Location**: `scripts/fetch_clawfeed.py:9-16, 22, 33-55` **Vulnerability Type**: Unbounded network request and resource consumption **Risk Level**: Medium ### Vulnerable Code ```python parser.add_argument('--limit', '-l', type=int, default=1, help='获取数量') parser.add_argument('--offset', '-o', type=int, default=0, help='偏移量') api_url = f"https://clawfeed.kevinhe.io/api/digests?type={args.type}&limit={args.limit}&offset={args.offset}" r = requests.get(api_url) data = r.json() for digest in data: content = digest["content"] date_match = re.search(r'(\d{4}-\d{2}-\d{2})', content) if date_match: date_str = date_match.group(1) else: date_str = datetime.now().strftime("%Y-%m-%d") if args.type == '4h': filename = f"{date_str}-4h.md" elif args.type == 'weekly': filename = f"周报-{date_str}.md" else: filename = f"{date_str}.md" file_path = os.path.join(ai_news_dir, filename) with open(file_path, "w", encoding="utf-8") as f: f.write(content) ``` ### Technical Analysis The HTTP request has no connection or read timeout. A server that accepts the connection but responds slowly can therefore keep the process blocked for an indefinite period. The response is loaded and parsed as a complete JSON document through `r.json()`, with no response-size ceiling. Digest content is subsequently written without an individual or aggregate size limit. In addition, the user-controlled `--limit` value accepts any integer and is placed into the query without a reasonable minimum or maximum. These conditions allow an upstream failure, compromised API, or excessively large requested limit to consume process runtime, memory, and storage. ### Attack Path 1. A scheduled task invokes the fetcher, potentially with an excessive `--limit` value. 2. The upstream server stalls the response or returns an exceptionally large JSON document. 3. With no timeout, a slow r ...[truncated 826 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Set explicit connection and read timeouts: ```python r = requests.get(api_url, timeout=(5, 30)) ``` 2. Validate command-line values before making the request, for example by requiring `1 <= limit <= 100` and `offset >= 0`. 3. Use streamed responses and enforce a maximum number of downloaded bytes. 4. Reject responses whose declared `Content-Length` exceeds the accepted ceiling. 5. Validate that the decoded JSON value is a list and that every entry contains a string `content` field. 6. Enforce maximum sizes for individual digest content and aggregate output. 7. Catch `requests.RequestException`, JSON-decoding errors, schema errors, and disk-write failures. 8. Prevent overlapping scheduled runs with an operating-system lock or application lock file. ]]>

T08 · Insecure Dependencies

Warning
Location
README.md:24
Finding
Installation Guidance Uses Unpinned and Unverified Third-Party Components<![CDATA[ ## Vulnerability Details **File Location**: `README.md:24-30`; related guidance in `SKILL.md:12-14`, `docs/fast-note-sync-service.md:14-35, 45-84`, and `docs/cron-jobs.md:13-26` **Vulnerability Type**: Insecure dependency and third-party binary installation guidance **Risk Level**: Medium ### Vulnerable Code and Commands ```bash pip install requests ``` The documentation also directs users to obtain and execute a third-party synchronization service: ```text https://github.com/haierkeys/fast-note-sync-service/releases ``` ```bash .\fast-note-sync-service.exe start /b .\fast-note-sync-service.exe ``` The documented scheduled task uses a downloaded executable from the OpenClaw workspace: ```text C:\Users\whoami\.openclaw\workspace\fast-note-sync-service-2.5.1-windows-amd64\fast-note-sync-service.exe ``` ### Technical Analysis The Python dependency is installed without an exact version constraint, lockfile, or hash. Consequently, future installations may resolve to a different artifact than the one evaluated during development or audit. The associated documentation also recommends installing a beta Obsidian plugin and downloading a platform executable from a mutable third-party release page. It provides no checksum, signature, immutable artifact identifier, or verification procedure before execution. The executable is then eligible for background or scheduled execution and is configured to access both the Obsidian vault and OpenClaw workspace. No malicious dependency or binary is included in the audited repository, and the audit found no evidence that the named upstream projects are malicious. The risk arises from the unverified and mutable supply chain described by the installation instructions. ### Attack Path 1. An attacker compromises a referenced package repository, maintainer account, release workflow, or distribution artifact. 2. The attacker publishes a modified package, plugin, or executable through the expected source. 3. A user f ...[truncated 963 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Pin the Python dependency to an audited version in a requirements file. 2. Use hash verification, for example: ```text requests==<audited-version> --hash=sha256:<verified-hash> ``` 3. Maintain a lockfile generated from reviewed dependency versions, including transitive dependencies. 4. Reference exact, immutable third-party releases instead of mutable release pages or branches. 5. Publish expected SHA-256 checksums and require users to verify downloaded archives and executables before execution. 6. Prefer cryptographically signed releases and document signature verification. 7. Avoid recommending that users disable plugin safety controls unless the security implications and necessity are clearly explained. 8. Run synchronization software with a dedicated least-privilege account and restrict its filesystem access to only the required directories. 9. Separate optional synchronization-service guidance from the core digest fetcher so users do not infer that unrelated third-party software is required. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
Findings (16)

Missing User Warnings

Medium
Confidence
92% confidence
Finding
The skill explicitly states it will automatically write fetched content into a specified Obsidian directory, but the documentation does not clearly warn users that local files will be created or modified. In an agent or automation context, this can lead to unintended persistent changes to a user's knowledge base, especially if the output path is misconfigured or run unattended.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The scheduled task example encourages recurring execution of a script that performs file writes, but it does not warn that this will repeatedly modify the local Obsidian vault. In unattended environments, this increases the risk of silent accumulation of files, overwrites, or unwanted persistence of external content.

Natural-Language Policy Violations

Medium
Confidence
81% confidence
Finding
The file is written entirely in Chinese and later specifies a scheduled runtime in Beijing time, but it does not indicate that the skill is region-specific or provide any language/locale option. This matches the policy category for language or locale constraints imposed without user opt-in or justification.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The document instructs users to disable Obsidian's security mode and install a third-party plugin via BRAT, but it does not warn that this bypasses the application's normal trust controls and increases exposure to malicious or compromised plugin code. In this context, the skill is directly guiding users to reduce a security safeguard and execute unreviewed extensions, which materially increases supply-chain and local code-execution risk.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
The documentation explicitly advertises move/rename and delete capabilities for user notes without any caution about destructive effects, recovery limits, or the possibility of accidental data loss. In a skill that operates directly on an Obsidian vault, normal use or prompt-driven misuse could lead to unintended modification or deletion of personal knowledge-base content.

Missing User Warnings

Medium
Confidence
97% confidence
Finding
The delete command is shown as a simple one-line example with no warning that it removes user data from the vault, which lowers user caution around an irreversible or hard-to-recover action. Because this skill is meant for direct operational use, omission of deletion risk messaging increases the chance of accidental data loss through copy-paste or agent-driven execution.

Natural-Language Policy Violations

Medium
Confidence
93% confidence
Finding
The argument parser description and help strings are presented only in Chinese, which imposes a specific language on all users. The policy allows locale constraints only when users are offered a language choice or the restriction is explicitly justified.

Missing User Warnings

Medium
Confidence
87% confidence
Finding
This code performs local file writes using content retrieved from a remote API, but the only user-facing notice appears after the write completes. There is no confirmation prompt or pre-action disclosure explaining that files will be created or overwritten in the target directory.

Natural-Language Policy Violations

Low
Confidence
85% confidence
Finding
The README content and user-facing descriptions are written in Chinese, which can amount to a language policy constraint when no user opt-in or alternative language option is provided. The policy allows locale constraints when they are explicitly justified or optional, but neither is indicated here.

Missing User Warnings

Low
Confidence
93% confidence
Finding
This markdown file states that the skill will automatically write fetched digests into a specified Obsidian directory, but it does not include any caution about local file modification, overwrite risk, or the need to verify the target path. For markdown files, user-facing descriptions should warn about behaviors that can affect user data or system integrity.

Natural-Language Policy Violations

Low
Confidence
82% confidence
Finding
The natural-language content and usage guidance are presented in Chinese, which can impose a language constraint on users without any opt-in or alternative. The policy allows locale constraints when documented and justified, but this file does not explain that limitation or offer another language option.

Natural-Language Policy Violations

Low
Confidence
91% confidence
Finding
The document title and description are entirely in Chinese, and there is no indication that users may choose another language or that the skill is intentionally limited to a Chinese-speaking audience for a documented regional reason. Under the policy criteria, this can be treated as a locale/language constraint presented without opt-in or justification.

Natural-Language Policy Violations

Low
Confidence
76% confidence
Finding
The skill documentation appears to require Chinese for all user-facing instructions without offering an alternative language or noting that the locale is intentionally limited. Under the stated policy, forcing a specific language without user opt-in can be a natural-language policy violation.

Missing User Warnings

Low
Confidence
83% confidence
Finding
This markdown file documents a scheduled task that will '抓取 ClawFeed AI 日报并写入 Obsidian', which is a user-data-affecting write operation. The surrounding description explains timing but does not warn that the automation modifies local note content or clarify overwrite/append behavior.

Natural-Language Policy Violations

Low
Confidence
89% confidence
Finding
Natural-language policy violations include forcing a specific language or locale without user opt-in. This file presents all substantive guidance in Chinese and does not offer an alternative language or explain that the skill is intentionally region- or language-specific.

Missing User Warnings

Low
Confidence
77% confidence
Finding
The script contacts an external API to retrieve digest content, but there is no visible warning or description to the user that it will send a request to a third-party endpoint. For safety transparency, network access should be disclosed before or during execution.

Static analysis

No suspicious patterns detected.