Back to skill

Security audit

Claw RSS Feed Radar

Security checks for vulnerabilities and agentic risk

Overview

The skill is coherent for a personal news radar, but it automatically installs and runs mutable third-party Python code with broad environment access and optional publishing.

Install only if you are comfortable running the current and future PyPI releases of `clawfeedradar` with access to your agent environment, clawsqlite interest data, network, and any configured git publishing credentials. Prefer pinning and reviewing an exact package version, running it in an isolated environment, limiting environment variables, keeping JSON sidecars private, and disabling git publishing unless you explicitly need it.

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
bootstrap_deps.sh:10
Finding
Unpinned Third-Party Package Is Automatically Downloaded and Executed## Vulnerability Details **File Location**: `bootstrap_deps.sh`, lines 10–23 **Vulnerability Type**: Supply-chain risk caused by an unpinned executable dependency **Risk Level**: Medium ### Vulnerable Code ```bash REQ="clawfeedradar>=0.1.0" WORKSPACE="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" PREFIX="$WORKSPACE/skills/clawfeedradar/.venv" echo "[clawfeedradar] installing/upgrading $REQ via pip..." >&2 if python -m pip install --upgrade "$REQ"; then echo "NEXT: clawfeedradar installed into the default Python environment." >&2 echo "NEXT: the skill runtime will import 'clawfeedradar.cli' via python -m." >&2 exit 0 fi echo "[clawfeedradar] default env pip install failed, trying workspace prefix..." >&2 mkdir -p "$PREFIX" if python -m pip install --upgrade "$REQ" --prefix "$PREFIX"; then ``` The downloaded package is subsequently executed by `run_clawfeedradar.py`, lines 30–40 and 78–86: ```python def _build_env() -> dict[str, str]: env = os.environ.copy() prefix = _workspace_root() / "skills" / "clawfeedradar" / ".venv" site_packages = _site_packages(prefix) if site_packages.exists(): pythonpath = env.get("PYTHONPATH", "") paths = [p for p in pythonpath.split(os.pathsep) if p] if pythonpath else [] if str(site_packages) not in paths: paths.insert(0, str(site_packages)) env["PYTHONPATH"] = os.pathsep.join(paths) return env ``` ```python def _run_cli(args: list[str]) -> Dict[str, Any]: cmd = [sys.executable, "-m", "clawfeedradar.cli"] + args proc = subprocess.run( cmd, text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=_build_env(), ) ``` ### Technical Analysis The installation hook accepts every release satisfying `clawfeedradar>=0.1.0` and uses `--upgrade`. It does not enforce an audited exact version, package hash, signed artifact, or lock file. Consequently, the effective code exec ...[truncated 2590 chars]
Remediation
## Remediation Suggestions 1. Pin the dependency to an audited exact version, for example: ```bash REQ="clawfeedradar==0.1.0" ``` 2. Use a requirements lock file containing cryptographic hashes and install with hash enforcement: ```bash python -m pip install \ --require-hashes \ --no-deps \ -r requirements.lock ``` 3. Pin and hash all transitive dependencies rather than allowing `pip` to resolve changing versions. 4. Remove unconditional `--upgrade` from the automatic install hook. Dependency upgrades should be explicit, separately reviewed operations. 5. Prefer prebuilt, verified wheels and disable source builds where practical to reduce installation-time code execution: ```bash python -m pip install \ --only-binary=:all: \ --require-hashes \ -r requirements.lock ``` 6. Install the dependency in a dedicated virtual environment owned by the Skill instead of first attempting to modify the default Python environment. 7. Replace `os.environ.copy()` with an explicit environment-variable allowlist. Pass only variables required for the selected operation, and avoid exposing unrelated host secrets. 8. Run the package under a restricted service identity or sandbox with narrowly scoped filesystem and network permissions. Limit knowledge-base access to read-only where feasible. 9. Disable Git publication by default and provide publication credentials only to an isolated publication step. 10. Establish a controlled dependency-update process that verifies package provenance, reviews release changes, scans artifacts, and tests the pinned package before deployment.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Rogue AgentSelf-Modification, Session Persistence
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (11)

Tp4

High
Category
MCP Tool Poisoning
Confidence
91% confidence
Finding
The top-level description understates the skill's actual capabilities: it can fetch arbitrary URLs, read source lists from local files, scrape fulltext, call external LLM services, write detailed output files, and optionally publish to a remote git repository. This mismatch creates a security transparency problem because operators may grant or run the skill as a simple recommender while it actually performs broad network and filesystem actions.

Env Variable Harvesting

High
Category
Data Exfiltration
Content
def _build_env() -> dict[str, str]:
  env = os.environ.copy()
  prefix = _workspace_root() / "skills" / "clawfeedradar" / ".venv"
  site_packages = _site_packages(prefix)
  if site_packages.exists():
Confidence
60% confidence
Finding
Code enumerates, copies, or searches environment variables for secrets. Bulk environment access can collect credentials unrelated to the skill's stated purpose.

Description-Behavior Mismatch

Medium
Confidence
84% confidence
Finding
The manifest-level purpose is a news radar that runs scoring over feeds and interest clusters. README line L047 states the reused configuration can include an output directory and optional git publish settings, which extends behavior from analysis into remote publication and is broader than the stated description.

Session Persistence

Medium
Category
Rogue Agent
Content
openclaw skills install clawfeedradar
```

This will create the skill directory:

```text
~/.openclaw/workspace/skills/clawfeedradar
Confidence
60% confidence
Finding
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.

Context-Inappropriate Capability

Medium
Confidence
86% confidence
Finding
L210-L213 explicitly state that external network access may include git operations inside the underlying CLI. Fetching feeds is expected for a news radar, but publishing results outward via git is a separate capability not obviously required to score and inspect news items.

Ae4

Medium
Category
analysis-evasion
Confidence
80% confidence
Finding
Suspicious Unicode normalization or mixed-script content

Lp3

Medium
Category
MCP Least Privilege
Confidence
88% confidence
Finding
The skill declares installation and runtime shell/Python execution behavior but does not define an explicit tool-scope or permission boundary. In an agent ecosystem, this can cause the skill to run with broader host capabilities than users expect, increasing the chance of unauthorized command execution, network access, package installation, or environment-variable exposure.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
The skill states that it writes a JSON sidecar with full debug information, including scores, cluster matches, fulltext, and bilingual body content, but does not present this as a clear privacy/security warning. If the output directory is shared, published, synced, or committed, sensitive reading interests, article contents, and derived profile data may be exposed unintentionally.

subprocess module call

Medium
Category
Dangerous Code Execution
Content
def _run_cli(args: list[str]) -> Dict[str, Any]:
  cmd = [sys.executable, "-m", "clawfeedradar.cli"] + args
  proc = subprocess.run(
    cmd,
    text=True,
    stdout=subprocess.PIPE,
Confidence
70% confidence
Finding
subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Intent-Code Divergence

Low
Confidence
79% confidence
Finding
The security note narrows the claim to 'only reads' the clawsqlite database, but the same document acknowledges that the overall toolchain may perform external fetching, scraping, LLM calls, and git operations. That mismatch can mislead operators into underestimating the skill's side effects, causing unsafe deployment in environments where outbound network access or publishing should be tightly controlled.

Natural-Language Policy Violations

Low
Confidence
82% confidence
Finding
The example payload hard-codes `"target_lang": "zh"`, which can imply the skill is expected to produce Chinese output by default. The file does not explicitly state that language selection is optional or user-driven at that point, so this may conflict with a language/locale choice policy.

Static analysis

No suspicious patterns detected.