CVE-2026-77262: mcp-atlassian: path traversal enables arbitrary file read

GHSA-p6hp-93wp-fh6pHIGHCISA: TRACK*
Published September 22, 2026
CISO Take

mcp-atlassian, a popular MCP server for Atlassian tools, passes the `file_path` argument of its Confluence upload tool straight to `open()` with no validation. Anyone who can call the tool can read any file the server process can read and send it out in an upload to a Confluence host they choose. The default streamable-http mode binds 0.0.0.0 with no authentication, so exposed instances are reachable without credentials. A prompt-injected agent could also be tricked into leaking secrets such as cloud keys, SSH keys, .env files and Kubernetes tokens. Exploitation likelihood is modest for now: EPSS is 0.00489 (top 60%), the CVE is not in CISA KEV, and there is no public exploit or Nuclei template. CISA SSVC rates it TRACK*, and the advisory contains a working PoC that is trivial to reproduce. This is also an incomplete fix of CVE-2026-27825, and the package has 38 other CVEs. Upgrade to mcp-atlassian 0.22.0 or later. Until you can, bind the server to localhost or put authentication in front of it, and run it as an unprivileged user with minimal filesystem access.

Sources:NVDGitHub AdvisoryEPSSATLASCISA SSVC

What is the risk?

High. The flaw is a network-reachable, unauthenticated arbitrary file read (CWE-22) in the default HTTP deployment. The advisory scores it 9.3 critical for that case, and the entry's CVSS is 8.6. A stdio-only deployment drops to roughly 6.6 because the attacker needs local or client-side control. The PoC is trivial and the exfiltration looks like a normal upload that returns success. Exploitation evidence is currently low (EPSS 0.49%, not in KEV, no public exploit), but exposed instances and prompt-injectable agents raise the real-world exposure. The risk is higher where the server runs as root or holds cloud credentials. Downstream adoption is small (1 dependent).

How does the attack unfold?

Initial Access
The attacker reaches an unauthenticated streamable-http MCP endpoint on 0.0.0.0, or injects a prompt into content an agent reads.
AML.T0049
Tool Invocation
The attacker calls confluence_upload_attachment with an arbitrary absolute file_path and an attacker-controlled Confluence URL.
AML.T0053
Collection
The server opens the target file with no path validation and reads credentials, keys or configs.
AML.T0037
Exfiltration
The file is sent in a multipart upload to the attacker's host and the tool returns success.
AML.T0086

What systems are affected?

PackageEcosystemVulnerable RangePatched
MCP Atlassianpip< 0.22.00.22.0
2 dependents85% patched~4d to patchFull package profile →

Do you use MCP Atlassian? You're affected.

How severe is it?

CVSS 3.1
8.6 / 10
EPSS
0.6%
chance of exploitation in 30 days
Higher than 47% of all CVEs
Exploitation Status
Exploit Available
Exploitation: MEDIUM
Sophistication
Trivial
Exploitation Confidence
medium
○CISA SSVC: Public PoC
Composite signal derived from CISA KEV, VulnCheck KEV, CISA SSVC, EPSS, Metasploit, Exploit-DB, trickest/cve, Nuclei templates, and inthewild.io exploitation reports.

What is the attack surface?

AVACPRUISCIA
AVNetwork
ACLow
PRNone
UINone
SChanged
CHigh
INone
ANone

What should I do?

