Back to skill

Security audit

WizNote

Security checks for vulnerabilities and agentic risk

Overview

This WizNote connector is related to its stated purpose, but it should be reviewed carefully because it exposes apparent real credentials and handles note data, network requests, and local files unsafely.

Do not install this version without review. Treat the credentials in SKILL.md as compromised, rotate them, remove private endpoint/account examples, require HTTPS/WSS, add confirmation for delete/share/upload/download/URL import, restrict URL fetching, sanitize all download paths, and pin dependencies in an isolated environment.

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

T09 · Insecure Skill Coding Practices

Error
Location
SKILL.md:13
Finding

Hard-Coded WizNote Credentials and Private Infrastructure Details

Content
View full analysis
WIZ_KB_GUID=c6522160-aca4-11ef-97d7-3bf3be62286f WIZ_USER_ID=843909253@qq.com WIZ_PASSWORD=i1ove1314W. ``` ### Technical Analysis The Skill documentation contains a concrete email address, password, knowledge-base GUID, and private network endpoint. Although the token is a placeholder, the remaining values appear to be operational credentials rather than neutral examples. Documentation distributed with a Skill is part of the delivered package. Anyone with access to the package can recover these values without needing to inspect runtime memory or environment variables. The exposed knowledge-base GUID and endpoint also reveal details about the private deployment. This disclosure is not required for the declared WizNote connector functionality. Placeholder values would provide the same configuration guidance without granting access to a specific account. ### Attack Path 1. An attacker downloads or otherwise obtains the Skill package. 2. The attacker reads `SKILL.md`. 3. The attacker extracts the WizNote account, password, endpoint, and knowledge-base GUID. 4. If the endpoint is reachable directly, through the same local network, or through another compromised system, the attacker attempts to authenticate using the exposed credentials. 5. Successful authentication may permit reading, creating, changing, sharing, or deleting notes according to the account's permissions. ### Impact Assessment Successful exploitation may expose all notes, attachments, comments, tags, categories, and sharing information available to the affected account. Because the connector supports destructive operations, the exposed account could also be used to modify or delete data. The private endpoint and account identifier remain s ...[truncated 123 chars]
Remediation
View remediation
WIZ_PASSWORD= WIZ_KB_GUID= ``` 5. Store production secrets in environment variables or a dedicated secret manager. 6. Add automated secret scanning to the development and release process. 7. Use a dedicated least-privilege WizNote account rather than a personal or administrator account. ]]>

T09 · Insecure Skill Coding Practices

Error
Location
wiz_open_api.py:88
Finding

Passwords, Tokens, and Note Data Can Be Transmitted over Plaintext HTTP and WebSocket Connections

Content
View full analysis
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Error
Location
scripts/server.py:918
Finding

Unrestricted URL Import Enables Server-Side Request Forgery

Content
View full analysis
dict: """wiz_create_note 工具 - 创建笔记""" title = args.get("title", "") content = args.get("content", "") url = args.get("url", "") category = args.get("category", "/My Notes/") tags = args.get("tags", "") final_url = url # 如果提供了 URL,则抓取网页内容 if url: import requests from bs4 import BeautifulSoup import html2text import re logger.info(f"正在抓取 URL: {url}") headers = { 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8' } try: response = requests.get(url, headers=headers, timeout=30, allow_redirects=True) response.raise_for_status() ``` ### Technical Analysis The `wiz_create_note` MCP tool accepts a caller-controlled URL and requests it from the host running the MCP server. The implementation does not restrict: - URL schemes - Hostnames or ports - Loopback destinations - Private, link-local, multicast, or reserved IP ranges - Cloud metadata endpoints - DNS rebinding - Redirect destinations - Maximum response size Because `allow_redirects=True` is enabled, validation of only the initial URL would also be insufficient. A public URL can redirect the request to a private service. The fetched HTML is converted to Markdown and saved as a WizNote note. This creates a practical mechanism for returning internal HTTP response content to a caller who can subsequently read the created note. ### Attack Path 1. An attacker or untrusted agent instruction invokes `wiz_c ...[truncated 1193 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
scripts/server.py:876
Finding

Path Traversal Allows Attachment Writes Outside Intended Output Directories

Content
View full analysis
dict: """wiz_download_attachment 工具""" kind = args.get("kind", "normal") doc_guid = args.get("doc_guid") att_guid = args.get("att_guid") name = args.get("name", "") src = args.get("src") if not doc_guid: raise ValueError("doc_guid 是必填参数") # 清理 name 中的换行 if name: name = name.replace("\n", " ").replace("\r", "") result = { "doc_guid": doc_guid } # Attachment retrieval omitted here; binary_content is populated above. # 保存到 output/attach 目录 if name: save_dir = Path(__file__).parent.parent / "output" / "attach" save_dir.mkdir(parents=True, exist_ok=True) file_path = save_dir / name with open(file_path, "wb") as f: f.write(binary_content) result["saved_path"] = str(file_path) ``` The automatic resource-download paths follow the same unsafe construction pattern: ```python save_path = save_dir / name ``` ```python save_path = attachments_dir / file_name ``` ### Technical Analysis The code removes carriage returns and newlines but does not remove path separators, reject absolute paths, or reject `..` path components. In Python, joining a `Path` with an absolute child path can discard the intended parent. Relative traversal components can also escape the output directory after path normalization. The attachment name can be supplied directly through the MCP tool. Other resource filenames originate from note content or remote API responses and are also used without safe basename normalization. The `doc_guid` is used as a directory component in automatic note-resource paths without GUID-format validat ...[truncated 1442 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
scripts/wiz_open_api.py:1455
Finding

