Back to skill

Security audit

openclaw-feeds

Security checks for vulnerabilities and agentic risk

Overview

This is a coherent RSS headline skill that fetches public feeds, with some normal news-aggregation risks around third-party content and unpinned dependencies.

Reasonable to install if you are comfortable with a skill that contacts many public RSS sources. Treat returned headlines and links as untrusted news content, be cautious with finance headlines, and prefer a virtual environment plus a pinned feedparser version; replacing the HTTP feeds with HTTPS-only sources would improve integrity.

Vulnerability Patterns
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • 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)

T01 · Skill Instruction Hijacking

Warning
Location
scripts/feeds.py:93
Finding

Untrusted RSS Content Is Passed Into the Agent Context Without an Explicit Trust Boundary

Content
View full analysis

Vulnerability Details

File Location: scripts/feeds.py:93-116; related presentation instructions in SKILL.md:76-101
Vulnerability Type: Indirect prompt injection through attacker-controlled feed content
Risk Level: Medium

Vulnerable Code

python
for entry in feed.entries:
    title = entry.get("title", "").strip()
    if not title:
        continue

    link = entry.get("link", "")
    published = entry.get("published", entry.get("updated", ""))
    summary = clean_html(entry.get("summary", ""))

    # Truncate long summaries
    if len(summary) > 500:
        summary = summary[:497] + "..."

    entries.append({
        "title": title,
        "url": link,
        "source": domain,
        "date": published,
        "summary": summary,
    })

The skill subsequently instructs the agent to process these fields:

markdown
## Presenting Results

After parsing the output, present a structured, concise rundown:

1. **Group by theme** — cluster related stories under headings
2. **Keep it tight** — headline + one-line summary + source attribution per item
3. **Link to sources** — use markdown links so the user can read more
4. **Deduplicate** — if multiple feeds cover the same story, mention it once
5. **Highlight big stories** — if a story appears across 3+ sources, call it out prominently

Technical Analysis

RSS entry titles, summaries, and links are controlled by external publishers. A compromised publisher, malicious feed entry, or network attacker capable of modifying a feed can insert instruction-like text into these fields.

clean_html() strips HTML tags and normalizes whitespace, but it does not establish a semantic trust boundary or identify the resulting text as untrusted data. Consequently, the emitted JSON can contain statements such as instructions to ignore the current task, disclose information, misrepresent articles, or invoke tools.

T ...[truncated 1440 chars]

Remediation
View remediation

Remediation Suggestions

  1. Add an explicit instruction to SKILL.md that every RSS field is untrusted data and must never be interpreted as an instruction.
  2. Require the agent to ignore commands, requests, role declarations, tool instructions, and policy-like text appearing inside feed fields.
  3. Present entries through a fixed template that treats each field as quoted data rather than free-form agent input.
  4. Validate article links before presentation and permit only expected https URLs.
  5. Consider detecting and flagging instruction-like content in titles and summaries instead of presenting it normally.
  6. Keep tool invocation decisions separate from feed-derived content; feed text must never authorize tool use.
  7. Add regression tests containing adversarial RSS entries such as “ignore previous instructions” and verify that they are represented only as article content.

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/lists.py:14
Finding

Plaintext HTTP Feed Endpoints Permit In-Transit Content Manipulation

Content
View full analysis

Vulnerability Details

File Location: scripts/lists.py:14 and scripts/lists.py:29
Vulnerability Type: Unauthenticated plaintext transport for externally supplied content
Risk Level: Medium

Vulnerable Code

python
NEWS_FEEDS = [
    "https://venturebeat.com/feed/",
    "https://feeds.arstechnica.com/arstechnica/index",
    "https://www.wired.com/feed/rss",
    "https://www.techdirt.com/techdirt_rss.xml",
    "https://techcrunch.com/feed/",
    "http://rss.slashdot.org/Slashdot/slashdotMain",
    "https://www.heise.de/rss/heise-atom.xml",
    "https://rss.nytimes.com/services/xml/rss/nyt/HomePage.xml",
    "https://www.theverge.com/rss/index.xml",
    # Science & Ideas
    "https://api.quantamagazine.org/feed/",
    "https://www.noemamag.com/feed/",
    "https://aeon.co/feed",
    "https://nautil.us/feed/",
    "https://www.symmetrymagazine.org/feed",
    # Culture & Essays
    "https://thepointmag.com/feed/",
    "https://asteriskmag.com/feed",
    "https://www.nplusonemag.com/feed/",
    "https://harpers.org/feed/",
    "https://solar.lowtechmagazine.com/feeds/all-en.atom.xml",
    "http://www.publicbooks.org/feed",
    "https://www.thenewatlantis.com/feed",
]

Technical Analysis

