Back to skill

Security audit

SilverBullet API

Security checks for vulnerabilities and agentic risk

Overview

The skill matches its SilverBullet note-taking purpose, but it needs review because its tools can be redirected to arbitrary URLs and can modify or delete note data.

Review before installing. Use this only with a trusted MCP client and a SilverBullet server you control. Avoid letting prompts or untrusted content supply base_url values, and treat write_page, append_to_page, and delete_page as real changes to your notes. Prefer a version that removes or validates the per-call base_url override and pins dependencies.

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
server.py:28
Finding

Server-Side Request Forgery Through Unrestricted Base URL Override

Content
View full analysis
str: """Get the base URL, using default if not provided.""" return base_url or DEFAULT_BASE_URL async def make_request( method: str, url: str, content: str | None = None, headers: dict[str, str] | None = None, ) -> httpx.Response: """Make an HTTP request to SilverBullet.""" async with httpx.AsyncClient(timeout=30.0) as client: request_headers = headers or {} if method == "PUT" and content is not None: request_headers["Content-Type"] = "text/markdown" response = await client.request( method=method, url=url, content=content, headers=request_headers, ) return response @mcp.tool() async def list_files(base_url: str | None = None) -> str: """ List all files in the SilverBullet space. Returns a JSON array of all files with metadata including name, lastModified, created, and permissions. Args: base_url: SilverBullet server URL (optional, uses SILVERBULLET_URL env var if not provided) """ url = f"{get_base_url(base_url)}/.fs" ``` The same unsafe pattern is used by the other MCP tools at `server.py:80-81`, `112-113`, `143-144`, `174-175`, `210`, `253`, `284`, and `303`. ### Technical Analysis Every exposed MCP tool accepts an optional, caller-controlled `base_url`. The `get_base_url()` function returns this value without validating its scheme, hostname, port, DNS resolution, or destination address. The resulting URL is passed directly to `httpx.AsyncClient.request()`. Consequently, a caller can direct the MCP server to make requests from its own network context to destinations other than the configured SilverBullet instance. Potential targets include: - Loopback se ...[truncated 2456 chars]
Remediation
View remediation
Vulnerability Patterns
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Rogue AgentSelf-Modification, Session Persistence
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (11)

Lp1

High
Category
MCP Least Privilege
Confidence
75% confidence
Finding

The skill uses 'env' capability that is not listed in its permissions. This may indicate deceptive intent or missing permission declarations.

Content

No source excerpt is available for this finding.

Lp1

High
Category
MCP Least Privilege
Confidence
94% confidence
Finding

This server makes outbound HTTP requests via httpx to a configurable SilverBullet endpoint, so it clearly has network capability. If the skill manifest or permission model does not declare that capability, users and orchestrators may grant or run the skill under false assumptions, which is a security-relevant permission mismatch rather than just a documentation issue.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
60% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

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

md
- **list_files** - List all files in your SilverBullet space
- **read_page** - Read markdown content from a page
- **write_page** - Create or update pages
- **delete_page** - Remove pages
- **append_to_page** - Append content to existing pages
- **search_pages** - Search pages by name

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The markdown lists write_page, delete_page, and append_to_page as available features, but it does not warn users that these operations can overwrite, modify, or permanently remove note content. Under the markdown-specific SQP-2 criteria, skills that affect user data should disclose risks to user data or system integrity.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
60% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

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

mcporter call silverbullet.read_page path:"journal/2024-01-15.md"

text

### Create or update a page

```bash
mcporter call silverbullet.write_page path:"notes/meeting.md" content:"# Meeting Notes\n\n- Item 1\n- Item 2"

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The markdown advertises delete_page and provides a concrete deletion example, but it does not warn users that deleting a page may remove data or be difficult to recover. For a skill that can modify and delete notes, users should be clearly informed about destructive behavior in the documentation.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The base_url parameter is accepted by nearly every tool and passed directly into HTTP requests, allowing callers to redirect the skill to any reachable HTTP endpoint. In an MCP/agent setting, this creates SSRF-style behavior, enabling access to internal services, cloud metadata endpoints, localhost-only admin panels, or other unintended network targets under the skill's trust boundary.

Content

No source excerpt is available for this finding.

Unverifiable Dependency: mcp has 12 known advisory(ies) (CVE-2025-53366 (MCP Python SDK vulnerability in the FastMCP Server causes validation error, lead); CVE-2025-66416 (Model Context Protocol (MCP) Python SDK does not enable DNS rebinding protection); CVE-2026-52870 (MCP Python SDK: Experimental task handlers allow any client to access and cancel) +9 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
88% confidence
Finding

The dependency specification for mcp[cli] uses only a lower bound (>=1.2.0) rather than a pinned or tightly constrained version, so builds may resolve to different releases over time, including versions affected by known advisories. In an MCP server, weaknesses in the MCP SDK are security-relevant because they may directly affect server-side request handling, client isolation, or network protections.

Content

No source excerpt is available for this finding.

Unverifiable Dependency: httpx has 2 known advisory(ies) (CVE-2021-41945 (Improper Input Validation in httpx); CVE-2021-41945 (Encode OSS httpx <=1.0.0.beta0 is affected by improper input validation in `http)), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
84% confidence
Finding

httpx>=0.27.0 is not fully pinned, so dependency resolution can vary and may pull in a release with a disclosed security issue or a future regression. Because this project is a networked MCP server likely making outbound HTTP requests, flaws in the HTTP client could affect request validation, SSRF-related controls, or other network security properties.

Content

No source excerpt is available for this finding.

Unverifiable Dependency: pytest has 2 known advisory(ies) (CVE-2025-71176 (pytest has vulnerable tmpdir handling); CVE-2025-71176 (pytest has vulnerable tmpdir handling)), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Low
Category
Not specified by scanner
Confidence
83% confidence
Finding

The manifest scope is centered on note/page operations in SilverBullet, while get_server_config fetches instance-level configuration such as readOnly, spaceFolderPath, and indexPage. Accessing server configuration is related to the platform but is not part of the stated page-management behavior.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.