Encrypted-Text Helper Stores Content Directly and May Disclose the Password as a Prompt

Content
View full analysis
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
requirements.txt:1
Finding

All Third-Party Dependencies Are Unpinned and Installed Without Integrity Constraints

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
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (91)

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

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

  1. 复制 .env.example 为 .env:
bash
cp .env.example .env
  1. 编辑 .env 文件,配置以下环境变量:

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The description claims a full WizNote API connector with broad operational support across note management features. The supplied code chunk does not implement any API connector behavior, network access, authentication, CRUD actions, search, metadata management, comments, or sharing. Instead, it strictly parses a JSON representation of collaborative notes and renders it into Markdown using strategy classes for different block types. This is a materially different purpose from the declared description, so it should be flagged as a mismatch.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

声明描述的是一个面向为知笔记平台的完整 API 连接器,覆盖大量远程笔记管理能力;但实际代码片段只是本地内容处理组件,用于把 HTML 转为 Markdown 并修正文档格式。这属于主要用途上的明显不一致。虽然该解析器可能是更大系统中的辅助模块,但就该代码片段本身而言,并不能支撑所声明的 WizNote 连接器能力,因此应判定为描述与行为不匹配。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The declared description presents a broad WizNote API connector capable of performing essentially all note-related operations in WizNote. However, the supplied code chunk is a narrowly scoped parser for Lite/Markdown note content. It parses HTML, extracts text from a

text
 block if present, and returns fixed markdown content. There is no evidence of network access, authentication, API calls, note CRUD, search, metadata management, or sharing features. This is a material description-behavior mismatch because the actual code’s primary purpose is content parsing, not a full WizNote integration.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

There is a clear description-to-code mismatch. The declared purpose describes a broad, fully featured WizNote connector capable of performing essentially all notebook operations. However, the supplied code chunk contains only a minimal utility/data-model class with a single helper method for identifying collaboration notes. This is materially narrower than the declared functionality and does not demonstrate the stated connector behavior. No undeclared risky behavior is present, but the actual implemented capability is far less than what is claimed.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

声明描述的是一个面向为知笔记的完整 API 连接器,应当涉及远程服务交互、笔记资源管理及相关平台能力。但代码仅包含 Markdown 内容修复逻辑:用正则修复标题格式、移除代码块中的部分空行、替换转义列表前缀,以及合并多余换行。代码没有网络请求、认证、WizNote 资源访问、文件/附件处理、搜索或任何笔记平台集成功能。因此其实际行为与声明的主要用途存在明显且实质性的不一致。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

声明描述的是一个面向为知笔记的全功能 API 连接器,但提供的代码片段只是一个通用的抽象基类,用于定义“将原始笔记内容解析为 Markdown”的接口。该代码既没有网络请求、鉴权、资源访问,也没有任何与 WizNote 特定服务相关的实现。因此其主要目的与声明严重不符。虽然这可能只是更大项目中的基础组件,但基于所给代码片段,描述并不能准确代表其实际行为。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

该代码片段的实际职责是根据 note_type 选择合适的解析器,属于内部内容解析/分发逻辑,而不是对外的为知笔记 API 连接器实现。声明描述的是一个功能全面的 WizNote 集成技能,涵盖大量远程资源操作与业务能力;但当前代码既没有网络/API 调用,也没有资源管理、搜索或分享等逻辑。从主用途和能力范围看,描述明显超出了代码实际表现,因此应判定为描述与行为不匹配。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

该描述与代码存在明显不一致。代码确实围绕 WizNote 工作,主领域是匹配的,但声明称支持‘笔记的增删改查、搜索、附件管理、分类、标签、评论、分享等全部操作’,而实际暴露的工具只有 6 个:list/search/get/list_attachments/download_attachment/create_note。没有看到删除笔记、更新笔记、评论、分享、标签管理、分类管理等实现,因此属于明显夸大能力。另一方面,代码还实现了若干描述中未充分体现的重要能力:1)读取笔记时会把图片/附件下载到本地 output 目录;2)可对附件执行 OCR、PDF/DOCX/文本提取并拼接 bundle_text;3)创建笔记时可请求任意 URL,抓取网页并转 Markdown。这些都超出了普通‘笔记API连接器’的直观范围,尤其涉及外部网络抓取与本地文件落盘。综合来看,主用途虽相关,但声明对已实现能力范围有重大失真,且遗漏了实质性附加行为,应判定为 mismatch。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The declared description says this skill is a full WizNote API connector supporting many note-management actions. However, the provided code chunk contains only a logging utility module that configures stderr logging. It does not access WizNote, perform API calls, manage notes, or implement any of the declared end-user capabilities. Logging can be a supporting detail in a larger skill, but based on this supplied chunk alone, the actual behavior is materially different from the declared primary purpose.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
88% confidence
Finding