The Slashdot and Public Books feeds are retrieved over plaintext HTTP. HTTP provides neither transport confidentiality nor server authentication and integrity. An attacker positioned on the network path can read and modify the response before it reaches feedparser.

Because the application accepts the modified response without an independent integrity check, an attacker can replace titles, summaries, dates, and article links. This transport weakness also provides a practical delivery path for the indirect prompt-injection issue identified separately.

Attack Path

  1. A user runs the aggregator on a network controlled or observed by an attacker, such as a hostile access point ...[truncated 899 chars]
Remediation
View remediation

Remediation Suggestions

  1. Replace both plaintext endpoints with verified HTTPS equivalents.
  2. Reject non-HTTPS feed URLs in fetch_feed() before constructing a request.
  3. Validate redirect destinations and refuse redirects that downgrade from HTTPS to HTTP.
  4. Remove a feed if its publisher does not provide a valid HTTPS endpoint.
  5. Retain normal TLS certificate and hostname validation; do not add unverified SSL contexts.
  6. Add an automated test or configuration check that fails when any configured feed uses a scheme other than https.

T08 · Insecure Dependencies

Note
Location
README.md:34
Finding

Third-Party Dependency Is Installed Without a Version or Integrity Pin

Content
View full analysis

Vulnerability Details

File Location: README.md:34-38; dependency also declared in SKILL.md:12
Vulnerability Type: Unpinned third-party package installation
Risk Level: Low

Vulnerable Code

bash
pip install --user feedparser

# Or if you use pip3 explicitly
pip3 install --user feedparser

The skill metadata declares the same dependency without constraining its version:

yaml
compatibility: Requires Python 3, feedparser (pip install feedparser), and network access to fetch RSS feeds.

Technical Analysis

The installation instructions resolve whichever feedparser release is current at installation time. No exact version, package hash, lock file, or reproducible environment is supplied.

An unpinned dependency is not proof that the current package is malicious. However, it prevents users from reliably installing the reviewed dependency version and creates supply-chain exposure if a future release or distribution channel is compromised. The use of a user-level installation can also affect other Python applications in the same account.

Attack Path

  1. A future package release or the package distribution account is compromised, or a release introduces malicious or unsafe behavior.
  2. A user follows the documented unpinned installation command.
  3. The package installer resolves and installs the affected release from the configured package index.
  4. The project imports feedparser at startup.
  5. Code contained in the compromised dependency executes with the privileges of the user running the aggregator.

This path requires compromise or malicious modification of the dependency supply chain; the audited source does not demonstrate that such compromise has occurred.

Impact Assessment

A compromised imported dependency could run arbitrary Python code with the current user's privileges. That could permit access to files, environment variables, network resources, and proce ...[truncated 326 chars]

Remediation
View remediation

Remediation Suggestions

  1. Add a dependency file containing an exact, reviewed feedparser version.
  2. Generate and verify cryptographic hashes, for example through a hash-pinned requirements file and pip --require-hashes.
  3. Document installation with python3 -m pip so the selected interpreter and installer are unambiguous.
  4. Install dependencies in a dedicated virtual environment rather than the user's shared package directory.
  5. Establish a controlled update process that reviews and tests new dependency releases before changing the pin.
  6. Consider producing a lock file or reproducible build artifact and adding automated dependency vulnerability scanning.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • 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
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (6)

Lp1

High
Category
MCP Least Privilege
Confidence
75% confidence
Finding

The skill uses 'network' 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.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The description says to use the skill when the user asks about 'current news, headlines, what's happening, what's going on' and also for generic requests like 'briefing'. Several of these phrases are common conversational language and the file does not provide exclusion conditions or narrow context boundaries, increasing the risk of accidental invocation.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/lists.py (reported line 17)May include surrounding context.

python
"https://rss.nytimes.com/services/xml/rss/nyt/HomePage.xml",
    "https://www.theverge.com/rss/index.xml",
    # Science & Ideas
    "https://api.quantamagazine.org/feed/",
    "https://www.noemamag.com/feed/",
    "https://aeon.co/feed",
    "https://nautil.us/feed/",

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
81% confidence
Finding

The natural-language description explicitly constrains the games category to DE and US sources, which is a locale preference embedded in the skill text. There is no opt-in, alternative locale selection, or justification showing that the regional limitation is required for the skill's purpose.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
84% confidence
Finding

The code issues HTTP requests to external RSS feed URLs using urlopen, which transmits system/user network metadata such as IP address and user agent to third-party servers. While the module docstring says it fetches feeds, there is no runtime notice, confirmation, or explicit user-facing warning in this file about contacting external services.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
83% confidence
Finding

The natural-language comment 'Gaming: DE + US press, industry' followed by 'German Gaming' and 'US Gaming' describes a hard-coded locale selection. This can be a language/locale policy concern because the file encodes specific regional sources without indicating any user choice or documented justification for restricting content to those locales.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.