Back to skill

Security audit

Gold News Sentiment

Security checks for vulnerabilities and agentic risk

Overview

The skill appears to do what it says: gather gold news and help summarize sentiment, though users should treat fetched headlines and links as untrusted.

Install only if you are comfortable with the skill making public news requests and keeping local cached reports. Treat fetched headlines, sources, and links as quoted evidence, not instructions, and verify important financial conclusions independently before relying on them.

Vulnerability Patterns
  • 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
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
Findings (1)

T01 · Skill Instruction Hijacking

Warning
Location
scripts/update_snapshot.py:86
Finding

Untrusted News Metadata Can Inject Instructions into the Agent Context

Content
View full analysis
bytes: request = urllib.request.Request(url, headers={"User-Agent": USER_AGENT}) with urllib.request.urlopen(request, timeout=timeout) as response: return response.read() ``` `scripts/fetch_news.py:202-218` stores remote metadata without filtering instruction-like content: ```python context_text = " ".join( part for part in [title, source, item.findtext("description") or "", query] if part ) items.append( NewsItem( title=title, source=source, published_at=published_at.isoformat() if published_at else "", age_hours=age_hours, link=link, query=query, provider=provider, tags=infer_tags(context_text), ) ) ``` `scripts/update_snapshot.py:86-101` places the remote fields directly into an Agent-readable Markdown document: ```python lines.extend(["", "## Recent Headlines"]) if items: for index, item in enumerate(items[:12], start=1): source = item.get("source") or item.get("provider") or "unknown" published_at = item.get("published_at") or "unknown_time" query = item.get("query") or "unknown_query" lines.extend( [ f"{index}. {item.get('title', '')}", f" - source: {source}", f" - published_at_utc: {published_at}", f" - que ...[truncated 3605 chars]
Remediation
View remediation
Vulnerability Patterns
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
Findings (12)

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The declared description promises an analysis skill: fetch news, assess short-/medium-term gold sentiment, connect macro drivers to gold, and produce a structured outlook such as 看涨/看跌/观望 with confidence and risks. The supplied code only implements the news retrieval portion. It fetches RSS feeds from Google and Bing for predefined or custom gold-related queries, parses article metadata, tags items based on keyword presence, and emits JSON. The tag inference for terms like Fed, yields, USD, inflation, geopolitics, ETF flows, and central banks is only lightweight labeling, not substantive market analysis. Since the primary analytical functions described are absent, the code materially underdelivers relative to the declared purpose, so this is a description-behavior mismatch.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The declared purpose promises an end-to-end gold news analysis skill: retrieve recent news, evaluate short- or medium-term sentiment, connect macro drivers to gold, and output a structured stance with confidence and risks. The supplied code only implements the news collection/cache-refresh portion. It fetches articles through collect_news, aggregates tags/sources, renders a markdown digest of headlines and retrieval status, and writes snapshot files to disk. While this supports a later analysis workflow, it does not itself conduct sentiment inference, macro relationship reasoning, or final recommendation generation. The file-writing snapshot/cache behavior is also an undeclared operational capability, though secondary. Overall, the primary implemented behavior is materially narrower than the declared description.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
92% confidence
Finding

The skill instructs the agent to use network access and write cached files, but it does not declare any explicit tool scope or permission boundaries. In an agent environment, undeclared capabilities increase the chance of over-privileged execution, unexpected data writes, and broader-than-intended network access, especially since the workflow directly invokes scripts and updates local snapshot files.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The manifest description says to use the skill whenever users want to pull gold-related news, assess sentiment, connect macro drivers, and produce a conclusion, but it does not define clear trigger phrases, scope limits, or negative examples. This broad natural-language description could overlap with many general market-analysis requests and lead to unintended invocation.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The description requires conclusions such as 看涨, 看跌, or 观望, which imposes a specific language format by default. The file does not offer the user a language choice or document a justified locale-specific constraint.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
99% confidence
Finding

The prescribed final output structure is entirely in Chinese, including headings and sentiment labels, and the file does not indicate that this is optional or user-selected. This is a language policy issue because it forces a locale-specific response format regardless of user preference.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The manifest allows implicit invocation while the default prompt is broad and natural-language driven, with no explicit trigger constraints, scope limits, or user-confirmation requirement. This can cause the skill to be auto-selected in contexts the user did not clearly intend, leading to unintended external-news analysis, overbroad financial commentary, or surprising behavior in adjacent conversations.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The default prompt hard-codes Chinese output labels (看涨, 看跌, 观望) without evidence of user locale preference or documented business need. While not a direct code-execution issue, it can override user expectations, reduce clarity for non-Chinese users, and create misleading or unusable financial-analysis output in implicitly invoked contexts.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The instructions require specific Chinese terms such as 看涨, 看跌, 观望, 短线, and 中线 in the generated report. Because the file does not offer the user a language preference or explain that the skill is intentionally Chinese-language or region-specific, this creates a natural-language policy concern.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

This markdown file contains natural-language guidance that directs the user to default toward 观望 and defines final conclusion thresholds only as 看涨, 看跌, and 观望. That imposes a specific output language/locale in a general scoring guide without user opt-in or documented regional requirement, matching the language-policy violation criteria.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
87% confidence
Finding

This markdown file instructs the skill to run a local Python script and write a report to data/latest_sentiment.md. The description explains the workflow but does not explicitly warn users that the automation executes code and updates local files, which is the kind of behavior markdown skill descriptions should disclose when it can affect user data or system state.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Low
Category
Not specified by scanner
Confidence
80% confidence
Finding

The manifest describes pulling gold-related news, assessing sentiment, and producing a structured conclusion. This script additionally persists fetched results and a markdown digest to local files as a reusable cache, which is operational behavior not reflected in the skill description. While related to the skill's function, it is still broader than the user-facing description of analysis and conclusion generation.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.