CVE-2026-77247
MCP Atlassian: Arbitrary server-local file upload to Jira/Confluence attachments via unrestricted file_path parameters
MCP Atlassian is a Model Context Protocol (MCP) server for Atlassian products (Confluence and Jira). Prior to 0.22.0, Jira and Confluence upload tools interpret caller-controlled path arguments on the MCP server and open those files before sending them as attachments. In remote or multi-user deployments, a permitted client can disclose host files without shell or direct filesystem access. The advisory traces the vulnerable input and processing flow through AttachmentsMixin.upload_attachment, AttachmentsMixin.upload_attachments, file_path, file_paths, and jira update_issue, which identify the affected entry points, controls, and code paths. This issue is fixed in version 0.22.0.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- Low
- User interaction
- None
What an attacker can affect
- Confidentiality
- High
- Integrity
- None
- Availability
- None
Exploit likelihood
What each source reports
CVE List Score used
8.3
MCP Atlassian: Arbitrary server-local file upload to Jira/Confluence attachments via unrestricted file_path parameters
MCP Atlassian is a Model Context Protocol (MCP) server for Atlassian products (Confluence and Jira). Prior to 0.22.0, Jira and Confluence upload tools interpret caller-controlled path arguments on the MCP server and open those files before sending them as attachments. In remote or multi-user deployments, a permitted client can disclose host files without shell or direct filesystem access. The advisory traces the vulnerable input and processing flow through AttachmentsMixin.upload_attachment, AttachmentsMixin.upload_attachments, file_path, file_paths, and jira update_issue, which identify the affected entry points, controls, and code paths. This issue is fixed in version 0.22.0.
- Record
CVE-2026-77247- CVSS 4.0
- 8.3 High
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:N/VA:N/SC:H/SI:N/SA:N - Weakness
- CWE-73
- Updated
- 2026-11-02
EUVDEUVD-2026-84752
8.3
MCP Atlassian is a Model Context Protocol (MCP) server for Atlassian products (Confluence and Jira). Prior to 0.22.0, Jira and Confluence upload tools interpret caller-controlled path arguments on the MCP server and open those files before sending them as attachments. In remote or multi-user deployments, a permitted client can disclose host files without shell or direct filesystem access. The advisory traces the vulnerable input and processing flow through AttachmentsMixin.upload_attachment, AttachmentsMixin.upload_attachments, file_path, file_paths, and jira update_issue, which identify the affected entry points, controls, and code paths. This issue is fixed in version 0.22.0.
- Record
EUVD-2026-84752- CVSS 4.0
- 8.3 High
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:N/VA:N/SC:H/SI:N/SA:N - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-f6pj-qv47-g96w No score
MCP Atlassian: Arbitrary server-local file upload to Jira/Confluence attachments via unrestricted file_path parameters
Summary
The Jira and Confluence attachment upload tools accept caller-controlled file path parameters and read those paths from the MCP server's local filesystem before uploading the file as an Atlassian attachment.
In local stdio deployments, this can expose files readable by the user's MCP process. In documented HTTP/SSE or streamable-http deployments, the impact is higher: any MCP client that is allowed to invoke write/upload tools can cause the server process to read a server-local file and upload it to Jira or Confluence.
This is not dependent on an AI prompt injection or model behavior. It can be triggered deterministically with a normal MCP tool call.
Details
The vulnerable behavior exists because upload tool arguments are treated as server-local filesystem paths.
Relevant implementation points:
-
mcp_atlassian.confluence.attachments.AttachmentsMixin.upload_attachment- Accepts
file_path. - Converts the supplied value to an absolute path when needed.
- Checks existence with
os.path.exists. - Passes the path into the attachment upload flow.
- Accepts
-
mcp_atlassian.confluence.attachments.AttachmentsMixin._upload_attachment_direct- Opens the supplied
file_pathwithopen(file_path, "rb"). - Sends the resulting file object as multipart form data to Confluence.
- Opens the supplied
-
mcp_atlassian.confluence.attachments.AttachmentsMixin.upload_attachments- Iterates caller-supplied
file_paths. - Calls
upload_attachmentfor each path.
- Iterates caller-supplied
-
mcp_atlassian.jira.attachments.AttachmentsMixin.upload_attachment- Accepts
file_path. - Converts the supplied value to an absolute path when needed.
- Checks existence with
os.path.exists. - Opens the file and uploads it as a Jira attachment.
- Accepts
-
mcp_atlassian.jira.attachments.AttachmentsMixin.upload_attachments- Iterates caller-supplied
file_paths. - Calls
upload_attachmentfor each path.
- Iterates caller-supplied
-
mcp_atlassian.servers.jira.update_issue- Accepts an
attachmentsargument as a JSON array string or comma-separated string. - Converts it into attachment paths and passes them into the Jira update flow.
- Accepts an
The project also documents non-stdio deployment modes:
ssestreamable-http- multi-user authentication
- Docker and Kubernetes deployment
Therefore the upload path arguments should not be treated as if they always come from a single fully trusted local desktop user. In an HTTP or multi-user deployment, the caller and the server-local filesystem are separate security boundaries.
The core issue is that the MCP caller can choose a path, while the MCP server reads that path using the server process privileges and sends the bytes to a remote Jira or Confluence attachment endpoint.
Expected behavior:
- Server-local file uploads should be denied by default in HTTP/SSE or multi-user deployments, or
- Uploads should be constrained to an explicit allowlisted upload directory after realpath resolution, and
- Dangerous path forms such as remote UNC paths and
file://URLs should be rejected before filesystem checks.
PoC
The following proof of concept uses a benign temporary file generated at runtime. It does not rely on prompt injection or any AI/LLM behavior. It uses a normal MCP client call against a test Confluence page controlled by the tester.
Prerequisites:
- A test Confluence site.
- A test page content ID where the tester is allowed to upload attachments.
- A test Confluence API token or another supported authentication method.
- Python 3.10 or newer.
Start mcp-atlassian in HTTP mode:
docker run --rm -p 9000:9000 \
-e CONFLUENCE_URL="https://<your-test-site>.atlassian.net/wiki" \
-e CONFLUENCE_USERNAME="<tester-email>" \
-e CONFLUENCE_API_TOKEN="<tester-api-token>" \
ghcr.io/sooperset/mcp-atlassian:latest \
--transport streamable-http --host 0.0.0.0 --port 9000
Install the MCP Python client:
python -m pip install "mcp>=1.8.0"
Run this standalone client script:
import asyncio…
- Record
GHSA-f6pj-qv47-g96w- Weakness
- CWE-73
- Updated
- 2026-11-02
NVD
8.3
MCP Atlassian is a Model Context Protocol (MCP) server for Atlassian products (Confluence and Jira). Prior to 0.22.0, Jira and Confluence upload tools interpret caller-controlled path arguments on the MCP server and open those files before sending them as attachments. In remote or multi-user deployments, a permitted client can disclose host files without shell or direct filesystem access. The advisory traces the vulnerable input and processing flow through AttachmentsMixin.upload_attachment, AttachmentsMixin.upload_attachments, file_path, file_paths, and jira update_issue, which identify the affected entry points, controls, and code paths. This issue is fixed in version 0.22.0.
- Record
CVE-2026-77247- CVSS 4.0
- 8.3 High
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:N/VA:N/SC:H/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X - CVSS 3.1
- 6.5 Medium
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N - Weakness
- CWE-73
- Updated
- 2026-11-02
OSV
8.3
MCP Atlassian: Arbitrary server-local file upload to Jira/Confluence attachments via unrestricted file_path parameters
MCP Atlassian is a Model Context Protocol (MCP) server for Atlassian products (Confluence and Jira). Prior to 0.22.0, Jira and Confluence upload tools interpret caller-controlled path arguments on the MCP server and open those files before sending them as attachments. In remote or multi-user deployments, a permitted client can disclose host files without shell or direct filesystem access. The advisory traces the vulnerable input and processing flow through AttachmentsMixin.upload_attachment, AttachmentsMixin.upload_attachments, file_path, file_paths, and jira update_issue, which identify the affected entry points, controls, and code paths. This issue is fixed in version 0.22.0.
- Record
CVE-2026-77247- CVSS 4.0
- 8.3 High
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:N/VA:N/SC:H/SI:N/SA:N - Weakness
- CWE-73
- Updated
- 2026-11-02
OSVGHSA-f6pj-qv47-g96w No score
MCP Atlassian: Arbitrary server-local file upload to Jira/Confluence attachments via unrestricted file_path parameters
Summary
The Jira and Confluence attachment upload tools accept caller-controlled file path parameters and read those paths from the MCP server's local filesystem before uploading the file as an Atlassian attachment.
In local stdio deployments, this can expose files readable by the user's MCP process. In documented HTTP/SSE or streamable-http deployments, the impact is higher: any MCP client that is allowed to invoke write/upload tools can cause the server process to read a server-local file and upload it to Jira or Confluence.
This is not dependent on an AI prompt injection or model behavior. It can be triggered deterministically with a normal MCP tool call.
Details
The vulnerable behavior exists because upload tool arguments are treated as server-local filesystem paths.
Relevant implementation points:
-
mcp_atlassian.confluence.attachments.AttachmentsMixin.upload_attachment- Accepts
file_path. - Converts the supplied value to an absolute path when needed.
- Checks existence with
os.path.exists. - Passes the path into the attachment upload flow.
- Accepts
-
mcp_atlassian.confluence.attachments.AttachmentsMixin._upload_attachment_direct- Opens the supplied
file_pathwithopen(file_path, "rb"). - Sends the resulting file object as multipart form data to Confluence.
- Opens the supplied
-
mcp_atlassian.confluence.attachments.AttachmentsMixin.upload_attachments- Iterates caller-supplied
file_paths. - Calls
upload_attachmentfor each path.
- Iterates caller-supplied
-
mcp_atlassian.jira.attachments.AttachmentsMixin.upload_attachment- Accepts
file_path. - Converts the supplied value to an absolute path when needed.
- Checks existence with
os.path.exists. - Opens the file and uploads it as a Jira attachment.
- Accepts
-
mcp_atlassian.jira.attachments.AttachmentsMixin.upload_attachments- Iterates caller-supplied
file_paths. - Calls
upload_attachmentfor each path.
- Iterates caller-supplied
-
mcp_atlassian.servers.jira.update_issue- Accepts an
attachmentsargument as a JSON array string or comma-separated string. - Converts it into attachment paths and passes them into the Jira update flow.
- Accepts an
The project also documents non-stdio deployment modes:
ssestreamable-http- multi-user authentication
- Docker and Kubernetes deployment
Therefore the upload path arguments should not be treated as if they always come from a single fully trusted local desktop user. In an HTTP or multi-user deployment, the caller and the server-local filesystem are separate security boundaries.
The core issue is that the MCP caller can choose a path, while the MCP server reads that path using the server process privileges and sends the bytes to a remote Jira or Confluence attachment endpoint.
Expected behavior:
- Server-local file uploads should be denied by default in HTTP/SSE or multi-user deployments, or
- Uploads should be constrained to an explicit allowlisted upload directory after realpath resolution, and
- Dangerous path forms such as remote UNC paths and
file://URLs should be rejected before filesystem checks.
PoC
The following proof of concept uses a benign temporary file generated at runtime. It does not rely on prompt injection or any AI/LLM behavior. It uses a normal MCP client call against a test Confluence page controlled by the tester.
Prerequisites:
- A test Confluence site.
- A test page content ID where the tester is allowed to upload attachments.
- A test Confluence API token or another supported authentication method.
- Python 3.10 or newer.
Start mcp-atlassian in HTTP mode:
docker run --rm -p 9000:9000 \
-e CONFLUENCE_URL="https://<your-test-site>.atlassian.net/wiki" \
-e CONFLUENCE_USERNAME="<tester-email>" \
-e CONFLUENCE_API_TOKEN="<tester-api-token>" \
ghcr.io/sooperset/mcp-atlassian:latest \
--transport streamable-http --host 0.0.0.0 --port 9000
Install the MCP Python client:
python -m pip install "mcp>=1.8.0"
Run this standalone client script:
import asyncio…
- Record
GHSA-f6pj-qv47-g96w- Weakness
- CWE-73
- Updated
- 2026-11-02
OSVPYSEC-2026-4092 No score
MCP Atlassian: Arbitrary server-local file upload to Jira/Confluence attachments via unrestricted file_path parameters
Summary
The Jira and Confluence attachment upload tools accept caller-controlled file path parameters and read those paths from the MCP server's local filesystem before uploading the file as an Atlassian attachment.
In local stdio deployments, this can expose files readable by the user's MCP process. In documented HTTP/SSE or streamable-http deployments, the impact is higher: any MCP client that is allowed to invoke write/upload tools can cause the server process to read a server-local file and upload it to Jira or Confluence.
This is not dependent on an AI prompt injection or model behavior. It can be triggered deterministically with a normal MCP tool call.
Details
The vulnerable behavior exists because upload tool arguments are treated as server-local filesystem paths.
Relevant implementation points:
-
mcp_atlassian.confluence.attachments.AttachmentsMixin.upload_attachment- Accepts
file_path. - Converts the supplied value to an absolute path when needed.
- Checks existence with
os.path.exists. - Passes the path into the attachment upload flow.
- Accepts
-
mcp_atlassian.confluence.attachments.AttachmentsMixin._upload_attachment_direct- Opens the supplied
file_pathwithopen(file_path, "rb"). - Sends the resulting file object as multipart form data to Confluence.
- Opens the supplied
-
mcp_atlassian.confluence.attachments.AttachmentsMixin.upload_attachments- Iterates caller-supplied
file_paths. - Calls
upload_attachmentfor each path.
- Iterates caller-supplied
-
mcp_atlassian.jira.attachments.AttachmentsMixin.upload_attachment- Accepts
file_path. - Converts the supplied value to an absolute path when needed.
- Checks existence with
os.path.exists. - Opens the file and uploads it as a Jira attachment.
- Accepts
-
mcp_atlassian.jira.attachments.AttachmentsMixin.upload_attachments- Iterates caller-supplied
file_paths. - Calls
upload_attachmentfor each path.
- Iterates caller-supplied
-
mcp_atlassian.servers.jira.update_issue- Accepts an
attachmentsargument as a JSON array string or comma-separated string. - Converts it into attachment paths and passes them into the Jira update flow.
- Accepts an
The project also documents non-stdio deployment modes:
ssestreamable-http- multi-user authentication
- Docker and Kubernetes deployment
Therefore the upload path arguments should not be treated as if they always come from a single fully trusted local desktop user. In an HTTP or multi-user deployment, the caller and the server-local filesystem are separate security boundaries.
The core issue is that the MCP caller can choose a path, while the MCP server reads that path using the server process privileges and sends the bytes to a remote Jira or Confluence attachment endpoint.
Expected behavior:
- Server-local file uploads should be denied by default in HTTP/SSE or multi-user deployments, or
- Uploads should be constrained to an explicit allowlisted upload directory after realpath resolution, and
- Dangerous path forms such as remote UNC paths and
file://URLs should be rejected before filesystem checks.
PoC
The following proof of concept uses a benign temporary file generated at runtime. It does not rely on prompt injection or any AI/LLM behavior. It uses a normal MCP client call against a test Confluence page controlled by the tester.
Prerequisites:
- A test Confluence site.
- A test page content ID where the tester is allowed to upload attachments.
- A test Confluence API token or another supported authentication method.
- Python 3.10 or newer.
Start mcp-atlassian in HTTP mode:
docker run --rm -p 9000:9000 \
-e CONFLUENCE_URL="https://<your-test-site>.atlassian.net/wiki" \
-e CONFLUENCE_USERNAME="<tester-email>" \
-e CONFLUENCE_API_TOKEN="<tester-api-token>" \
ghcr.io/sooperset/mcp-atlassian:latest \
--transport streamable-http --host 0.0.0.0 --port 9000
Install the MCP Python client:
python -m pip install "mcp>=1.8.0"
Run this standalone client script:
import asyncio…
- Record
PYSEC-2026-4092- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
mcp-atlassianPyPI |
before 0.22.0 | 0.22.0 |
mcp-atlassianPyPI |
before 0.22.0, plus listed versions 0.1.10.1.100.1.110.1.120.1.13 Show 45 moreShow less0.1.140.1.150.1.160.1.20.1.30.1.40.1.60.1.70.1.80.1.90.10.00.10.10.10.20.10.30.10.40.10.50.10.60.11.00.11.10.11.100.11.110.11.120.11.20.11.2a20.11.30.11.40.11.50.11.60.11.70.11.80.11.90.12.00.13.00.13.10.14.00.14.10.14.20.14.30.15.00.16.00.16.10.17.00.18.00.18.10.19.0 |
0.22.0 |
History
| Recorded | Changed | Sources |
|---|---|---|
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-77247 is a high vulnerability (CVSS 8.3) in Mcp-atlassian Mcp Atlassian, published September 22, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.39%, the 33rd percentile. Fixed in mcp-atlassian 0.22.0.
References
github.com/sooperset/mcp-atlassian/security/advisories/GHSA-f6pj-qv47-g96w
github.com/sooperset/mcp-atlassian/pull/1448
github.com/sooperset/mcp-atlassian/commit/b041733473f95119dd539542a43c280737a8e460
github.com/sooperset/mcp-atlassian/releases/tag/v0.22.0
github.com/advisories/GHSA-f6pj-qv47-g96w
github.com/CVEProject/cvelistV5/tree/main/cves/2026/77xxx/CVE-2026-77247.json
nvd.nist.gov/vuln/detail/CVE-2026-77247
github.com/sooperset/mcp-atlassian
pypi.org/project/mcp-atlassian
Left out here: 29 versions and the rest of 3 source descriptions. The JSON record has them.