{"id":"CVE-2026-77258","aliases":["EUVD-2026-84650","GHSA-93xw-j965-9mx3","PYSEC-2026-4088"],"status":"published","title":"MCP Atlassian: Arbitrary file read/exfiltration via upload_attachment missing validate_safe_path()","description":"MCP Atlassian is a Model Context Protocol (MCP) server for Atlassian products (Confluence and Jira). Prior to 0.22.0, upload_attachment in src/mcp_atlassian/confluence/attachments.py accepts a caller-controlled file_path and opens the selected server-local file without restricting it to the workspace. A permitted Confluence MCP caller can upload the file as an attachment and disclose data readable by the server process. This issue is fixed in version 0.22.0.","severity":{"version":"3.1","score":7.7,"vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N","level":"high","assessor":"cna","from":"cve"},"epss":{"day":"2026-11-09","score":0.00374,"percentile":0.31675,"model":"v2026.06.15"},"facts":{"in_kev":false,"known_exploited":false,"public_exploit":false,"fix_available":true},"cwes":["CWE-22"],"published":"2026-09-22T17:39:28Z","modified":"2026-10-28T02:30:47Z","fixes":[{"ecosystem":"PyPI","package":"mcp-atlassian","fixed_in":["0.22.0"],"sources":["ghsa","osv"]}],"affected":[{"source":"ghsa","ecosystem":"PyPI","package":"mcp-atlassian","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"0.22.0"}]}]},{"source":"osv","ecosystem":"PyPI","package":"mcp-atlassian","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"0.22.0"}]}],"versions":["0.1.1","0.1.10","0.1.11","0.1.12","0.1.13","0.1.14","0.1.15","0.1.16","0.1.2","0.1.3","0.1.4","0.1.6","0.1.7","0.1.8","0.1.9","0.10.0","0.10.1","0.10.2","0.10.3","0.10.4","0.10.5","0.10.6","0.11.0","0.11.1","0.11.10","0.11.11","0.11.12","0.11.2","0.11.2a2","0.11.3","0.11.4","0.11.5","0.11.6","0.11.7","0.11.8","0.11.9","0.12.0","0.13.0","0.13.1","0.14.0","0.14.1","0.14.2","0.14.3","0.15.0","0.16.0","0.16.1","0.17.0","0.18.0","0.18.1","0.19.0","0.2.0","0.2.1","0.2.2","0.2.3","0.2.4","0.2.5","0.2.6","0.20.0","0.20.1","0.21.0","0.21.1","0.3.0","0.3.1","0.4.0","0.5.0","0.6.0","0.6.1","0.6.2","0.6.3","0.6.4","0.6.5","0.7.0","0.7.1","0.8.0","0.8.1","0.8.2","0.8.3","0.8.4","0.9.0"]},{"source":"osv","ecosystem":"PyPI","package":"mcp-atlassian","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"0.22.0"}]}],"versions":["0.1.1","0.1.10","0.1.11","0.1.12","0.1.13","0.1.14","0.1.15","0.1.16","0.1.2","0.1.3","0.1.4","0.1.6","0.1.7","0.1.8","0.1.9","0.10.0","0.10.1","0.10.2","0.10.3","0.10.4","0.10.5","0.10.6","0.11.0","0.11.1","0.11.10","0.11.11","0.11.12","0.11.2","0.11.2a2","0.11.3","0.11.4","0.11.5","0.11.6","0.11.7","0.11.8","0.11.9","0.12.0","0.13.0","0.13.1","0.14.0","0.14.1","0.14.2","0.14.3","0.15.0","0.16.0","0.16.1","0.17.0","0.18.0","0.18.1","0.19.0","0.2.0","0.2.1","0.2.2","0.2.3","0.2.4","0.2.5","0.2.6","0.20.0","0.20.1","0.21.0","0.21.1","0.3.0","0.3.1","0.4.0","0.5.0","0.6.0","0.6.1","0.6.2","0.6.3","0.6.4","0.6.5","0.7.0","0.7.1","0.8.0","0.8.1","0.8.2","0.8.3","0.8.4","0.9.0"]}],"products":[{"vendor":"mcp-atlassian","product":"mcp_atlassian"},{"vendor":"sooperset","product":"mcp-atlassian"}],"references":[{"url":"https://github.com/sooperset/mcp-atlassian/security/advisories/GHSA-93xw-j965-9mx3","tags":["x_refsource_CONFIRM","exploit","Exploit","Vendor Advisory","advisory","web"]},{"url":"https://github.com/sooperset/mcp-atlassian/pull/1448","tags":["x_refsource_MISC","Issue Tracking","Patch","fix","web"]},{"url":"https://github.com/sooperset/mcp-atlassian/commit/b041733473f95119dd539542a43c280737a8e460","tags":["x_refsource_MISC","Patch","fix","web"]},{"url":"https://github.com/sooperset/mcp-atlassian/releases/tag/v0.22.0","tags":["x_refsource_MISC","Release Notes","web"]},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2026-77258","tags":["advisory"]},{"url":"https://github.com/advisories/GHSA-93xw-j965-9mx3","tags":["advisory"]},{"url":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/77xxx/CVE-2026-77258.json","tags":["advisory"]},{"url":"https://github.com/sooperset/mcp-atlassian","tags":["package"]},{"url":"https://pypi.org/project/mcp-atlassian","tags":["package"]}],"sources":{"cve":[{"id":"CVE-2026-77258","title":"MCP Atlassian: Arbitrary file read/exfiltration via upload_attachment missing validate_safe_path()","description":"MCP Atlassian is a Model Context Protocol (MCP) server for Atlassian products (Confluence and Jira). Prior to 0.22.0, upload_attachment in src/mcp_atlassian/confluence/attachments.py accepts a caller-controlled file_path and opens the selected server-local file without restricting it to the workspace. A permitted Confluence MCP caller can upload the file as an attachment and disclose data readable by the server process. This issue is fixed in version 0.22.0.","status":"published","published":"2026-09-22T17:39:28.501Z","modified":"2026-09-25T23:49:26.389Z","cvss":[{"version":"3.1","score":7.7,"vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N","level":"high","assessor":"cna"}],"cwes":["CWE-22"],"updated_at":"2026-11-02T14:20:16.072351Z"}],"euvd":[{"id":"EUVD-2026-84650","description":"MCP Atlassian is a Model Context Protocol (MCP) server for Atlassian products (Confluence and Jira). Prior to 0.22.0, upload_attachment in src/mcp_atlassian/confluence/attachments.py accepts a caller-controlled file_path and opens the selected server-local file without restricting it to the workspace. A permitted Confluence MCP caller can upload the file as an attachment and disclose data readable by the server process. This issue is fixed in version 0.22.0.","status":"published","published":"2026-09-22T17:39:28Z","modified":"2026-09-25T23:49:26Z","cvss":[{"version":"3.1","score":7.7,"vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N","level":"high"}],"updated_at":"2026-11-02T17:27:54.622662Z"}],"ghsa":[{"id":"GHSA-93xw-j965-9mx3","title":"MCP Atlassian: Arbitrary file read/exfiltration via upload_attachment missing validate_safe_path()","description":"## Summary\n\nThe `upload_attachment` method in `confluence/attachments.py` reads and uploads arbitrary local files to Confluence without calling `validate_safe_path()`. Both download methods (`download_attachment` at line 223, `download_content_attachments` at line 272) correctly call `validate_safe_path()` before writing files, but the upload path at lines 35-79 skips this check entirely.\n\nAn AI agent connected via MCP (or an attacker influencing that agent through prompt injection) can read any file on the host and exfiltrate it by uploading it as a Confluence page attachment.\n\n## Vulnerable Code\n\nFile: `src/mcp_atlassian/confluence/attachments.py`, lines 62-79\n\n```python\n# No validate_safe_path() call anywhere in this method\nif not os.path.isabs(file_path):\n    file_path = os.path.abspath(file_path)\n\nif not os.path.exists(file_path):\n    return {\"success\": False, \"error\": f\"File not found: {file_path}\"}\n\nfilename = os.path.basename(file_path)\nattachment = self._upload_attachment_direct(\n    content_id, file_path, filename, comment, minor_edit\n)\n```\n\nThe `validate_safe_path` function is already imported at line 9 of the same file, and used in the download methods. It was just not added to the upload path.\n\n## Proof of Concept\n\nTested with mcp-atlassian 0.21.1 on Python 3.11 (EC2, Amazon Linux 2023).\n\n```python\nimport inspect\nfrom mcp_atlassian.confluence.attachments import AttachmentsMixin\n\n# Confirm: no validate_safe_path in upload\nsource = inspect.getsource(AttachmentsMixin.upload_attachment)\nassert \"validate_safe_path\" not in source  # passes\n\n# Confirm: validate_safe_path IS in downloads\nassert \"validate_safe_path\" in inspect.getsource(AttachmentsMixin.download_attachment)  # passes\nassert \"validate_safe_path\" in inspect.getsource(AttachmentsMixin.download_content_attachments)  # passes\n```\n\nAn MCP tool call like this reads /etc/passwd and uploads it to Confluence:\n\n```json\n{\"tool\": \"confluence_upload_attachment\", \"arguments\": {\"content_id\": \"123456\", \"file_path\": \"/etc/passwd\"}}\n```\n\n## Impact\n\nExfiltration of any file readable by the MCP server process: SSH keys, AWS credentials, .env files, /etc/passwd, application secrets. Data leaves the local machine and lands on a remote Confluence instance accessible to other users.\n\n## Suggested Fix\n\nAdd `validate_safe_path(file_path)` before the `os.path.exists()` check in `upload_attachment`, matching the existing pattern in the download methods. The function is already imported.","status":"published","published":"2026-09-22T20:36:37Z","modified":"2026-09-22T20:36:39Z","cvss":[{"version":"3.1","score":7.7,"vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N","level":"high"}],"cwes":["CWE-22"],"updated_at":"2026-11-02T14:41:20.575159Z"}],"nvd":[{"id":"CVE-2026-77258","description":"MCP Atlassian is a Model Context Protocol (MCP) server for Atlassian products (Confluence and Jira). Prior to 0.22.0, upload_attachment in src/mcp_atlassian/confluence/attachments.py accepts a caller-controlled file_path and opens the selected server-local file without restricting it to the workspace. A permitted Confluence MCP caller can upload the file as an attachment and disclose data readable by the server process. This issue is fixed in version 0.22.0.","status":"published","published":"2026-09-22T18:17:18.193Z","modified":"2026-09-29T14:01:18.607Z","cvss":[{"version":"3.1","score":7.7,"vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N","level":"high","assessor":"secondary"}],"cwes":["CWE-22"],"updated_at":"2026-11-02T14:12:50.368368Z"}],"osv":[{"id":"CVE-2026-77258","title":"MCP Atlassian: Arbitrary file read/exfiltration via upload_attachment missing validate_safe_path()","description":"MCP Atlassian is a Model Context Protocol (MCP) server for Atlassian products (Confluence and Jira). Prior to 0.22.0, upload_attachment in src/mcp_atlassian/confluence/attachments.py accepts a caller-controlled file_path and opens the selected server-local file without restricting it to the workspace. A permitted Confluence MCP caller can upload the file as an attachment and disclose data readable by the server process. This issue is fixed in version 0.22.0.","status":"published","published":"2026-09-22T17:39:28.501Z","modified":"2026-10-28T02:30:47.19450048Z","cvss":[{"version":"3.1","score":7.7,"vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N","level":"high"}],"cwes":["CWE-22"],"updated_at":"2026-11-02T15:45:17.102988Z"},{"id":"GHSA-93xw-j965-9mx3","title":"MCP Atlassian: Arbitrary file read/exfiltration via upload_attachment missing validate_safe_path()","description":"## Summary\n\nThe `upload_attachment` method in `confluence/attachments.py` reads and uploads arbitrary local files to Confluence without calling `validate_safe_path()`. Both download methods (`download_attachment` at line 223, `download_content_attachments` at line 272) correctly call `validate_safe_path()` before writing files, but the upload path at lines 35-79 skips this check entirely.\n\nAn AI agent connected via MCP (or an attacker influencing that agent through prompt injection) can read any file on the host and exfiltrate it by uploading it as a Confluence page attachment.\n\n## Vulnerable Code\n\nFile: `src/mcp_atlassian/confluence/attachments.py`, lines 62-79\n\n```python\n# No validate_safe_path() call anywhere in this method\nif not os.path.isabs(file_path):\n    file_path = os.path.abspath(file_path)\n\nif not os.path.exists(file_path):\n    return {\"success\": False, \"error\": f\"File not found: {file_path}\"}\n\nfilename = os.path.basename(file_path)\nattachment = self._upload_attachment_direct(\n    content_id, file_path, filename, comment, minor_edit\n)\n```\n\nThe `validate_safe_path` function is already imported at line 9 of the same file, and used in the download methods. It was just not added to the upload path.\n\n## Proof of Concept\n\nTested with mcp-atlassian 0.21.1 on Python 3.11 (EC2, Amazon Linux 2023).\n\n```python\nimport inspect\nfrom mcp_atlassian.confluence.attachments import AttachmentsMixin\n\n# Confirm: no validate_safe_path in upload\nsource = inspect.getsource(AttachmentsMixin.upload_attachment)\nassert \"validate_safe_path\" not in source  # passes\n\n# Confirm: validate_safe_path IS in downloads\nassert \"validate_safe_path\" in inspect.getsource(AttachmentsMixin.download_attachment)  # passes\nassert \"validate_safe_path\" in inspect.getsource(AttachmentsMixin.download_content_attachments)  # passes\n```\n\nAn MCP tool call like this reads /etc/passwd and uploads it to Confluence:\n\n```json\n{\"tool\": \"confluence_upload_attachment\", \"arguments\": {\"content_id\": \"123456\", \"file_path\": \"/etc/passwd\"}}\n```\n\n## Impact\n\nExfiltration of any file readable by the MCP server process: SSH keys, AWS credentials, .env files, /etc/passwd, application secrets. Data leaves the local machine and lands on a remote Confluence instance accessible to other users.\n\n## Suggested Fix\n\nAdd `validate_safe_path(file_path)` before the `os.path.exists()` check in `upload_attachment`, matching the existing pattern in the download methods. The function is already imported.","status":"published","published":"2026-09-22T20:36:37Z","modified":"2026-10-01T17:55:42.597738626Z","cvss":[{"version":"3.1","score":7.7,"vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N","level":"high"}],"cwes":["CWE-22"],"updated_at":"2026-11-02T15:46:43.123867Z"},{"id":"PYSEC-2026-4088","title":"MCP Atlassian: Arbitrary file read/exfiltration via upload_attachment missing validate_safe_path()","description":"## Summary\n\nThe `upload_attachment` method in `confluence/attachments.py` reads and uploads arbitrary local files to Confluence without calling `validate_safe_path()`. Both download methods (`download_attachment` at line 223, `download_content_attachments` at line 272) correctly call `validate_safe_path()` before writing files, but the upload path at lines 35-79 skips this check entirely.\n\nAn AI agent connected via MCP (or an attacker influencing that agent through prompt injection) can read any file on the host and exfiltrate it by uploading it as a Confluence page attachment.\n\n## Vulnerable Code\n\nFile: `src/mcp_atlassian/confluence/attachments.py`, lines 62-79\n\n```python\n# No validate_safe_path() call anywhere in this method\nif not os.path.isabs(file_path):\n    file_path = os.path.abspath(file_path)\n\nif not os.path.exists(file_path):\n    return {\"success\": False, \"error\": f\"File not found: {file_path}\"}\n\nfilename = os.path.basename(file_path)\nattachment = self._upload_attachment_direct(\n    content_id, file_path, filename, comment, minor_edit\n)\n```\n\nThe `validate_safe_path` function is already imported at line 9 of the same file, and used in the download methods. It was just not added to the upload path.\n\n## Proof of Concept\n\nTested with mcp-atlassian 0.21.1 on Python 3.11 (EC2, Amazon Linux 2023).\n\n```python\nimport inspect\nfrom mcp_atlassian.confluence.attachments import AttachmentsMixin\n\n# Confirm: no validate_safe_path in upload\nsource = inspect.getsource(AttachmentsMixin.upload_attachment)\nassert \"validate_safe_path\" not in source  # passes\n\n# Confirm: validate_safe_path IS in downloads\nassert \"validate_safe_path\" in inspect.getsource(AttachmentsMixin.download_attachment)  # passes\nassert \"validate_safe_path\" in inspect.getsource(AttachmentsMixin.download_content_attachments)  # passes\n```\n\nAn MCP tool call like this reads /etc/passwd and uploads it to Confluence:\n\n```json\n{\"tool\": \"confluence_upload_attachment\", \"arguments\": {\"content_id\": \"123456\", \"file_path\": \"/etc/passwd\"}}\n```\n\n## Impact\n\nExfiltration of any file readable by the MCP server process: SSH keys, AWS credentials, .env files, /etc/passwd, application secrets. Data leaves the local machine and lands on a remote Confluence instance accessible to other users.\n\n## Suggested Fix\n\nAdd `validate_safe_path(file_path)` before the `os.path.exists()` check in `upload_attachment`, matching the existing pattern in the download methods. The function is already imported.","status":"published","published":"2026-10-01T16:38:36.571517Z","modified":"2026-10-01T17:45:10.028598626Z","cvss":[{"version":"3.1","score":7.7,"vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N","level":"high"}],"updated_at":"2026-11-02T15:52:57.255153Z"}]}}
