Back to skill

Security audit

Daily Game News

Security checks for vulnerabilities and agentic risk

Overview

This is a game-news report skill, but it needs Review because it installs persistent scheduled execution and uses overbroad web-fetching behavior that is not safely scoped.

Install only if you are comfortable with a daily scheduled job that fetches web pages from configured URLs. Before use, preserve your existing crontab, restrict the config to trusted public news domains, avoid sensitive/internal URLs, disable or explicitly approve r.jina.ai proxy use, and fix TLS verification and dependency pinning.

Vulnerability Patterns
  • System PersistenceInstalls backdoors, hooks, services, or scheduled tasks that survive the run
  • 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
Findings (4)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/rss_fetcher.py:39
Finding

RSS downloads disable TLS certificate verification

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
scripts/crawler.py:79
Finding

Configuration-controlled network requests permit server-side request forgery

Content
View full analysis
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
scripts/crawler_v2.py:166
Finding

Runtime resolution of unpinned third-party dependencies

Content
View full analysis
=4.14.3", "httpx>=0.28.1", "lxml>=6.0.2", "python-docx>=1.1.0", ] ``` ### Technical Analysis The V2 crawler asks `uv` to resolve packages by name at execution time. These package specifications contain no exact versions or integrity hashes. Consequently, the effective code executed by a future invocation can differ from the code reviewed during this audit. The project-level dependencies likewise use unrestricted upper ranges and no lockfile is included. This is not evidence that the named packages are currently malicious, but it unnecessarily exposes scheduled or manual execution to future compromised releases, index compromise, or dependency-resolution changes. ### Attack Path 1. An attacker compromises a dependency release or the package index/resolution path used by `uv`. 2. A user manually invokes V2, or it is otherwise selected as the crawler implementation. 3. `uv run ...[truncated 619 chars]
Remediation
View remediation

T06 · System Persistence

Warning
Location
README.md:182
Finding

Documented cron installation overwrites the user’s complete crontab

Content
View full analysis
> /home/admin/.openclaw/workspace/logs/daily-game-news.log 2>&1 ``` ### Technical Analysis A daily scheduled task is explicitly declared by the Skill and is reasonably related to its advertised automatic-report functionality. The persistence mechanism itself is therefore not hidden or unrelated. However, `crontab FILE` replaces the current user’s entire crontab with the contents of the supplied file. Because the provided file contains only this Skill’s entry, following the documented command can silently delete unrelated scheduled tasks. Replacing all user jobs exceeds the minimum system modification required to add one daily crawler job. The task is installed at user scope and does not request root privileges, but it persists across sessions and repeatedly executes code from a writable workspace path. ### Attack Path 1. A user follows the README installation or schedule-update instructions. 2. The `crontab` command replaces the user’s existing crontab. 3. All unrelated entries omitted from `crontab.txt` are removed. 4. Existing backups, maintenance tasks, monitoring jobs, or application workflows cease to execute. 5. The Daily Game News crawler remains as the only installed entry from this file. ### Impact Assessment The immediate impact is loss of unrelated scheduled automation and possible service disruption under the affected user account. The command does not grant elevated privileges and no ...[truncated 165 chars]
Remediation
View remediation
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
  • YARA SignaturesMalware Match, Webshell Match, Cryptominer Match
Findings (44)

YARA rule 'backdoor_persistence': Backdoor persistence with malicious payloads (shell commands, SSH key injection, hidden root users) [malware]

High
Category
YARA Match
Confidence
75% confidence
Finding

YARA rule matched a known malware signature (reverse shell, backdoor, ransomware, C2 framework, or info stealer).

Content

Scanner excerpt · README.md (reported line 184)May include surrounding context.

kspace/logs/daily-game-news.log

text

查看日志:
```bash
# 查看最新日志
tail -f /home/admin/.openclaw/workspace/logs/daily-game-news.log

# 查看今日日志
cat /home/admin/.openclaw/workspace/logs/daily-game-news.log | grep "2026-03-07"

🆘 常见问题

Q: 如何修改抓取时间?

A: 编辑配置文件中的定时任务部分,然后重新配置 cron:

bash
crontab /home/admin/.openclaw/workspace/skills/daily-game-news/crontab.txt

Q: 如何添加/删除网站?

A: 编辑 news-crawler-config.json,在"网站配置"数组中添加或删除网站配置。

Q: 如何修改每个网站的抓取数量?

A: 在配置文件中找到对应网站的"分区"配置,修改"筛选数量"字段。

Q: 报告没有按时发送?

