Back to skill

Security audit

finance-news-warmap

Security checks for vulnerabilities and agentic risk

Overview

The skill largely matches its stated finance-news map purpose, but generated reports can execute untrusted news content as browser script and the docs include unsafe TLS guidance.

Review before installing. Use this only with trusted or sanitized news inputs, avoid sharing generated HTML from untrusted data, and do not follow the TLS-verification disabling workaround. Treat Supabase push as an explicit data-upload action and use a least-privilege key/table if enabling it.

Vulnerability Patterns
  • 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
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
Findings (3)

T09 · Insecure Skill Coding Practices

Error
Location
references/build.py:301
Finding

Stored Script Injection in Generated Offline HTML Reports

Content
View full analysis
0, "无新闻数据" tpl = TEMPLATE.read_text(encoding="utf-8") echarts = (ASSETS / "echarts.min.js").read_text(encoding="utf-8") world = (ASSETS / "world.json").read_text(encoding="utf-8") china = (ASSETS / "china.json").read_text(encoding="utf-8") xlsx_lib = (ASSETS / "xlsx.full.min.js").read_text(encoding="utf-8") news_js = json.dumps(news, ensure_ascii=False, indent=2) sugg_js = json.dumps(build_suggestions(news, role=role), ensure_ascii=False, indent=2) out = (tpl .replace("__ECHARTS_LIB__", echarts) .replace("__WORLD_JSON__", world.strip()) .replace("__CHINA_JSON__", china.strip()) .replace("__XLSX_LIB__", xlsx_lib) .replace("__NEWS__", news_js) .replace("__SAMPLE__", "true" if is_sample else "false") .replace("__SUGGESTIONS__", sugg_js)) ``` The resulting JSON is placed inside an executable JavaScript context: ```html
Remediation
View remediation
__NEWS_JSON__ ``` 2. Before embedding JSON in HTML, escape characters significant to the HTML parser: ```python def html_safe_json(value): return ( json.dumps(value, ensure_ascii=False) .replace("&", "\\u0026") .replace("<", "\\u003c") .replace(">", "\\u003e") .replace("\u2028", "\\u2028") .replace("\u2029", "\\u2029") ) ``` 3. Replace `innerHTML` rendering with DOM construction. Assign attacker-controlled text exclusively through `textContent`. 4. If limited rich text is an explicit requirement, sanitize it with a maintained strict-allowlist HTML sanitizer. Do not permit scripts, event-handler attributes, SVG, MathML, iframes, or unsafe URL schemes. 5. Validate links before assigning them: ```javascript function safeNewsUrl(value) { try { const url = new URL(value); return url.protocol === 'https:' || url.protocol === 'http:' ? url.href : null; } catch { return null; } } ``` Disable the link when validation fails, and add `rel="noopener noreferrer"` to links that open another browsing context. 6. Apply schema validation at every ingestion boundary. Enforce expected types, maximum lengths, valid coordinates, valid date formats, permitted categories, and HTTP(S)-only links. 7. Add regression tests using ``, event-handler markup, SVG payloads, malformed URLs, and `javascript:` URLs. Verify that each payload is displayed only as text and never creates executable DOM content. 8. Consider a restrictive Content Security Policy as defense in depth after inline script handling has been redesigned. CSP should supplement, not replace, contextual encoding and safe ...[truncated 14 chars]

T09 · Insecure Skill Coding Practices

Warning
Location
references/build.py:285
Finding

Spreadsheet Formula Injection Through Untrusted News Fields

Content
View full analysis
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
SKILL.md:238
Finding

Documentation Recommends Disabling Git TLS Certificate Verification

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • YARA SignaturesMalware Match, Webshell Match, Cryptominer Match
Findings (31)

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The optional Supabase pull/push capability introduces outbound data transfer and remote dependency that materially changes the security posture from 'offline local generator.' Even though the markdown mentions it later, failure to declare this clearly in top-level scope/permissions can cause operators to underestimate exfiltration and credential-handling risks.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The optional Supabase pull/push capability introduces outbound data transfer and remote dependency that materially changes the security posture from 'offline local generator.' Even though the markdown mentions it later, failure to declare this clearly in top-level scope/permissions can cause operators to underestimate exfiltration and credential-handling risks.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The optional Supabase pull/push capability introduces outbound data transfer and remote dependency that materially changes the security posture from 'offline local generator.' Even though the markdown mentions it later, failure to declare this clearly in top-level scope/permissions can cause operators to underestimate exfiltration and credential-handling risks.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The optional Supabase pull/push capability introduces outbound data transfer and remote dependency that materially changes the security posture from 'offline local generator.' Even though the markdown mentions it later, failure to declare this clearly in top-level scope/permissions can cause operators to underestimate exfiltration and credential-handling risks.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The optional Supabase pull/push capability introduces outbound data transfer and remote dependency that materially changes the security posture from 'offline local generator.' Even though the markdown mentions it later, failure to declare this clearly in top-level scope/permissions can cause operators to underestimate exfiltration and credential-handling risks.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The optional Supabase pull/push capability introduces outbound data transfer and remote dependency that materially changes the security posture from 'offline local generator.' Even though the markdown mentions it later, failure to declare this clearly in top-level scope/permissions can cause operators to underestimate exfiltration and credential-handling risks.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
92% confidence
Finding

The optional Supabase pull/push capability introduces outbound data transfer and remote dependency that materially changes the security posture from 'offline local generator.' Even though the markdown mentions it later, failure to declare this clearly in top-level scope/permissions can cause operators to underestimate exfiltration and credential-handling risks.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The optional Supabase pull/push capability introduces outbound data transfer and remote dependency that materially changes the security posture from 'offline local generator.' Even though the markdown mentions it later, failure to declare this clearly in top-level scope/permissions can cause operators to underestimate exfiltration and credential-handling risks.

Content

No source excerpt is available for this finding.

YARA rule 'agent_skill_mcp_tool_poisoning_metadata': MCP/tool metadata poisoning indicators in tool schemas or skill manifests [agent_skills]

High
Category
YARA Match
Confidence
80% confidence
Finding

YARA rule matched a hack tool or exploit indicator (offensive tools, reconnaissance, privilege escalation, or exploit frameworks).

Content

Scanner excerpt · references/assets/xlsx.full.min.js (reported line 6)May include surrounding context.

js
פץצקרשת��‎‏�",r=[],t={};for(var a=0;a!=e.length;++a){if(e.charCodeAt(a)!==65533)t[e.charAt(a)]=a;r[a]=e.charAt(a)}return{enc:t,dec:r}}();cptable[1256]=function(){var e="\0\b\t\n\x0B\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€پ‚ƒ„…†‡ˆ‰ٹ‹Œچژڈگ‘’“”•–—ک™ڑ›œ‌‍ں ،¢£¤¥¦§¨©ھ«¬­®¯°±²³´µ¶·¸¹؛»¼½¾؟ہءآأؤإئابةتثجحخدذرزسشصض×طظعغـفقكàلâمنهوçèéêëىيîïًٌٍَôُِ÷ّùْûü‎‏ے",r=[],t={};for(var a=0;a!=e.length;++a){if(e.charCodeAt(a)!==65533)t[e.charAt(a)]=a;r[a]=e.charAt(a)}return{enc:t,dec:r}}();cptable[1257]=function(){var e="\0\b\t\n\x0B\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚�„…†‡�‰�‹�¨ˇ¸�‘’“”•–—�™�›�¯˛� �¢£¤

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The Question Flow fixes '新闻来源 / 语言' to domestic official and mainstream financial Chinese-language sources with '不询问', meaning the user is not offered a language or locale choice. This is a natural-language policy concern because the skill imposes a locale/language constraint by default without explicit opt-in.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
88% confidence
Finding

The skill clearly describes file read/write behavior (news.xlsx, generated HTML, local assets), but it does not declare an explicit tool scope or permissions boundary. That weakens least-privilege controls and can cause an agent platform to grant broader filesystem access than users expect, which is a real security issue even if the documented writes appear local and task-related.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

The manifest description lists activation phrases such as '做新闻情报地图', '作战地图', '创新动态地图', and '给高管出趋势与建议面板' without clear boundaries or negative examples. Several of these are generic business requests rather than narrowly scoped invocation triggers, which increases the risk of unintended activation.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The question flow sets the default source and language scope to '国内真实新闻,官媒+主流财经媒体', which effectively fixes a locale/language constraint rather than offering user choice. Elsewhere the skill also defaults to domestic Chinese coverage, but does not present this as an explicit opt-in or clearly justified region-specific compliance limitation.

Content

No source excerpt is available for this finding.

Ae4

Medium
Category
analysis-evasion
Confidence
80% confidence
Finding

Suspicious Unicode normalization or mixed-script content

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

This Python file is a code file, so SQP-3 applies to its natural-language strings. The top-level docstring and command descriptions are entirely in Chinese and present the skill's interface in a single language, with no opt-in, alternate locale, or justification that the tool is region-specific; that can violate language/locale policy requirements.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The manifest describes a skill for building an offline single-file HTML map from real searched news, with all runtime assets inlined and no external requests. This file additionally implements explicit database-backed workflows via Supabase (build --source supabase, pull, push), which materially extends behavior beyond offline compilation into remote persistence and synchronization.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
86% confidence
Finding

The manifest emphasizes using real searched news and says that if web search is unavailable the agent must stop rather than invent or use placeholders. Here, when news.xlsx is missing, the default load path silently falls back to bundled sample data and proceeds to build output, which weakens that stated 'no placeholder/no abort bypass' intent even if marked as sample.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The file introduces Supabase-backed read/write behavior that materially expands the skill’s capabilities beyond the stated offline HTML/news-map generation workflow. Even if intended for convenience, adding undeclared remote persistence increases the attack surface by enabling data exfiltration, unintended retention of scraped content, and use of supplied credentials to access external infrastructure.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The push() function can mutate a remote Supabase table by upserting or inserting arbitrary news records, which is not clearly necessary for generating an offline deliverable. In an agent setting, this creates a path for silent outbound data transfer and persistent modification of external data stores if the skill is invoked with sensitive or malformed content.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The HTML root sets lang="zh-CN", which hard-codes a specific language/locale for the entire interface. The file also presents Chinese-only UI text throughout, but does not offer any user opt-in, locale switch, or documented region-specific justification in the template itself.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The manifest states the skill should abort when web search is unavailable and '不编造/不占位', but this template explicitly presents a sample-data badge and instructs users to replace the NEWS array with real news. That means the delivered artifact can operate in a placeholder/demo mode rather than strictly enforcing real-news-only behavior described in the skill intent.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
83% confidence
Finding

The documentation states that data and artifacts are written to the current working directory and shows commands that generate news.xlsx and an HTML file. Although this is mentioned descriptively, there is no prominent caution or warning callout about file creation/overwrite impacts, which qualifies as a missing user warning for markdown guidance affecting user data.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Low
Category
Not specified by scanner
Confidence
83% confidence
Finding

The documentation emphasizes a pure local/offline model while also describing optional Supabase synchronization. This discrepancy can mislead reviewers and users about whether data may ever leave the host, which is security-relevant in environments handling sensitive internal research or regulated financial data.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
96% confidence
Finding

The environment/setup section says build.py writes news.xlsx to the current working directory, but the delivery checklist later states the editable data source is finance-map/news.xlsx. These statements describe different actual output locations, which can mislead an agent or user about where the skill writes its data.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
81% confidence
Finding

This JavaScript file includes routines that save generated workbook data to disk using platform-specific file APIs such as writeFileSync, Deno.writeFileSync, browser download flows, and legacy file interfaces. In this code file, those write operations are not accompanied by confirmation prompts, user-facing logs, or inline comments warning that files may be created or overwritten.

Content

No source excerpt is available for this finding.

Static analysis

Detected: suspicious.dynamic_code_execution

Dynamic code execution detected.

Critical
Code
suspicious.dynamic_code_execution
Location
references/assets/echarts.min.js:45