GitHub Advisoryadvisory · PyPI
GHSA-cc5h-2pwp-pvcc MCP Atlassian: Unauthenticated arbitrary local file read via upload_attachment file_path, chained with missing auth on streamable-http transport
HIGH
Official page ↗
- Aliases
- CVE-2026-77248
- Ecosystem
- PyPI
- Packages
- mcp-atlassian
- Severity
- High
- CVSS vector
- CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N
- Weaknesses
- CWE-22
- Reviewed
- 2026-09-22
Affected packages
• PyPI mcp-atlassian: < 0.22.0 → fixed in 0.22.0
Description
Summary
In 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.
Details
Missing authentication (transport):
• streamable-http binds `0.0.0.0` by default (`src/mcp_atlassian/__init__.py:151`).
• 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`).
• `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`).
• `_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.
Arbitrary file read (sink):
• `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).
Proof of Concept
```
unauthenticated (no Authorization header) against a default streamable-http deployment:
tools/call upload_attachment { "file_path": "/proc/self/environ", "page_id": "" }
then read it back:
tools/call download_attachment { ... } # returns the bytes (base64) -> operator's ATLASSIAN token + .env secrets
```
Impact
Unauthenticated 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).
Suggested fix
Require 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.
Affected
`mcp-atlassian` <= 0.21.1.
Related
Alias · CVE (1)
- CVE-2026-77248 MCP Atlassian is a Model Context Protocol (MCP) server for Atlassian products (Confluence and Jira). vulnerability
Weakness · CWE (1)
- CWE-22 Improper Limitation of a Pathname to a Restricted Directory weakness
References
- https://github.com/sooperset/mcp-atlassian/security/advisories/GHSA-cc5h-2pwp-pvcc web
- https://github.com/sooperset/mcp-atlassian/pull/1448 web
- https://github.com/sooperset/mcp-atlassian/commit/b041733473f95119dd539542a43c280737a8e460 web
- https://github.com/sooperset/mcp-atlassian package
- https://github.com/sooperset/mcp-atlassian/releases/tag/v0.22.0 web