T09 · Insecure Skill Coding Practices
- Location
scripts/rss_monitor.py:68- Finding
Unrestricted RSS Feed Retrieval Enables Server-Side Request Forgery
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill is not clearly malicious, but it overstates automatic social posting and requests high-impact account credentials without enough scoping or safeguards.
Review before installing. Use only trusted public feed URLs, run it with restricted network access if possible, do not provide Twitter or LinkedIn credentials unless the skill is updated to clearly implement and scope direct posting, and treat generated posts as drafts until you have explicit publication controls.
scripts/rss_monitor.py:68Unrestricted RSS Feed Retrieval Enables Server-Side Request Forgery
requirements.txt:1Unpinned Dependency Allows Unreviewed Future Package Versions
The skill makes strong claims about AI generation, automatic scheduling, and direct publishing to Twitter/LinkedIn, but the analyzed content does not substantiate those behaviors. This mismatch is dangerous because users may provide credentials or authorize automation under false assumptions about what the skill actually does, reducing informed consent and making later code changes harder to scrutinize.
The skill promotes autonomous posting to social accounts but does not prominently warn users that it may publish externally, act on a schedule, and use account credentials. In this context, silent or underexplained automation is risky because it can affect public-facing accounts, brand reputation, and privacy with little friction.
Test mode claims that no posts will be saved, but it still calls fetch_feeds(), which updates last_check and writes posted.json. This hidden state change can suppress or alter future behavior, causing integrity issues in scheduling/deduplication and violating user expectations about dry-run safety.
The skill documents capabilities that rely on environment access and persistent local state (for example API tokens and .rss-to-social/posted.json) but does not declare an explicit tool scope or permissions boundary. That omission makes the skill's effective access less transparent to users and reviewers, increasing the chance of over-broad execution or unexpected file/env access when installed.
The skill asks users to configure sensitive Twitter and LinkedIn tokens without any nearby guidance on secret handling, storage, rotation, or the privacy implications of direct posting. This can lead users to expose high-value credentials in insecure environments or grant posting power without understanding the consequences.
The trigger phrases are broad everyday instructions like 'Check RSS feeds and post latest content' and 'Start RSS monitoring and auto-posting every 4 hours,' which could be activated by normal conversation rather than deliberate invocation. In a skill that can publish externally, ambiguous triggers increase the risk of accidental activation and unintended posting workflows.
This code writes posting history to disk in .rss-to-social/posted.json, which affects local user data/state. Although the function has a docstring, there is no user-facing disclosure at the point of operation or in runtime output that the skill persists URLs and timestamps locally, so users may not realize data is being stored.
Data from a source is assigned to a variable that is later passed to a sink, creating a variable-mediated taint flow.
"""Save history of posted items"""
ensure_data_dir()
history_file = DATA_DIR / 'posted.json'
with open(history_file, 'w') as f:
json.dump(history, f, indent=2)
def get_url_hash(url):
The manifest describes a skill that monitors RSS feeds and publishes content to Twitter/LinkedIn. In the implementation, send_to_openclaw explicitly states it only outputs posts for review and the rest of the code treats that as completion, so the actual behavior is preparation/display rather than publication.
The document is primarily in English but ends with a Chinese-only support section, without indicating language options or that multilingual content is intentional. This can violate language or locale consistency expectations for users who did not opt into Chinese content.
The dependency is specified as feedparser>=6.0.0, which allows installation of any future major or minor release and makes builds non-reproducible. This increases supply-chain risk and can unintentionally pull in vulnerable or breaking versions over time, especially in an automation skill that fetches external content and may run unattended.
feedparser>=6.0.0
The manifest references feedparser without pinning a specific version, while the package has multiple known advisories across its history. Because the installed version is not fixed, there is no assurance that deployment will avoid affected releases; in a skill that ingests untrusted RSS content, parser-related flaws could be more relevant than in a purely internal tool.
The script performs network access by fetching each configured RSS feed URL. While the script title suggests monitoring feeds, there is no explicit user warning that all URLs supplied via RSS_FEED_URLS will be contacted and their metadata processed, which is relevant for privacy and network-awareness.