A: 检查以下步骤:

  1. cron 任务是否正常运行:crontab -l
  2. 日志文件是否有错误:tail logs/daily-game-news.log
  3. Python 环境是否正常:uv run --version
  4. 网络连接是否正

Env Variable Harvesting

High
Category
Data Exfiltration
Confidence
92% confidence
Finding

The code copies the entire parent environment into a subprocess via {**os.environ, 'SEARXNG_URL': ...}, potentially exposing API keys, tokens, and sensitive runtime settings to another executable and all of its imported code. In an agent skill context, helper scripts and transient dependencies materially increase the risk that secrets are read, logged, or exfiltrated beyond the crawler's stated need.

Content

Scanner excerpt · scripts/crawler_v2.py (reported line 260)May include surrounding context.

python
['uv', 'run', script_path,
             'search', search_query, '-n', str(limit), '--format', 'json'],
            capture_output=True, text=True, timeout=60,
            env={**os.environ, 'SEARXNG_URL': 'http://localhost:8080'},
            cwd=os.path.dirname(script_path)
        )

Env Variable Harvesting

High
Category
Data Exfiltration
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.

Content

Scanner excerpt · scripts/crawler_v3.py (reported line 94)May include surrounding context.

python
['uv', 'run', script_path,
             'search', search_query, '-n', str(limit * 3), '--format', 'json'],
            capture_output=True, text=True, timeout=60,
            env={**os.environ, 'SEARXNG_URL': 'http://localhost:8080'},
            cwd=os.path.dirname(script_path)
        )

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The README title and operating instructions are explicitly Chinese-language, and the listed spoken commands are all in Chinese, which can amount to a forced language/locale assumption. The policy allows locale constraints when they are clearly documented and justified or when users are given a choice, but neither is present here.

Content

No source excerpt is available for this finding.

File System Enumeration

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Code scans file system directories looking for sensitive files. This could be reconnaissance for credential theft.

Content

Scanner excerpt · README.md (reported line 71)May include surrounding context.

方式 2:列出所有历史报告

bash
# 查看所有报告
ls -la /home/admin/.openclaw/workspace/reports/daily-game-news/

# 查看最近 5 个报告
ls -lt /home/admin/.openclaw/workspace/reports/daily-game-news/ | head -6

Session Persistence

Medium
Category
Rogue Agent
Confidence
85% 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.

Content

Scanner excerpt · README.md (reported line 195)May include surrounding context.

md
### Q: 报告没有按时发送?
A: 检查以下步骤:
1. cron 任务是否正常运行:`crontab -l`
2. 日志文件是否有错误:`tail logs/daily-game-news.log`
3. Python 环境是否正常:`uv run --version`
4. 网络连接是否正常

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill’s natural-language description is presented in Chinese with no indication that users can choose another language. This can violate language/locale policy requirements when a specific language is effectively forced without opt-in or documented justification.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The module docstring and user-facing messages claim the script directly crawls daily game news, but the implementation only processes a hardcoded sample list. This creates a deceptive integrity issue: operators may trust the report as fresh externally sourced data when it is actually static, which can mislead downstream decisions and monitoring.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The main function documentation says article data is read from prior crawl results or configuration, but the code ignores configuration for article input and uses fixed in-code articles instead. In an agent skill context, this can cause silent production of fabricated or stale reports, undermining the trustworthiness of automation and potentially concealing pipeline failures.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

Natural-language strings throughout the file describe the skill, console output, time labels, and generated reports exclusively in Chinese, which effectively forces a specific language experience. The file does not present this as an explicit opt-in or justified region-specific constraint, so it conflicts with the language/locale policy criteria.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The module docstring states that it directly fetches site list pages using curl and BeautifulSoup. However, fetch_html conditionally sends requests to https://r.jina.ai/ using httpx for gamersky and gamespot, which is materially different behavior because it relies on a third-party fetch/proxy service rather than direct site retrieval.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The crawler sends target URLs to a third-party proxy service at r.jina.ai, which means browsing targets and potentially sensitive query strings are disclosed outside the expected destination. In this skill context, URLs are loaded from config and could include internal or sensitive resources, so silent proxying increases privacy, compliance, and possible SSRF-style data exposure risk.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The file presents itself as a game news crawler/report generator, but its implementation delegates core work to other Python scripts through subprocess.run and the uv launcher. Spawning subprocesses is a materially broader capability than straightforward HTTP fetching/parsing and is not justified by the stated crawler purpose alone because it enables execution of additional local code and dependency resolution outside this script.

Content

No source excerpt is available for this finding.

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/crawler_v2.py (reported line 170)May include surrounding context.

