Back to skill

Security audit

One Paper Company 一个公司一张纸

Security checks for vulnerabilities and agentic risk

Overview

The skill is broadly coherent, but generated HTML can embed untrusted research data as active browser content without sufficient escaping or validation.

Review before installing. This skill is not trying to steal credentials or persist on the system, but reports built from untrusted web or JSON data could contain active HTML or JavaScript. Only open or share generated reports when you trust the source data, and prefer adding sanitization/CSP hardening before using it with arbitrary inputs.

Vulnerability Patterns
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/build_html.py:128
Finding

Persistent Script Injection in Generated HTML Reports

Content
View full analysis
\n' html += f'
{step["tag"]}
\n' html += f'

{step["h2"]}

\n' for p in step.get('paragraphs', []): html += f'

{p}

\n' fig = step.get('figure') if fig and fig.get('src'): html += ' \n' html += f' {fig.get(\n' html += f' {fig.get("caption", "")}\n' html += ' \n' html += ' \n' return html ``` In `scripts/build_html.py:239-265`, additional fields are inserted into HTML and CSS contexts without escaping or strict validation: ```python repl = { # CSS / brand '__TITLE__': data.get('title', '产业周期 Scrollytelling 复盘'), '__BRAND_GREEN__': green, '__BRAND_GREEN_D__': green_d, # Hero '__HERO_KICKER__': data.get('hero', {}).get('kicker', ''), '__HERO_H1_PREFIX__': data.get('hero', {}).get('h1Prefix', ''), '__HERO_H1_EM__': data.get('hero', {}).get('h1Em', ''), '__HERO_THESIS__': data.get('hero', {}).get('thesis', ''), '__META_ROW_HTML__': generate_meta_row_html(data.get('hero', {}).get('metaRow', [])), '__VIZ_NOTE__': data.get('vizNote', f'数据截至 {data.get("asOf", "") ...[truncated 8743 chars]
Remediation
View remediation
``` - Serialize the data and explicitly escape at least `<`, `>`, `&`, U+2028, and U+2029 before embedding it. - Parse the value with `JSON.parse(document.getElementById('report-data').textContent)`. - Alternatively, load the data into the page through a safe build-time mechanism that cannot terminate a script element. 3. **Remove unsafe DOM construction** - Replace `innerHTML` string concatenation with `document.createElement()`, `textContent`, `classList`, and safe property assignment. - Construct SVG nodes with `document.createElementNS()` rather than assigning generated SVG strings to `innerHTML`. - Use `textContent` for clock details, signal values, score fields, event descriptions, labels, and other plain-text data. 4. **Sanitize explicitly allowed rich text** - If fields must support limited formatting such as ``, pass them through a mature allowlist-based HTML sanitizer. - Permit only the minimum required elements and attributes. - Remove scripts, inline event handlers, embedded objects, forms, unsafe SVG, `style` attributes, and dangerous URL protocols. 5. **Validate typed fields strictly** - Restrict IDs, viewport names, state names, class names, and status values to defined enums or conservative character allowlists. - Validate colors using a strict pattern such as six-digit hexadecimal notation rather than interpola ...[truncated 1185 chars]
Vulnerability Patterns
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • YARA SignaturesMalware Match, Webshell Match, Cryptominer Match
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (15)

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding

代码的主功能与声明明显不一致。声明描述的是一个面向任意公司的深度研究 HTML 单页生成能力,并强调滚动联动、可视化、ECharts、动画,以及可选抓取行情/财务数据和输出 HTML。实际代码却只是一个命令行数据提取器:读取指定本地 HTML,使用正则和简单 JS→JSON 转换提取 NVIDIA 专属内容,保存为 JSON 文件,并把图片 base64 与步骤数据关联。它既不生成 HTML 页面,也不展示通用公司支持,更没有网络抓取逻辑。虽然“写入本地文件”本身可算支持性实现细节,但这里写出的是 JSON 中间产物而非声明的 HTML 产物,且该脚本明显是专用解析工具,不是所宣称的最终技能主体。因此应判定为描述与实际行为不匹配。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

描述强调的是“制作/生成”公司研究 HTML 单页,并提到可选的数据抓取与本地写出能力;而实际代码仅是 validate.py,一个离线校验工具。它从磁盘读取 HTML(以及可选 JSON),执行一系列正则和字符串检查,并输出通过/失败结果后以退出码返回。没有任何生成页面、抓取外部数据、渲染图表、写入输出 HTML 的逻辑。因此其实际主用途与声明的主用途存在实质性偏差。虽然校验脚本可能是同一项目的辅助组件,但就这段代码本身而言,描述不能准确代表其行为。

Content

No source excerpt is available for this finding.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 162)May include surrounding context.

md
# --echarts <path> 默认 template/echarts.5.5.0.min.js

YARA rule 'privilege_escalation_tools': Privilege escalation tools and techniques [hacktools]

High
Category
YARA Match
Confidence
75% confidence
Finding

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

Content

Scanner excerpt · references/nvidia_data.json (reported line 2129)May include surrounding context.

json
KoBil86cB5UtuW9QozFLAp2M0gKoG4pYo9KXOhBpFLFOxQxVAKBp1LFANI2oU6kBQDTSxRPPlSxVsg3FLFOxQIpYG4pUcUqpAUKdSoUbilinUKA8O+3hT/rVwc+Vn//ABGrrvsuH+28W/5q3P3NXJ/bzj/Wng/PPsm3/WNXWfZd/wC3cV/5m3/+qvkw/wBY/wDPB9TJ/o1/nk9BxSo0iK+ufLNkilRxSrwHegUMU6lQDcUsU6hiqKBSFE0qWKARSxRoUslANKnYoUAMUqdQ6b0AMbUsUcUaChtKnYpUsUNxSIp2KGKWKG460cUcUsUsUNxSxRpc6pBpFLFOpUsDcUsU7FKlihuKVOxSxQDcUsU6lilihuKWKOPOjirYobSo0iKAbSxRo4pZBtLFHpSpYBilRxSxSwDFDFOxSxSxQ3FLFOoEUsAIpYp1KrYG4pYo0aWBuMUqOKWKWAYoEU6lSwNxSxTsUsUsDeu9LFOxSpYG4pY+tHFLlVsDcYo0edLFLAKGKdS6UsAoYzTsUsUsDaW55U6kBQDcGkadihigBilTqFLAKWPSjSoAYoEU6lQDcZpYp2KVANpU6hQApYo4pVQDFDFOxSxQAxQxTsUsUKNxSxRxRxQg2linYpUsDcUqNLHSgG4pY2p2KVLA3FKnYoYpYBikadigaWAYpYo4pchVA2ljFOxQpZAYoYp1LFAClRxSxilgbilinYoUJQMUsb0aWKooGKWKJpAUFA+VLAxRxSxQDcUqdj0pYpYobihTqWN6WKBg86BxTqWMUA3FIj0px5UBv1oAYzSxRx5UqoBSxTsZoYpYG0sU7rSx0pYGkUKfS5/ClgZikRTunWlirYG4ocqdjalgUsDaFO+VKqQbilRxSxQDSKBFOxSO9UDcUsUcUsUsgMUMU740sUso3ehyp9CrYPDft6//ACp4L/8Amh/+Ya637LP/AHhxbb/c2/8A9Vcn9vn/AOVHBf8A80P/AMw11f2V73/Ff+Yt/

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

Broad trigger phrases like '帮我研究下宁德时代' can cause the skill to activate on generic research requests, increasing the chance of unintended network access, local file writes, or subprocess execution without sufficiently specific user intent. In a skill with WebSearch/WebFetch, Write, and RunCommand permissions, overbroad invocation guidance expands the attack surface for accidental or prompt-induced tool use.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The trigger list includes broad phrases like '公司周期复盘', '公司速览卡', and '公司竞争格局' that overlap with generic company-analysis requests rather than uniquely identifying this skill. This can cause unintended activation in normal conversations, leading the agent to invoke file-generation or data-retrieval behavior when the user did not explicitly request this skill.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

This JSON content is overwhelmingly written in Chinese across labels, captions, narratives, and UI text, indicating the skill experience is effectively fixed to a single language. The file does not offer any language/locale choice or document that the skill is intentionally region-specific, which matches the locale-policy violation criterion.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

Line L39 explicitly says '中文版:本期不做英文版', which imposes a Chinese-only language constraint. Under the policy, forcing a specific language without offering user choice or documenting a justified region-specific requirement is a natural-language policy violation.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

This JSON file’s user-facing descriptions, labels, and narrative text are written entirely in Chinese across many fields, with no indication of language choice, fallback, or user opt-in. Under the stated policy, forcing a single language/locale in natural-language content is a violation unless a justified locale constraint is clearly documented.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The HTML root sets lang="zh-CN", which establishes a fixed language/locale for the rendered skill output. The file does not indicate user opt-in, alternative locale support, or a region-specific justification, so this appears to violate the language/locale policy requirement.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
91% confidence
Finding

该 markdown 文档从标题开始即固定为中文表述,全文也未说明这是仅面向中文用户或特定地区的技能说明。按照语言/locale 政策,若未提供用户选择或明确 justification,强制单一语言可能构成自然语言层面的策略违背。

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
87% confidence
Finding

This markdown file contains only Chinese-language instructions and does not indicate that the skill is intended exclusively for Chinese-speaking users or provide an opt-in language choice. Under the policy, forcing a specific language without user choice can be a natural-language policy violation.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
93% confidence
Finding

This Python file contains numerous natural-language strings intended for output data fields, labels, and notes entirely in Chinese. Under the policy, forcing a specific language without user opt-in is a natural-language policy concern, and the file provides no mechanism to select locale or justify the constraint as region-specific.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
92% confidence
Finding

The module docstring presents the script description and validation checks in Chinese, and the script later emits Chinese user-facing status text. This imposes a specific language/locale in natural-language content without offering an opt-in or alternative, which matches the language-policy violation criterion.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
86% confidence
Finding

This minified JavaScript includes natural-language locale selection logic that picks Chinese or English automatically from the browser language (document.documentElement.lang / navigator.language) and sets a default locale. The policy allows locale constraints only when users are offered a choice or the limitation is clearly justified; here the behavior is automatic rather than explicit opt-in.

Content

No source excerpt is available for this finding.