Mar 10, 2026·6 min read·83 visits
mcp-atlassian versions before 0.17.0 contain an arbitrary file write vulnerability in the confluence_download_attachment tool. Attackers can bypass directory restrictions to write malicious files, leading to remote code execution when chained with CVE-2026-27826.
CVE-2026-27825 is a critical arbitrary file write vulnerability in the mcp-atlassian Model Context Protocol (MCP) server. The vulnerability allows local network attackers to write arbitrary content to any path accessible by the server process due to a lack of directory boundary enforcement in the confluence_download_attachment tool.
The mcp-atlassian package provides a Model Context Protocol (MCP) server integration for Atlassian Confluence and Jira. This component facilitates agentic workflows within popular AI-assisted integrated development environments (IDEs) such as Cursor, Claude Desktop, and Copilot. The package exposes a tool named confluence_download_attachment which handles the retrieval of remote assets.
CVE-2026-27825 is an arbitrary file write vulnerability located within the attachment downloading mechanism. The implementation fails to enforce directory boundaries when processing the download_path parameter. This architectural flaw allows the application to write file streams to any absolute or relative path accessible by the executing process.
The vulnerability is classified under CWE-22 (Improper Limitation of a Pathname to a Restricted Directory) and CWE-73 (External Control of File Name or Path). Exploitation requires the ability to invoke the MCP tool, which is exposed without authentication by default when using specific transport protocols.
The vulnerability originates in the download_attachment method within the src/mcp_atlassian/confluence/attachments.py module. The function accepts a target_path argument from the client and attempts to normalize it using the standard library os.path.abspath() function. Normalization resolves relative path segments such as directory traversals, but it does not constrain the resulting absolute path to a safe base directory.
Following normalization, the application invokes os.makedirs() to ensure the parent directory of the target path exists. The function passes exist_ok=True, which silently creates missing directories without evaluating the target location against a permitted directory allowlist. The application then opens the file handler in write-binary (wb) mode.
The application streams the HTTP response content from the provided URL directly into the file handler using an 8192-byte chunk size. Because the system processes these operations sequentially without validating the final file destination, an attacker controls both the file location and the file contents. The operation executes with the permissions of the underlying MCP server process.
The vulnerable implementation in version 0.16.1 performs path processing without boundary enforcement. The code standardizes the input path but immediately utilizes it in standard library file operations.
# confluence/attachments.py (v0.16.1)
def download_attachment(self, url: str, target_path: str) -> bool:
try:
if not os.path.isabs(target_path):
target_path = os.path.abspath(target_path)
os.makedirs(os.path.dirname(target_path), exist_ok=True)
response = self.confluence._session.get(url, stream=True)
response.raise_for_status()
with open(target_path, "wb") as f:
for chunk in response.iter_content(chunk_size=8192):
f.write(chunk)The maintainers addressed this vulnerability in version 0.17.0 via commit 52b9b0997681e87244b20d58034deae89c91631e. The patch introduces a dedicated validate_safe_path utility function that evaluates the target path against a defined base directory using the pathlib module.
# confluence/attachments.py (v0.17.0)
def validate_safe_path(path, base_dir=None):
if base_dir is None:
base_dir = os.getcwd()
resolved_base = Path(base_dir).resolve(strict=False)
p = Path(path)
if not p.is_absolute():
p = resolved_base / p
resolved_path = p.resolve(strict=False)
if not resolved_path.is_relative_to(resolved_base):
raise ValueError(f"Path traversal detected: {path} resolves outside {resolved_base}")
return resolved_pathThis remediation ensures that p.resolve() computes the true absolute path, accounting for symbolic links and traversal characters. The is_relative_to() check explicitly verifies that the resolved path resides strictly within the hierarchical boundary of the base directory. This eliminates the arbitrary file write capability by isolating operations to the designated working context.
Exploitation relies on network access to the MCP server. By default, invoking the application with the --transport streamable-http or sse arguments binds the service to the 0.0.0.0 interface. This configuration exposes the unauthenticated endpoint to all adjacent network segments, allowing local network attackers to interact with the exposed tools.
Researchers at Pluto Security demonstrated an exploit chain dubbed "MCPwnfluence", which combines CVE-2026-27825 with an unauthenticated Server-Side Request Forgery (SSRF) vulnerability designated as CVE-2026-27826. The attacker sends a crafted request containing an altered X-Atlassian-Confluence-Url header. This header forces the MCP server to redirect outbound attachment requests to an attacker-controlled infrastructure.
The attacker then invokes the confluence_download_attachment tool. Due to the SSRF, the server fetches the attacker's payload rather than a legitimate Confluence asset. Simultaneously, the attacker specifies a critical system location in the download_path parameter. The application writes the malicious payload to the targeted system path, completing the attack sequence.
The primary security impact of this vulnerability is Remote Code Execution (RCE). An attacker successfully exploiting the arbitrary file write primitive can overwrite critical system files or deposit executable content into automated task directories. The impact severity directly correlates with the execution context of the MCP server.
On Linux environments, an attacker commonly targets the /etc/cron.d/ directory to schedule malicious commands. If the MCP server runs with standard user privileges, the attacker can write to ~/.bashrc to execute code upon the next terminal session, or append public keys to ~/.ssh/authorized_keys to establish persistent remote access. On macOS systems, attackers target ~/Library/LaunchAgents/ to achieve persistence and code execution.
The vulnerability also facilitates data exfiltration. The corresponding confluence_upload_attachment tool possesses the same path traversal characteristics. An attacker can supply a path referencing local sensitive files, such as ~/.aws/credentials or ~/.ssh/id_rsa, and upload them to an external location under the attacker's control.
The CVSS v3.1 base score is 9.1. The vector reflects a low-complexity, adjacent-network attack requiring no privileges or user interaction. The scope change represents the transition from the vulnerable application context to the underlying operating system environment.
Organizations must upgrade the mcp-atlassian package to version 0.17.0 or later. System administrators can apply the update via standard package managers or by pulling the latest container image from the official GitHub container registry.
If immediate patching is unfeasible, administrators must restrict network exposure. The application should only bind to the local loopback interface (127.0.0.1). Avoid using the --transport streamable-http or sse flags with binding addresses that expose the service to external or adjacent networks.
Deploying the MCP server with the principle of least privilege mitigates the impact of successful exploitation. Run the service as a dedicated non-root user account. When operating within containerized environments, utilize read-only root filesystems and restrict mount points to prevent arbitrary writes to critical operating system paths.
CVSS:3.1/AV:A/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H| Product | Affected Versions | Fixed Version |
|---|---|---|
mcp-atlassian sooperset | < 0.17.0 | 0.17.0 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-22, CWE-73 |
| Attack Vector | Adjacent Network |
| CVSS v3.1 Score | 9.1 (Critical) |
| Impact | Remote Code Execution (RCE) |
| Exploit Status | Proof of Concept (PoC) Available |
| CISA KEV | Not Listed |
Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal')
An uncontrolled resource consumption vulnerability exists in the Scala-based http4s-blaze-server package of the http4s/blaze library. The vulnerability allows remote, unauthenticated attackers to cause an Out of Memory Error (OOM) and JVM crash by streaming a continuous sequence of small or empty WebSocket continuation frames with the FIN bit set to 0. This bypasses typical payload size checks because of the JVM's per-object allocation overhead, leading to rapid heap exhaustion with minimal network bandwidth.
A critical path traversal vulnerability has been identified in the OpenList Go-based backend package. The vulnerability exists within the batch rename handler because the application does not validate the source filename parameter before constructing filesystems paths. This omission allows authenticated users to escape their designated directory and rename files in sibling paths.
OpenList version 4.2.3 and prior is vulnerable to an authorization bypass and metadata leakage. When configured with the Bleve search engine backend, OpenList fails to perform separator-aware path matching when validating tenant containment. This allows authenticated users to access sibling directories sharing similar name prefixes. Furthermore, the search backend returns unfiltered global result counts, leaking existence verification data of unauthorized files via side-channel analysis.
An authorization bypass vulnerability in OpenList version 4.2.3 and below allows authenticated users to read arbitrary files outside of their designated base directories due to an insecure path prefix check using Go's standard strings.HasPrefix function.
A security policy bypass vulnerability exists in the AWS API MCP Server (awslabs-aws-api-mcp-server) from version 0.2.13 through 1.3.46. When the server fails to load the read-only operations index during startup (due to transient network failures, file permission issues, or other exceptions), it logs a warning but continues running in an insecure, degraded state. Under this condition, the security policy engine fails open, silently skipping all subsequent security checks and consent prompts for the lifetime of the process. This permits unauthorized mutating AWS CLI commands to execute via indirect prompt injection attacks.
An incomplete escaping vulnerability in the npm package 'shescape' allows unauthenticated users to trigger dynamic shell expansions, absolute path disclosure, and command block break-outs on Unix and Windows systems.