CVE-2026-23528 Overview
CVE-2026-23528 is a Cross-Site Scripting (XSS) vulnerability in Dask distributed, a distributed task scheduler for Dask. When Jupyter Lab, jupyter-server-proxy, and Dask distributed are all run together, attackers can craft a malicious URL that exploits an XSS flaw in the Dask dashboard to execute arbitrary code through the Jupyter Python kernel.
Critical Impact
Attackers can execute arbitrary code in Jupyter Python kernels by tricking users into clicking malicious phishing URLs that exploit the XSS vulnerability in the Dask dashboard via Jupyter Lab proxy.
Affected Products
- Dask distributed versions prior to 2026.1.0
- Environments running Jupyter Lab with jupyter-server-proxy
- Systems using default localhost ports for Jupyter Lab and Dask
Discovery Timeline
- January 16, 2026 - CVE-2026-23528 published to NVD
- January 16, 2026 - Last updated in NVD database
Technical Details for CVE-2026-23528
Vulnerability Analysis
This XSS vulnerability arises from insufficient input sanitization in the Dask dashboard's error page rendering. When Dask distributed runs alongside Jupyter Lab and jupyter-server-proxy, the dashboard becomes accessible through the Jupyter Lab proxy. The vulnerability allows attackers to inject malicious scripts that execute in the context of the user's Jupyter session, potentially leading to arbitrary code execution in the default Jupyter Python kernel.
The attack chain requires user interaction—specifically, clicking on a crafted phishing URL. The attack assumes that the target is running Jupyter Lab and Dask on localhost using default ports, which is common in development and data science environments.
Root Cause
The root cause is a missing HTML escape mechanism in the Dask distributed HTTP proxy module (distributed/http/proxy.py). User-controlled input rendered on error pages was not properly sanitized, allowing script injection through specially crafted URL parameters.
Attack Vector
The attack is network-based and requires user interaction. An attacker crafts a phishing URL that, when clicked, opens an error page in the Dask Dashboard via the Jupyter Lab proxy. The malicious payload embedded in the URL is then executed in the user's browser context, which can trigger code execution in the Jupyter Python kernel.
The attack leverages the trust relationship between Jupyter Lab and the proxied Dask dashboard to escalate from a client-side XSS to server-side code execution.
# Security patch in distributed/http/proxy.py
# Source: https://github.com/dask/distributed/commit/ab72092a8a938923c2bb51a2cd14ca26614827fa
from __future__ import annotations
+import html
import logging
from tornado import web
The fix adds the html module import, enabling proper HTML escaping of user-controlled content before rendering, preventing script injection attacks.
Detection Methods for CVE-2026-23528
Indicators of Compromise
- Unusual URL patterns in web server logs containing encoded JavaScript or HTML tags targeting Dask dashboard endpoints
- Unexpected code execution in Jupyter kernels without user initiation
- Browser console errors indicating blocked scripts or CSP violations on Dask dashboard pages
Detection Strategies
- Monitor web application logs for requests containing suspicious parameters with HTML/JavaScript content targeting the Dask dashboard proxy
- Implement Content Security Policy (CSP) headers to detect and block inline script execution
- Review Jupyter kernel execution logs for commands initiated through unexpected browser interactions
Monitoring Recommendations
- Enable verbose logging for jupyter-server-proxy to track proxied requests to the Dask dashboard
- Monitor for phishing campaigns targeting data science teams that reference localhost URLs
- Set up alerts for anomalous Jupyter kernel activity patterns
How to Mitigate CVE-2026-23528
Immediate Actions Required
- Upgrade Dask distributed to version 2026.1.0 or later immediately
- Review Jupyter kernel execution logs for any suspicious activity
- Educate users about the risks of clicking on untrusted URLs, especially those referencing localhost services
Patch Information
The vulnerability is fixed in Dask distributed version 2026.1.0. The patch adds proper HTML escaping using Python's built-in html module to sanitize user-controlled input before rendering in error pages. The fix was applied in commit ab72092a8a938923c2bb51a2cd14ca26614827fa.
For detailed patch information, see the GitHub Security Advisory and the commit containing the fix.
Workarounds
- Restrict access to the Dask dashboard by configuring network-level controls or authentication
- Disable jupyter-server-proxy if not required for your workflow
- Configure Jupyter Lab to run on non-default ports and avoid exposing services on localhost without authentication
# Upgrade Dask distributed to the patched version
pip install --upgrade distributed>=2026.1.0
# Verify the installed version
pip show distributed | grep Version
Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.