python
# 使用 uv run 执行 RSS 抓取脚本
        script_path = os.path.join(os.path.dirname(__file__), 'rss_fetcher.py')
        
        result = subprocess.run(
            ['uv', 'run', '--with', 'feedparser', script_path, rss_url, '--json'],
            capture_output=True, text=True, timeout=60,
            cwd=os.path.dirname(script_path)

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/crawler_v2.py (reported line 213)May include surrounding context.

python
import subprocess
        script_path = os.path.join(os.path.dirname(__file__), 'direct_fetcher.py')
        
        result = subprocess.run(
            ['uv', 'run', '--with', 'requests', '--with', 'beautifulsoup4', 
             script_path, site_id, base_url],
            capture_output=True, text=True, timeout=60,

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
78% confidence
Finding

Although the command is passed safely as an argument list, this code launches an external script while inheriting the full parent environment. If the helper script or its dependencies are compromised or overly permissive, inherited secrets and service credentials from os.environ become accessible to that subprocess unnecessarily for a simple search operation.

Content

Scanner excerpt · scripts/crawler_v2.py (reported line 256)May include surrounding context.

python
script_path = os.path.join(os.path.dirname(__file__), '../../searxng/scripts/searxng.py')
        script_path = os.path.abspath(script_path)
        
        result = subprocess.run(
            ['uv', 'run', script_path,
             'search', search_query, '-n', str(limit), '--format', 'json'],
            capture_output=True, text=True, timeout=60,

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

This fallback path explicitly propagates the current process environment into a subprocess, which broadens the helper's access to credentials, tokens, and internal configuration unrelated to search. That is not justified by the crawler's functionality and makes any compromise in the helper path more damaging.

Content

No source excerpt is available for this finding.

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/crawler_v3.py (reported line 90)May include surrounding context.

python
script_path = os.path.join(os.path.dirname(__file__), '../../searxng/scripts/searxng.py')
        script_path = os.path.abspath(script_path)
        
        result = subprocess.run(
            ['uv', 'run', script_path,
             'search', search_query, '-n', str(limit * 3), '--format', 'json'],
            capture_output=True, text=True, timeout=60,

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/crawler_v3.py (reported line 134)May include surrounding context.

python
script_path = os.path.join(os.path.dirname(__file__), 'web_fetch_wrapper.py')
        
        if os.path.exists(script_path):
            result = subprocess.run(
                ['uv', 'run', script_path, url],
                capture_output=True, text=True, timeout=30
            )

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
85% confidence
Finding

The script invokes curl on a URL that can come from configuration and performs outbound requests with redirects enabled. In an agent skill context, this can enable SSRF-like behavior or unintended access to internal services if an attacker can influence the configured base_url or site mappings.

Content

Scanner excerpt · scripts/crawler_v3.py (reported line 188)May include surrounding context.

python
try:
        # 使用 curl 抓取 HTML
        result = subprocess.run(
            ['curl', '-s', '-A', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', 
             '--max-time', '30', '-L', target_url],
            capture_output=True, text=True, timeout=35

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

When use_web_fetch is enabled, the code sends the full target URL to r.jina.ai, a third-party proxy, rather than fetching the destination directly. That leaks browsing targets and possibly sensitive query strings or internal URLs from configuration to an external service without clear notice, consent, or allowlisting, which is a data-exposure and SSRF-amplification concern.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The module docstring presents this as a 'daily' game news crawler, and the main flow prints a 24-hour date range. However, date_start and date_end are computed and passed into fetch_website but never used to restrict fetched or reported articles, so the output may include older items from list pages rather than only daily news.

Content

No source excerpt is available for this finding.

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/crawler.py (reported line 99)May include surrounding context.

python
def fetch_html(url, timeout=30):
    """使用 curl 抓取 HTML"""
    try:
        result = subprocess.run(
            ['curl', '-s', '-A', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
             '--max-time', str(timeout), '-L', '--compressed', url],
            capture_output=True, text=True, timeout=timeout + 5

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/crawler_v4.py (reported line 99)May include surrounding context.

python
def fetch_html(url, timeout=30):
    """使用 curl 抓取 HTML"""
    try:
        result = subprocess.run(
            ['curl', '-s', '-A', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
             '--max-time', str(timeout), '-L', '--compressed', url],
            capture_output=True, text=True, timeout=timeout + 5

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/crawler_v5.py (reported line 81)May include surrounding context.

python
def fetch_html(url, timeout=30):
    """使用 curl 抓取 HTML"""
    try:
        result = subprocess.run(
            ['curl', '-s', '-A', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
             '--max-time', str(timeout), '-L', '--compressed', url],
            capture_output=True, text=True, timeout=timeout + 5