Back to skill

Security audit

news-digest

Security checks across malware telemetry and agentic risk

Overview

This is a disclosed news-scraping digest skill, with some operational risks around local retention, optional LLM transfer, Desktop file output, and weakened TLS checks.

Install only if you are comfortable with the skill making outbound requests to news sites, keeping scraped article text in a local SQLite database, and writing digest files to the workspace and Desktop. Leave the LLM environment variables unset if you do not want article snippets sent to an external model endpoint, and review the TLS verify=False behavior before relying on content authenticity. Also test before scheduling because the current pipeline references a missing stage2_6_fgb module and has schema drift that may break execution.

SkillSpector

By NVIDIA
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Taint TrackingDirect Taint Flow, Variable-Mediated Taint Flow, Credential Exfiltration Chain
Findings (17)

Tainted flow: 'req' from os.environ.get (line 58, credential/environment) → urllib.request.urlopen (network output)

Critical
Category
Data Flow
Content
)

    try:
        with urllib.request.urlopen(req, timeout=300) as resp:
            result = json.loads(resp.read().decode('utf-8'))
            return result.get('choices', [{}])[0].get('message', {}).get('content', '')
    except Exception as e:
Confidence
95% confidence
Finding
with urllib.request.urlopen(req, timeout=300) as resp:

Tp4

High
Category
MCP Tool Poisoning
Confidence
87% confidence
Finding
The public description frames the skill as a simple news digest generator, but the documented behavior includes persistent local storage, historical tracking, writing files outside the workspace, and optional outbound LLM API transmission. That mismatch can cause users or platform operators to approve or run the skill without understanding its full data-handling and network behavior, increasing the risk of unintended data retention or exfiltration to third-party endpoints.

Intent-Code Divergence

Medium
Confidence
95% confidence
Finding
The schema initializer does not create columns later assumed by other functions, notably new_flag and keyword_updated_at. This can cause runtime failures in mark_new_flag() and update_keywords_for_new(), breaking the ingestion pipeline and potentially preventing news processing or automated monitoring from functioning reliably.

Description-Behavior Mismatch

Medium
Confidence
92% confidence
Finding
The fetcher stores full scraped article bodies in `all_news` and writes operational logs to a local file, which exceeds the narrowly described digest-generation behavior. Persisting full content increases data retention and copyright/privacy exposure, especially if article text or unexpected sensitive data from fetched pages is stored longer than necessary.

Context-Inappropriate Capability

Medium
Confidence
95% confidence
Finding
The code sends full fetched article content to an LLM summarization component when enabled, introducing third-party data transfer not clearly disclosed in the skill description. This can leak proprietary, licensed, or unexpectedly sensitive content to another processing system and broadens the trust boundary beyond simple scraping and summarization.

Description-Behavior Mismatch

Medium
Confidence
87% confidence
Finding
The formatter module does more than formatting: it persists generated content to local files and channel-specific files. That expands the skill's capabilities from text generation into filesystem side effects, which increases risk of unintended data persistence, leakage, or misuse when users expect only an in-memory summary.

Context-Inappropriate Capability

Medium
Confidence
90% confidence
Finding
The code reads the user environment and writes directly to the Desktop, which is a sensitive, user-visible location. Even though the payload is a news digest, this capability is broader than necessary for formatting and can surprise users, create clutter, or be repurposed to persist unwanted content without clear authorization.

Description-Behavior Mismatch

Low
Confidence
86% confidence
Finding
The code writes generated digest content to the local Desktop and a workspace file even though the skill description emphasizes generating summaries, not persisting them to user-visible storage. Silent file creation can leak scraped or processed content onto the host filesystem, surprise users, and create privacy/compliance issues, especially in automated agent runs.

Missing User Warnings

Medium
Confidence
88% confidence
Finding
The quick-start flow encourages immediate execution but does not prominently warn that it will perform automated scraping against multiple external sites. In agent or enterprise environments, undisclosed outbound network activity can violate policy, trigger rate limits, or create legal/compliance issues for operators who thought they were running a local summarizer.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
The skill states that output is written to both the workspace and the user's Desktop, but this side effect is easy to miss in the setup flow and is not presented as a consent-requiring operation. Writing files outside the project/workspace boundary can leak data into unintended locations, overwrite user expectations about where outputs appear, and create privacy or data-management issues on shared machines.

Missing User Warnings

Medium
Confidence
99% confidence
Finding
The fetcher intentionally disables TLS certificate verification for some HTTPS requests and also retries with `verify=False` on SSL errors. This makes the scraper vulnerable to man-in-the-middle attacks, allowing an attacker on the network path to tamper with fetched news content, inject malicious HTML, or redirect scraping to attacker-controlled responses.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
Fetched article content is forwarded to an LLM summarizer without a clear user-facing warning or consent gate. In a news-digest skill, this is more sensitive because entire article bodies may be copyrighted or contain embedded personal or business information that users would not expect to leave the scraping pipeline.

Missing User Warnings

Low
Confidence
84% confidence
Finding
The module writes files to the Desktop and message-channel paths without any confirmation or warning in this code path. Silent file creation is a security and privacy concern because it introduces side effects users may not anticipate, especially in agentic workflows where execution may be automatic.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
The code sends article content snippets to an external LLM service for title repair without any visible user-facing disclosure, consent, or policy gate. In a news-digest skill, source material may include licensed, sensitive, embargoed, or otherwise non-public content, so silent off-system transmission increases confidentiality and compliance risk.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
Writing to Desktop and workspace without prior notice or confirmation is a real security/privacy concern for an agent skill. In an automated environment, unexpected filesystem side effects can expose sensitive research output, overwrite user expectations about agent scope, and violate least-surprise and least-privilege principles.

Unsafe Defaults

Medium
Category
Tool Misuse
Content
except requests.exceptions.SSLError:
        # SSL 错误时尝试不验证证书
        try:
            response = requests.get(url, headers=HEADERS, timeout=timeout, verify=False)
            response.raise_for_status()
            return decode_response(response, url)
        except Exception as e2:
Confidence
99% confidence
Finding
verify=False

Unsafe Defaults

Medium
Category
Tool Misuse
Content
current_headers['Accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
            current_headers['Accept-Encoding'] = 'gzip, deflate'
            # gov.cn 可能存在 SSL 策略,尝试不验证
            verify_ssl = False 
        else:
            verify_ssl = True
Confidence
98% confidence
Finding
verify_ssl = False

VirusTotal

65/65 vendors flagged this skill as clean.

View on VirusTotal

Static analysis

Detected: suspicious.insecure_tls_verification

HTTPS certificate verification is disabled.

Warn
Code
suspicious.insecure_tls_verification
Location
scripts/news_digest_v2/fetcher.py:328