Every CVE Search/ Get API key

CVE-2026-77247

MCP Atlassian: Arbitrary server-local file upload to Jira/Confluence attachments via unrestricted file_path parameters

8.3 HighFix available

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

0.39%Down 0.1 points since Sep 23, 2026
90%50%10%1%

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 HighCVSS: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 HighCVSS: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.
  • mcp_atlassian.confluence.attachments.AttachmentsMixin._upload_attachment_direct

    • Opens the supplied file_path with open(file_path, "rb").
    • Sends the resulting file object as multipart form data to Confluence.
  • mcp_atlassian.confluence.attachments.AttachmentsMixin.upload_attachments

    • Iterates caller-supplied file_paths.
    • Calls upload_attachment for each path.
  • 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.
  • mcp_atlassian.jira.attachments.AttachmentsMixin.upload_attachments

    • Iterates caller-supplied file_paths.
    • Calls upload_attachment for each path.
  • mcp_atlassian.servers.jira.update_issue

    • Accepts an attachments argument as a JSON array string or comma-separated string.
    • Converts it into attachment paths and passes them into the Jira update flow.

The project also documents non-stdio deployment modes:

  • sse
  • streamable-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 HighCVSS: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 MediumCVSS: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 HighCVSS: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.
  • mcp_atlassian.confluence.attachments.AttachmentsMixin._upload_attachment_direct

    • Opens the supplied file_path with open(file_path, "rb").
    • Sends the resulting file object as multipart form data to Confluence.
  • mcp_atlassian.confluence.attachments.AttachmentsMixin.upload_attachments

    • Iterates caller-supplied file_paths.
    • Calls upload_attachment for each path.
  • 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.
  • mcp_atlassian.jira.attachments.AttachmentsMixin.upload_attachments

    • Iterates caller-supplied file_paths.
    • Calls upload_attachment for each path.
  • mcp_atlassian.servers.jira.update_issue

    • Accepts an attachments argument as a JSON array string or comma-separated string.
    • Converts it into attachment paths and passes them into the Jira update flow.

The project also documents non-stdio deployment modes:

  • sse
  • streamable-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.
  • mcp_atlassian.confluence.attachments.AttachmentsMixin._upload_attachment_direct

    • Opens the supplied file_path with open(file_path, "rb").
    • Sends the resulting file object as multipart form data to Confluence.
  • mcp_atlassian.confluence.attachments.AttachmentsMixin.upload_attachments

    • Iterates caller-supplied file_paths.
    • Calls upload_attachment for each path.
  • 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.
  • mcp_atlassian.jira.attachments.AttachmentsMixin.upload_attachments

    • Iterates caller-supplied file_paths.
    • Calls upload_attachment for each path.
  • mcp_atlassian.servers.jira.update_issue

    • Accepts an attachments argument as a JSON array string or comma-separated string.
    • Converts it into attachment paths and passes them into the Jira update flow.

The project also documents non-stdio deployment modes:

  • sse
  • streamable-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

Affected packages
PackageAffectedFixed
mcp-atlassian
PyPI
before 0.22.0
0.22.0
mcp-atlassian
PyPI
before 0.22.0, plus listed versions
0.1.10.1.100.1.110.1.120.1.13
Show 45 moreShow less
0.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

History
RecordedChangedSources
first indexedCVE 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

This page doesn't list everything

Left out here: 29 versions and the rest of 3 source descriptions. The JSON record has them.

MoveEnter Open