整体上,这段代码的主要用途与声明高度一致:它就是一个 WizNote/Open API 连接器,并且覆盖了大量与笔记相关的操作。不存在明显的越权外联、无关资源访问或恶意行为。 但按严格的描述-行为一致性标准,仍有两点偏差:第一,声明使用了“全部操作”这一绝对化表述,而代码虽然覆盖面很广,却不能从该片段证明其真正支持 WizNote 的‘全部’能力,因此有轻微夸大。第二,代码具备对本地文件系统的访问能力(通过 file_path 打开本地文件再上传附件),而声明只说‘附件管理’,未明确涉及本地文件读取这一实现层面的资源访问。若从安全审计角度严格判断,这属于轻度不匹配,因此标记为 mismatch,但属于低到中等严重度的描述偏差,而非明显恶意或完全跑题。

Content

No source excerpt is available for this finding.

Vague Triggers

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The trigger condition is very broad, activating on generic mentions such as 'Wiz' or any request involving WizNote. In a skill that can delete notes, move content, upload attachments, and create shares, overbroad activation increases the chance of unintended invocation and accidental data-modifying operations in response to ambiguous user input.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The documentation includes what appear to be real plaintext credentials, including a user ID and password, plus service endpoint and KB GUID. Exposed secrets can enable unauthorized access to the WizNote instance, data theft, note tampering, lateral movement inside a private network, or credential reuse attacks if the password is shared across services.

Content

No source excerpt is available for this finding.

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/config.py (reported line 40)May include surrounding context.

python
else:
            project_root = Path(__file__).parent.parent

        dotenv_path = project_root / ".env"

        if dotenv_path.exists():
            load_dotenv(dotenv_path)

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

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

md
if dotenv_path.exists():
            load_dotenv(dotenv_path)
            logger.info(f"已加载 .env 文件: {dotenv_path}")

        # 读取必填配置
        user_id = os.getenv("WIZ_USER_ID")

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/config.py (reported line 44)May include surrounding context.

python
if dotenv_path.exists():
            load_dotenv(dotenv_path)
            logger.info(f"已加载 .env 文件: {dotenv_path}")

        # 读取必填配置
        user_id = os.getenv("WIZ_USER_ID")

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The manifest description says the skill supports '笔记的增删改查、搜索、附件管理、分类、标签、评论、分享等全部操作', implying broad CRUD and full account functionality including delete, update, comments, and sharing. The README only describes listing, searching, reading, creating notes, listing attachments, and downloading attachments, with no documented support for deleting notes, updating notes, comments, or sharing.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The README states that reading a note will automatically download images and attachments into a local output directory, but it does not clearly warn about local writes. In an MCP/agent environment, implicit file creation can expose sensitive note contents on disk, surprise users, and create opportunities for unsafe handling of downloaded content.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The note-creation workflow supports fetching content from a user-supplied URL without a clear warning that this causes external network access. In agent settings, this can enable SSRF-like behavior, requests to internal services, or unintended disclosure of network metadata if the tool is invoked on attacker-controlled URLs.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
70% confidence
Finding

Without declared permissions the skill's intent is opaque and cannot be validated.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The skill advertises destructive and privacy-impacting operations such as deletion, sharing, and file transfer without a clear global warning or consent model. In a connector handling personal or enterprise notes, users may not realize that ordinary prompts can trigger irreversible or externally visible operations.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

文件整体描述与操作说明均以中文呈现,且未说明是否支持根据用户偏好切换语言。根据该规则,若技能在自然语言层面强制单一语言而没有用户选择或明确的区域性理由,属于语言/locale 策略问题。

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The sharing feature can create public or semi-public links with read or edit access, yet the documentation does not warn about external exposure, permission scope, or persistence risks. If used casually, users may unintentionally leak confidential notes or grant modification rights to unauthorized parties.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

This Python file uses Chinese-only natural-language strings throughout, including module/class docstrings, inline comments, and warning messages. Under the stated policy, forcing a specific language without user opt-in is a locale/language policy violation unless it is explicitly documented and justified, which is not present here.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
71% confidence
Finding

All natural-language strings and documentation in this file are written in Chinese, with no indication that users may choose another language or that the locale restriction is intentional and justified. Under the stated policy, forcing a specific language without user opt-in is a natural-language policy violation.

Content

No source excerpt is available for this finding.