{"id":"CVE-2026-77248","aliases":["EUVD-2026-84763","GHSA-cc5h-2pwp-pvcc","PYSEC-2026-4089"],"status":"published","title":"MCP Atlassian: Unauthenticated arbitrary local file read via upload_attachment file_path, chained with missing auth on streamable-http transport","description":"MCP Atlassian is a Model Context Protocol (MCP) server for Atlassian products (Confluence and Jira). Prior to 0.22.0, the streamable HTTP transport accepts requests without a user identity and falls back to operator credentials, while upload_attachment accepts an unrestricted file_path. An unauthenticated network caller can read files available to the MCP process, upload them to an attacker-selected Jira issue or Confluence page, and retrieve the contents. The advisory traces the vulnerable input and processing flow through streamable-http, UserTokenMiddleware, upload_attachment, file_path, and _get_fetcher, which identify the affected entry points, controls, and code paths. This issue is fixed in version 0.22.0.","severity":{"version":"3.1","score":8.6,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N","level":"high","assessor":"cna","from":"cve"},"epss":{"day":"2026-11-10","score":0.00475,"percentile":0.41372,"model":"v2026.06.15"},"facts":{"in_kev":false,"known_exploited":false,"public_exploit":false,"fix_available":true},"cwes":["CWE-22","CWE-306"],"published":"2026-09-22T18:49:57Z","modified":"2026-10-28T02:30:20Z","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-cc5h-2pwp-pvcc","tags":["x_refsource_CONFIRM","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://github.com/advisories/GHSA-cc5h-2pwp-pvcc","tags":["advisory"]},{"url":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/77xxx/CVE-2026-77248.json","tags":["advisory"]},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2026-77248","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-77248","title":"MCP Atlassian: Unauthenticated arbitrary local file read via upload_attachment file_path, chained with missing auth on streamable-http transport","description":"MCP Atlassian is a Model Context Protocol (MCP) server for Atlassian products (Confluence and Jira). Prior to 0.22.0, the streamable HTTP transport accepts requests without a user identity and falls back to operator credentials, while upload_attachment accepts an unrestricted file_path. An unauthenticated network caller can read files available to the MCP process, upload them to an attacker-selected Jira issue or Confluence page, and retrieve the contents. The advisory traces the vulnerable input and processing flow through streamable-http, UserTokenMiddleware, upload_attachment, file_path, and _get_fetcher, which identify the affected entry points, controls, and code paths. This issue is fixed in version 0.22.0.","status":"published","published":"2026-09-22T18:49:57.295Z","modified":"2026-09-24T15:23:30.599Z","cvss":[{"version":"3.1","score":8.6,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N","level":"high","assessor":"cna"}],"cwes":["CWE-22","CWE-306"],"updated_at":"2026-11-02T14:20:15.712761Z"}],"euvd":[{"id":"EUVD-2026-84763","description":"MCP Atlassian is a Model Context Protocol (MCP) server for Atlassian products (Confluence and Jira). Prior to 0.22.0, the streamable HTTP transport accepts requests without a user identity and falls back to operator credentials, while upload_attachment accepts an unrestricted file_path. An unauthenticated network caller can read files available to the MCP process, upload them to an attacker-selected Jira issue or Confluence page, and retrieve the contents. The advisory traces the vulnerable input and processing flow through streamable-http, UserTokenMiddleware, upload_attachment, file_path, and _get_fetcher, which identify the affected entry points, controls, and code paths. This issue is fixed in version 0.22.0.","status":"published","published":"2026-09-22T18:49:57Z","modified":"2026-09-24T15:23:30Z","cvss":[{"version":"3.1","score":8.6,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N","level":"high"}],"updated_at":"2026-11-02T17:27:56.686358Z"}],"ghsa":[{"id":"GHSA-cc5h-2pwp-pvcc","title":"MCP Atlassian: Unauthenticated arbitrary local file read via upload_attachment file_path, chained with missing auth on streamable-http transport","description":"### Summary\nIn the documented multi-user HTTP deployment (`--transport streamable-http` with global operator Atlassian credentials), sooperset/mcp-atlassian exposes all tools to **unauthenticated network clients**, and the `upload_attachment` tool reads an attacker-supplied `file_path` with **no path validation**. Chained, an unauthenticated network attacker reads arbitrary files on the MCP server host (e.g. `/proc/self/environ` → the operator's Atlassian API token + `.env` secrets, `~/.ssh/id_rsa`, `/etc/passwd`) by uploading them to an attacker-chosen page/issue and reading them back.\n\n### Details\n**Missing authentication (transport):**\n- streamable-http binds `0.0.0.0` by default (`src/mcp_atlassian/__init__.py:151`).\n- The OAuth-proxy auth provider is opt-in (`ATLASSIAN_OAUTH_PROXY_ENABLE`, default false), so `main_mcp` is built with `auth=None` (`src/mcp_atlassian/servers/main.py:724-731, 813-817`).\n- `UserTokenMiddleware._parse_auth_header` sets `auth_validation_error` only for a *malformed* Authorization header; a request with **no** Authorization header passes through (`main.py:416-446, 582-595`).\n- `_get_fetcher` then falls through to the global credential fallback using the operator's `.env` Atlassian token (`src/mcp_atlassian/servers/dependencies.py:644-676`). `check_write_access` gates only on read-only mode, not auth → read **and** write tools reachable.\n\n**Arbitrary file read (sink):**\n- `upload_attachment`'s `file_path` flows unsanitized into `open(file_path, 'rb')` — Confluence `src/mcp_atlassian/confluence/attachments.py:477` (from `servers/confluence.py:1294-1369`); Jira `src/mcp_atlassian/jira/attachments.py:386` (from `servers/jira.py:1609-1673`). No `validate_safe_path` / allowlist (contrast the download flow, hardened after CVE-2026-27825).\n\n### Proof of Concept\n```\n# unauthenticated (no Authorization header) against a default streamable-http deployment:\ntools/call upload_attachment { \"file_path\": \"/proc/self/environ\", \"page_id\": \"\u003cattacker-chosen\u003e\" }\n# then read it back:\ntools/call download_attachment { ... }   # returns the bytes (base64) -\u003e operator's ATLASSIAN token + .env secrets\n```\n\n### Impact\nUnauthenticated arbitrary local file read on the MCP server host — including the operator's Atlassian API token and `.env` secrets — a boundary the Atlassian-scoped tool must not cross, plus unauthenticated use of every read/write Atlassian tool as the operator's (often admin) principal.  Distinct from GHSA-xjgw-4wvw-rgm4 (file *write* via download_path) and GHSA-7r34-79r5-rcc9 (URL-header SSRF). \n\n### Suggested fix\nRequire authentication on the streamable-http transport by default (do not fall back to operator global credentials for unauthenticated requests); apply `validate_safe_path`/allowlist to `file_path` in `upload_attachment` as the download flow already does.\n\n### Affected\n`mcp-atlassian` \u003c= 0.21.1.","status":"published","published":"2026-09-22T20:34:43Z","modified":"2026-09-22T20:34:45Z","cvss":[{"version":"3.1","score":8.6,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N","level":"high"}],"cwes":["CWE-22"],"updated_at":"2026-11-02T14:41:19.455935Z"}],"nvd":[{"id":"CVE-2026-77248","description":"MCP Atlassian is a Model Context Protocol (MCP) server for Atlassian products (Confluence and Jira). Prior to 0.22.0, the streamable HTTP transport accepts requests without a user identity and falls back to operator credentials, while upload_attachment accepts an unrestricted file_path. An unauthenticated network caller can read files available to the MCP process, upload them to an attacker-selected Jira issue or Confluence page, and retrieve the contents. The advisory traces the vulnerable input and processing flow through streamable-http, UserTokenMiddleware, upload_attachment, file_path, and _get_fetcher, which identify the affected entry points, controls, and code paths. This issue is fixed in version 0.22.0.","status":"published","published":"2026-09-22T19:16:49.027Z","modified":"2026-09-28T13:33:54.863Z","cvss":[{"version":"3.1","score":8.6,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N","level":"high","assessor":"secondary"}],"cwes":["CWE-22","CWE-306"],"updated_at":"2026-11-02T14:12:50.368368Z"}],"osv":[{"id":"CVE-2026-77248","title":"MCP Atlassian: Unauthenticated arbitrary local file read via upload_attachment file_path, chained with missing auth on streamable-http transport","description":"MCP Atlassian is a Model Context Protocol (MCP) server for Atlassian products (Confluence and Jira). Prior to 0.22.0, the streamable HTTP transport accepts requests without a user identity and falls back to operator credentials, while upload_attachment accepts an unrestricted file_path. An unauthenticated network caller can read files available to the MCP process, upload them to an attacker-selected Jira issue or Confluence page, and retrieve the contents. The advisory traces the vulnerable input and processing flow through streamable-http, UserTokenMiddleware, upload_attachment, file_path, and _get_fetcher, which identify the affected entry points, controls, and code paths. This issue is fixed in version 0.22.0.","status":"published","published":"2026-09-22T18:49:57.295Z","modified":"2026-10-28T02:30:20.676795389Z","cvss":[{"version":"3.1","score":8.6,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N","level":"high"}],"cwes":["CWE-22","CWE-306"],"updated_at":"2026-11-02T15:45:17.102988Z"},{"id":"GHSA-cc5h-2pwp-pvcc","title":"MCP Atlassian: Unauthenticated arbitrary local file read via upload_attachment file_path, chained with missing auth on streamable-http transport","description":"### Summary\nIn the documented multi-user HTTP deployment (`--transport streamable-http` with global operator Atlassian credentials), sooperset/mcp-atlassian exposes all tools to **unauthenticated network clients**, and the `upload_attachment` tool reads an attacker-supplied `file_path` with **no path validation**. Chained, an unauthenticated network attacker reads arbitrary files on the MCP server host (e.g. `/proc/self/environ` → the operator's Atlassian API token + `.env` secrets, `~/.ssh/id_rsa`, `/etc/passwd`) by uploading them to an attacker-chosen page/issue and reading them back.\n\n### Details\n**Missing authentication (transport):**\n- streamable-http binds `0.0.0.0` by default (`src/mcp_atlassian/__init__.py:151`).\n- The OAuth-proxy auth provider is opt-in (`ATLASSIAN_OAUTH_PROXY_ENABLE`, default false), so `main_mcp` is built with `auth=None` (`src/mcp_atlassian/servers/main.py:724-731, 813-817`).\n- `UserTokenMiddleware._parse_auth_header` sets `auth_validation_error` only for a *malformed* Authorization header; a request with **no** Authorization header passes through (`main.py:416-446, 582-595`).\n- `_get_fetcher` then falls through to the global credential fallback using the operator's `.env` Atlassian token (`src/mcp_atlassian/servers/dependencies.py:644-676`). `check_write_access` gates only on read-only mode, not auth → read **and** write tools reachable.\n\n**Arbitrary file read (sink):**\n- `upload_attachment`'s `file_path` flows unsanitized into `open(file_path, 'rb')` — Confluence `src/mcp_atlassian/confluence/attachments.py:477` (from `servers/confluence.py:1294-1369`); Jira `src/mcp_atlassian/jira/attachments.py:386` (from `servers/jira.py:1609-1673`). No `validate_safe_path` / allowlist (contrast the download flow, hardened after CVE-2026-27825).\n\n### Proof of Concept\n```\n# unauthenticated (no Authorization header) against a default streamable-http deployment:\ntools/call upload_attachment { \"file_path\": \"/proc/self/environ\", \"page_id\": \"\u003cattacker-chosen\u003e\" }\n# then read it back:\ntools/call download_attachment { ... }   # returns the bytes (base64) -\u003e operator's ATLASSIAN token + .env secrets\n```\n\n### Impact\nUnauthenticated arbitrary local file read on the MCP server host — including the operator's Atlassian API token and `.env` secrets — a boundary the Atlassian-scoped tool must not cross, plus unauthenticated use of every read/write Atlassian tool as the operator's (often admin) principal.  Distinct from GHSA-xjgw-4wvw-rgm4 (file *write* via download_path) and GHSA-7r34-79r5-rcc9 (URL-header SSRF). \n\n### Suggested fix\nRequire authentication on the streamable-http transport by default (do not fall back to operator global credentials for unauthenticated requests); apply `validate_safe_path`/allowlist to `file_path` in `upload_attachment` as the download flow already does.\n\n### Affected\n`mcp-atlassian` \u003c= 0.21.1.","status":"published","published":"2026-09-22T20:34:43Z","modified":"2026-10-01T17:56:13.146670892Z","cvss":[{"version":"3.1","score":8.6,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N","level":"high"}],"cwes":["CWE-22"],"updated_at":"2026-11-02T15:46:44.927642Z"},{"id":"PYSEC-2026-4089","title":"MCP Atlassian: Unauthenticated arbitrary local file read via upload_attachment file_path, chained with missing auth on streamable-http transport","description":"### Summary\nIn the documented multi-user HTTP deployment (`--transport streamable-http` with global operator Atlassian credentials), sooperset/mcp-atlassian exposes all tools to **unauthenticated network clients**, and the `upload_attachment` tool reads an attacker-supplied `file_path` with **no path validation**. Chained, an unauthenticated network attacker reads arbitrary files on the MCP server host (e.g. `/proc/self/environ` → the operator's Atlassian API token + `.env` secrets, `~/.ssh/id_rsa`, `/etc/passwd`) by uploading them to an attacker-chosen page/issue and reading them back.\n\n### Details\n**Missing authentication (transport):**\n- streamable-http binds `0.0.0.0` by default (`src/mcp_atlassian/__init__.py:151`).\n- The OAuth-proxy auth provider is opt-in (`ATLASSIAN_OAUTH_PROXY_ENABLE`, default false), so `main_mcp` is built with `auth=None` (`src/mcp_atlassian/servers/main.py:724-731, 813-817`).\n- `UserTokenMiddleware._parse_auth_header` sets `auth_validation_error` only for a *malformed* Authorization header; a request with **no** Authorization header passes through (`main.py:416-446, 582-595`).\n- `_get_fetcher` then falls through to the global credential fallback using the operator's `.env` Atlassian token (`src/mcp_atlassian/servers/dependencies.py:644-676`). `check_write_access` gates only on read-only mode, not auth → read **and** write tools reachable.\n\n**Arbitrary file read (sink):**\n- `upload_attachment`'s `file_path` flows unsanitized into `open(file_path, 'rb')` — Confluence `src/mcp_atlassian/confluence/attachments.py:477` (from `servers/confluence.py:1294-1369`); Jira `src/mcp_atlassian/jira/attachments.py:386` (from `servers/jira.py:1609-1673`). No `validate_safe_path` / allowlist (contrast the download flow, hardened after CVE-2026-27825).\n\n### Proof of Concept\n```\n# unauthenticated (no Authorization header) against a default streamable-http deployment:\ntools/call upload_attachment { \"file_path\": \"/proc/self/environ\", \"page_id\": \"\u003cattacker-chosen\u003e\" }\n# then read it back:\ntools/call download_attachment { ... }   # returns the bytes (base64) -\u003e operator's ATLASSIAN token + .env secrets\n```\n\n### Impact\nUnauthenticated arbitrary local file read on the MCP server host — including the operator's Atlassian API token and `.env` secrets — a boundary the Atlassian-scoped tool must not cross, plus unauthenticated use of every read/write Atlassian tool as the operator's (often admin) principal.  Distinct from GHSA-xjgw-4wvw-rgm4 (file *write* via download_path) and GHSA-7r34-79r5-rcc9 (URL-header SSRF). \n\n### Suggested fix\nRequire authentication on the streamable-http transport by default (do not fall back to operator global credentials for unauthenticated requests); apply `validate_safe_path`/allowlist to `file_path` in `upload_attachment` as the download flow already does.\n\n### Affected\n`mcp-atlassian` \u003c= 0.21.1.","status":"published","published":"2026-10-01T16:38:34.842921Z","modified":"2026-10-01T17:45:10.923271578Z","cvss":[{"version":"3.1","score":8.6,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N","level":"high"}],"updated_at":"2026-11-02T15:52:57.255153Z"}]}}
