CVE-2026-23528

6.1 MEDIUM

📋 TL;DR

This cross-site scripting (XSS) vulnerability in Dask distributed allows attackers to craft malicious URLs that execute arbitrary code in Jupyter Lab when clicked. It affects systems running Jupyter Lab, jupyter-server-proxy, and Dask distributed together. Users who click phishing links while these services are running on default localhost ports are vulnerable.

💻 Affected Systems

Products:
  • Dask distributed
  • Jupyter Lab
  • jupyter-server-proxy
Versions: All versions prior to 2026.1.0
Operating Systems: All operating systems running affected software
Default Config Vulnerable: ⚠️ Yes
Notes: Requires all three components running together: Jupyter Lab, jupyter-server-proxy, and Dask distributed. Most vulnerable when using default localhost ports.

📦 What is this software?

⚠️ Risk & Real-World Impact

🔴

Worst Case

Full remote code execution in Jupyter kernel, allowing attacker to run arbitrary commands, access sensitive data, or pivot to other systems.

🟠

Likely Case

Limited code execution within Jupyter session, potentially stealing session data or performing unauthorized actions within the Jupyter environment.

🟢

If Mitigated

No impact if proper URL validation and input sanitization are implemented, or if services aren't running together.

🌐 Internet-Facing: MEDIUM - Requires user interaction (clicking malicious link) but can be delivered via phishing; risk increases if Jupyter/Dask are exposed to internet.
🏢 Internal Only: MEDIUM - Internal phishing attacks could still exploit this if users access malicious links within the network.

🎯 Exploit Status

Public PoC: ✅ No
Weaponized: LIKELY
Unauthenticated Exploit: ⚠️ Yes
Complexity: LOW

Exploitation requires user interaction (clicking malicious URL) but crafting the URL is straightforward. No authentication bypass needed.

🛠️ Fix & Mitigation

✅ Official Fix

Patch Version: 2026.1.0

Vendor Advisory: https://github.com/dask/distributed/security/advisories/GHSA-c336-7962-wfj2

Restart Required: Yes

Instructions:

1. Upgrade Dask distributed to version 2026.1.0 or later using pip: 'pip install --upgrade dask-distributed==2026.1.0'. 2. Restart all Dask and Jupyter services. 3. Verify the fix by checking version and testing dashboard functionality.

🔧 Temporary Workarounds

Disable Jupyter proxy integration

all

Run Dask dashboard separately from Jupyter Lab without jupyter-server-proxy integration

# Run Dask dashboard on separate port
dask scheduler --dashboard-address :8787
# Access dashboard directly instead of through Jupyter

Use non-default ports

all

Change default ports for Jupyter and Dask services to reduce predictability of phishing attacks

# Jupyter Lab on custom port
jupyter lab --port 8889
# Dask on custom port
dask scheduler --dashboard-address :8790

🧯 If You Can't Patch

  • Isolate Jupyter and Dask services on separate networks or containers
  • Implement strict URL filtering and input validation at proxy/load balancer level

🔍 How to Verify

Check if Vulnerable:

Check if running Dask distributed <2026.1.0 with Jupyter Lab and jupyter-server-proxy. Review configuration for default localhost ports.

Check Version:

python -c "import distributed; print(distributed.__version__)"

Verify Fix Applied:

Confirm Dask distributed version is >=2026.1.0 and test dashboard functionality through Jupyter proxy.

📡 Detection & Monitoring

Log Indicators:

  • Unusual error pages in Dask dashboard logs
  • Suspicious URL patterns in Jupyter access logs
  • Unexpected Python kernel executions in Jupyter logs

Network Indicators:

  • HTTP requests to Dask dashboard with crafted query parameters
  • Traffic patterns suggesting phishing link clicks

SIEM Query:

source="jupyter.log" AND ("error page" OR "malformed url" OR "xss") OR source="dask.log" AND "dashboard" AND "error"

🔗 References

📤 Share & Export