1 step
  1. 1) Upgrade mcp-atlassian to 0.22.0 or later (fix in PR #1448, commit b041733). 2) Until patched, do not run streamable-http on 0.0.0.0. Bind to 127.0.0.1, or place it behind an authenticating reverse proxy, VPN or network policy. 3) Set READ_ONLY_MODE=true or disable the confluence_upload_attachment tool via tool filtering. Note that READ_ONLY_MODE gates write operations, so confirm in your version that it actually blocks the upload tool. 4) Run the server as a non-root user in a container with a minimal filesystem, no mounted secrets and egress restrictions. 5) Require human approval for file-related tool calls in AI agents. 6) Detection: review MCP and server logs for confluence_upload_attachment calls with absolute paths or '..', and watch for outbound POSTs to /child/attachment on unexpected hosts. 7) Rotate any credentials on hosts where exposed instances ran, if exploitation cannot be ruled out. 8) Inventory all MCP servers and check their transport and bind settings.

What does CISA's SSVC say?

DecisionTrack*
Exploitationpoc
AutomatableYes
Technical Impactpartial

Source: CISA Vulnrichment (SSVC v2.0). Decision based on the CISA Coordinator decision tree.

How is it classified?

Which compliance frameworks are affected?

This CVE is relevant to:

EU AI Act
Art. 15-Accuracy, robustness and cybersecurity
ISO 42001
A.10.3-Suppliers
NIST AI RMF
MANAGE 2.3-Responses to previously unknown risks are managed
OWASP LLM Top 10
LLM02-Sensitive Information DisclosureLLM03-Supply ChainLLM06-Excessive Agency

Frequently Asked Questions

What is CVE-2026-77262?

mcp-atlassian, a popular MCP server for Atlassian tools, passes the `file_path` argument of its Confluence upload tool straight to `open()` with no validation. Anyone who can call the tool can read any file the server process can read and send it out in an upload to a Confluence host they choose. The default streamable-http mode binds 0.0.0.0 with no authentication, so exposed instances are reachable without credentials. A prompt-injected agent could also be tricked into leaking secrets such as cloud keys, SSH keys, .env files and Kubernetes tokens. Exploitation likelihood is modest for now: EPSS is 0.00489 (top 60%), the CVE is not in CISA KEV, and there is no public exploit or Nuclei template. CISA SSVC rates it TRACK*, and the advisory contains a working PoC that is trivial to reproduce. This is also an incomplete fix of CVE-2026-27825, and the package has 38 other CVEs. Upgrade to mcp-atlassian 0.22.0 or later. Until you can, bind the server to localhost or put authentication in front of it, and run it as an unprivileged user with minimal filesystem access.

Is CVE-2026-77262 actively exploited?

No confirmed active exploitation of CVE-2026-77262 has been reported, but organizations should still patch proactively.

How to fix CVE-2026-77262?

1) Upgrade mcp-atlassian to 0.22.0 or later (fix in PR #1448, commit b041733). 2) Until patched, do not run streamable-http on 0.0.0.0. Bind to 127.0.0.1, or place it behind an authenticating reverse proxy, VPN or network policy. 3) Set READ_ONLY_MODE=true or disable the confluence_upload_attachment tool via tool filtering. Note that READ_ONLY_MODE gates write operations, so confirm in your version that it actually blocks the upload tool. 4) Run the server as a non-root user in a container with a minimal filesystem, no mounted secrets and egress restrictions. 5) Require human approval for file-related tool calls in AI agents. 6) Detection: review MCP and server logs for confluence_upload_attachment calls with absolute paths or '..', and watch for outbound POSTs to /child/attachment on unexpected hosts. 7) Rotate any credentials on hosts where exposed instances ran, if exploitation cannot be ruled out. 8) Inventory all MCP servers and check their transport and bind settings.

What systems are affected by CVE-2026-77262?

This vulnerability affects the following AI/ML architecture patterns: agent frameworks, MCP servers, tool-calling LLM agents, enterprise knowledge assistants, containerized AI agent deployments.

What is the CVSS score for CVE-2026-77262?

CVE-2026-77262 has a CVSS v3.1 base score of 8.6 (HIGH). The EPSS exploitation probability is 0.56%.

What is the AI security impact?

Affected AI Architectures

agent frameworksMCP serverstool-calling LLM agentsenterprise knowledge assistantscontainerized AI agent deployments

MITRE ATLAS Techniques

AML.T0037Data from Local System
AML.T0049Exploit Public-Facing Application
AML.T0051.001Indirect
AML.T0053AI Agent Tool Invocation
AML.T0055Unsecured Credentials
AML.T0086Exfiltration via AI Agent Tool Invocation

Compliance Controls Affected

EU AI Act: Art. 15
ISO 42001: A.10.3
NIST AI RMF: MANAGE 2.3
OWASP LLM Top 10: LLM02, LLM03, LLM06

What are the technical details?

Original Advisory

## Summary `mcp-atlassian` exposes an MCP tool `confluence_upload_attachment` whose `file_path` argument is passed directly to `open(file_path, "rb")` without any path validation. An attacker able to invoke the tool can read arbitrary files readable by the server process and exfiltrate them into a multipart upload directed at an attacker-controlled Confluence host. In the default `streamable-http` transport the server binds `0.0.0.0` with no built-in authentication, making this remotely exploitable without credentials. This is the **read-side symmetric twin** of GHSA-xjgw-4wvw-rgm4 / CVE-2026-27825 (fixed in v0.17.0). The v0.17.0 patch only covered the download/write path; the upload path that reads local files was left unguarded. ## Details ### Vulnerable sink `src/mcp_atlassian/confluence/attachments.py:477` ```python with open(file_path, "rb") as fp: files = {"file": (filename, fp, content_type)} response = self.confluence.session.post(url, files=files, ...) ``` `file_path` is attacker-controlled end-to-end. ### Taint source `src/mcp_atlassian/servers/confluence.py:1290-1369`, tool definition at `:1307`: ```python file_path: Annotated[str, Field(description="Absolute path to the file to upload")] ``` No Pydantic `pattern=`, no validator, no `validate_safe_path()` call. ### Call chain 1. MCP client invokes `confluence_upload_attachment(page_id, file_path, ...)` 2. Server handler forwards to `ConfluenceFetcher.upload_attachment(file_path)` 3. `_upload_attachment_direct(file_path)` calls `open(file_path, "rb")` 4. File bytes are streamed in the multipart body of `POST /wiki/rest/api/content/{page_id}/child/attachment` to the configured Confluence base URL — which the attacker also controls (they provided `CONFLUENCE_URL` via env/config or target a server they already control). ### Asymmetry with the patched download path - `attachments.py:223` (download) — calls `validate_safe_path(local_path)` before `open(..., "wb")` - `attachments.py:272` (download) — calls `validate_safe_path(local_path)` before `open(..., "wb")` - `attachments.py:477` (upload) — **no validation** The `check_write_access` decorator does not help: it only gates `READ_ONLY_MODE` (default `false`) and is unrelated to filesystem path safety. ### Default exposure `src/mcp_atlassian/__init__.py:151` and `:360` — default transport is `streamable-http` binding `HOST=0.0.0.0` with no auth layer. Any network-reachable attacker can call MCP tools directly. ## Severity **Primary (default `streamable-http` deployment)** - Vector: `CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N` - Score: **9.3 Critical** - Rationale: network-reachable, unauthenticated, scope-changed because files outside the MCP server's intended resource boundary (Confluence attachments) are exfiltrated. **Alternative (stdio-only deployment, conservative)** - Vector: `CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N` - Score: **6.6 High** - Rationale: local attacker controlling the MCP client context. Maintainer should pick the vector that reflects the documented default deployment. ## CWE CWE-22: Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal') ## Affected - Product: `sooperset/mcp-atlassian` - Affected versions: **>= 0.17.0, <= HEAD (`d8bc78698a63cb6b321c7ca796d6329d448f7f6d`)** - Note: v0.17.0 is the fix commit for GHSA-xjgw-4wvw-rgm4 but only addressed the write-side. This read-side twin has existed since that release and remains unpatched on `main`. - Patched versions: **none at time of disclosure** ## Proof of Concept Fully reproduced twice end-to-end against a local stdlib HTTP stub acting as the Confluence API, driven by a real MCP stdio client (`mcp.ClientSession` + `stdio_client`) spawning the unmodified `mcp-atlassian` server at HEAD. ### Permalinks (commit-pinned) - Sink: https://github.com/sooperset/mcp-atlassian/blob/d8bc78698a63cb6b321c7ca796d6329d448f7f6d/src/mcp_atlassian/confluence/attachments.py#L477 - Source (tool def): https://github.com/sooperset/mcp-atlassian/blob/d8bc78698a63cb6b321c7ca796d6329d448f7f6d/src/mcp_atlassian/servers/confluence.py#L1307 - Safe download comparison: https://github.com/sooperset/mcp-atlassian/blob/d8bc78698a63cb6b321c7ca796d6329d448f7f6d/src/mcp_atlassian/confluence/attachments.py#L223 - Default transport bind: https://github.com/sooperset/mcp-atlassian/blob/d8bc78698a63cb6b321c7ca796d6329d448f7f6d/src/mcp_atlassian/__init__.py#L151 ### Reproduction 1. Start mock Confluence stub: `python mock_confluence.py` (binds `127.0.0.1:8443`, logs all multipart bodies) 2. Launch MCP client against real `mcp-atlassian` server over stdio with `CONFLUENCE_URL=http://127.0.0.1:8443` 3. Call tool: ```json { "name": "confluence_upload_attachment", "arguments": { "page_id": "123456", "file_path": "/etc/passwd", "comment": "poc" } } ``` ### Run 1 — `/etc/passwd` - MCP response: `isError=False`, `{"message": "Attachment uploaded successfully"}` - Stub captured 3339-byte multipart body containing: `root:x:0:0:root:/root:/bin/bash` (and full passwd contents) ### Run 2 — `/etc/hostname` - MCP response: `isError=False`, same success envelope - Stub captured 380-byte body containing: `ang3l-pc` Both runs used unmodified server code at commit `d8bc78698a63cb6b321c7ca796d6329d448f7f6d`. PoC artifacts (`mock_confluence.py`, `mcp_client.py`, `poc_run1.sh`, `poc_run2.sh`, `asymmetry.txt`, `ENVIRONMENT.md`) available on request to maintainers via this advisory thread. ## Impact - Arbitrary file read of anything readable by the server process UID: `/etc/passwd`, `/etc/shadow` (if running as root in container), `~/.aws/credentials`, `~/.ssh/id_rsa`, `.env` files, kube service-account tokens at `/var/run/secrets/kubernetes.io/serviceaccount/token`, application source, database dumps, private keys. - Exfiltration is covert: file bytes transit to the attacker's configured Confluence host inside a normal-looking multipart upload. No error surface; the tool returns success. - In the default `streamable-http` 0.0.0.0 deployment, no credentials are required. - Chains trivially with any AI agent that exposes this MCP server to untrusted prompt input — a prompt-injected assistant can be coerced into calling the tool with a sensitive path. ## Relationship to GHSA-xjgw-4wvw-rgm4 (CVE-2026-27825) GHSA-xjgw-4wvw-rgm4 (CVSS 9.1, fixed in v0.17.0) addressed an **arbitrary file write** in the same `attachments.py` module: attacker-controlled paths reaching `open(..., "wb")` on the download side. The fix introduced `validate_safe_path()` and applied it at lines 223 and 272. **The upload-side counterpart at line 477 was not updated.** Same module, same maintainer, same class of bug (unchecked path → `open()`), opposite direction (read vs write). This advisory reports the incomplete-fix twin. ## Remediation ### Required Call `validate_safe_path(file_path)` at the top of `ConfluenceFetcher.upload_attachment` and `_upload_attachment_direct` in `src/mcp_atlassian/confluence/attachments.py`, mirroring the download path at lines 223 and 272. Reject absolute paths outside a configurable allow-listed upload directory and reject any path containing `..` after normalization. ### Defense in depth Tighten the Pydantic tool schema at `src/mcp_atlassian/servers/confluence.py:1307`: ```python file_path: Annotated[ str, Field( description="Relative path within the configured upload directory", pattern=r"^(?!/)(?!.*\.\.)[\w\-./]+$", ), ] ``` This blocks absolute paths and `..` at the MCP schema layer before the handler is even entered. ### Additional hardening (out of scope but recommended) - Default `streamable-http` to `127.0.0.1` instead of `0.0.0.0`, or require an auth token when bound to a non-loopback interface. - Document that `file_path` must be confined to an operator-chosen directory and expose that directory via config.

Exploitation Scenario

An attacker scans for exposed mcp-atlassian instances on streamable-http, using the default port and MCP endpoint. Without authentication, they call confluence_upload_attachment with file_path set to ~/.aws/credentials or /var/run/secrets/kubernetes.io/serviceaccount/token. They point the server at a Confluence-compatible host they control, so the file contents arrive in the multipart upload and the tool reports success. In an indirect variant, the attacker plants hidden instructions in a Confluence page or Jira ticket. When an AI assistant connected to the MCP server reads it, the assistant is coaxed into uploading the sensitive file. The attacker then uses the stolen cloud keys or tokens to move into the victim's infrastructure.

Weaknesses (CWE)

CWE-22 — Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal'): The product uses external input to construct a pathname that is intended to identify a file or directory that is located underneath a restricted parent directory, but the product does not properly neutralize special elements within the pathname that can cause the pathname to resolve to a location that is outside of the restricted directory.

  • [Implementation] Assume all input is malicious. Use an "accept known good" input validation strategy, i.e., use a list of acceptable inputs that strictly conform to specifications. Reject any input that does not strictly conform to specifications, or transform it into something that does. When performing input validation, consider all potentially relevant properties, including length, type of input, the full range of acceptable values, missing or extra inputs, syntax, consistency across related fields, and conformance to business rules. As an example of business rule logic, "boat" may be syntactically valid because it only contains alphanumeric characters, but it is not valid if the input is only expected to contain colors such as "red" or "blue." Do not rely exclusively on looking for malicious or malformed inputs. This is likely to miss at least one undesirable input, especially if the code's environment changes. This can give attackers enough room to bypass the intended validation. However, denylis
  • [Architecture and Design] For any security checks that are performed on the client side, ensure that these checks are duplicated on the server side, in order to avoid CWE-602. Attackers can bypass the client-side checks by modifying values after the checks have been performed, or by changing the client to remove the client-side checks entirely. Then, these modified values would be submitted to the server.

Source: MITRE CWE corpus.

CVSS Vector

CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N

Timeline

Published
September 22, 2026
Last Modified
September 28, 2026
First Seen
September 23, 2026

Related Vulnerabilities