{"id":"CVE-2026-77248","aliases":["GHSA-cc5h-2pwp-pvcc","PYSEC-2026-4089"],"url":"https://o3.security/vulnerability/CVE-2026-77248","summary":"MCP Atlassian: Unauthenticated arbitrary local file read via upload_attachment file_path, chained with missing auth on streamable-http transport","details":"### 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\": \"<attacker-chosen>\" }\n# then read it back:\ntools/call download_attachment { ... }   # returns the bytes (base64) -> 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` <= 0.21.1.","published":"2026-09-22T18:49:57.295Z","modified":"2026-10-21T02:53:49.841659060Z","cvss":{"score":8.6,"severity":"HIGH","vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N"},"epss":null,"cisaKev":null,"exploitsKnown":null,"affectedPackages":[{"ecosystem":"PyPI","name":"mcp-atlassian","fixedVersion":"0.22.0"}],"fix":{"url":"https://github.com/sooperset/mcp-atlassian/commit/b041733473f95119dd539542a43c280737a8e460","label":"sooperset/mcp-atlassian@b041733"},"references":[{"type":"WEB","url":"https://github.com/sooperset/mcp-atlassian/releases/tag/v0.22.0"},{"type":"ADVISORY","url":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/77xxx/CVE-2026-77248.json"},{"type":"ADVISORY","url":"https://github.com/sooperset/mcp-atlassian/security/advisories/GHSA-cc5h-2pwp-pvcc"},{"type":"ADVISORY","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-77248"},{"type":"FIX","url":"https://github.com/sooperset/mcp-atlassian/commit/b041733473f95119dd539542a43c280737a8e460"},{"type":"FIX","url":"https://github.com/sooperset/mcp-atlassian/pull/1448"},{"type":"PACKAGE","url":"https://github.com/sooperset/mcp-atlassian"}],"provenance":{"sources":["OSV.dev","FIRST.org (EPSS)"],"lastVerified":"2026-10-21T02:53:49.841659060Z"}}