CVE-2026-21883

N/A Unknown

📋 TL;DR

This vulnerability allows attackers to bypass Bokeh server allowlist protections via domain suffix matching. Attackers can register malicious domains that end with allowed domain names (e.g., dashboard.corp.attacker.com matching dashboard.corp) to hijack WebSocket connections. This affects organizations using Bokeh servers with allowlist configurations in versions 3.8.1 and below.

💻 Affected Systems

Products:
  • Bokeh
Versions: 3.8.1 and below
Operating Systems: All
Default Config Vulnerable: ✅ No
Notes: Only affects servers configured with allowlists (--allow-websocket-origin flag or similar configuration). Default configurations without allowlists are not vulnerable.

⚠️ Manual Verification Required

This CVE does not have specific version information in our database, so automatic vulnerability detection cannot determine if your system is affected.

Why? The CVE database entry doesn't specify which versions are vulnerable (no version ranges provided by the vendor/NVD).

🔒 Custom verification scripts are available for registered users. Sign up free to download automated test scripts.

Recommended Actions:
  1. Review the CVE details at NVD
  2. Check vendor security advisories for your specific version
  3. Test if the vulnerability is exploitable in your environment
  4. Consider updating to the latest version as a precaution

⚠️ Risk & Real-World Impact

🔴

Worst Case

Attackers gain full control over Bokeh visualizations, access sensitive data displayed in dashboards, modify or inject malicious content into business intelligence tools, and potentially pivot to internal systems.

🟠

Likely Case

Data exfiltration from Bokeh dashboards, unauthorized modification of visualizations, and potential session hijacking of users interacting with vulnerable servers.

🟢

If Mitigated

Limited impact with proper network segmentation, but still allows unauthorized WebSocket connections from malicious domains matching allowlist patterns.

🌐 Internet-Facing: HIGH - Internet-facing Bokeh servers with allowlists are directly exploitable by attackers registering malicious domains.
🏢 Internal Only: MEDIUM - Internal servers require attacker to compromise internal network access or trick users into visiting malicious internal domains.

🎯 Exploit Status

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

Exploitation requires registering a malicious domain that ends with an allowed domain name and tricking users to visit it. Technical details and proof-of-concept are publicly available.

🛠️ Fix & Mitigation

✅ Official Fix

Patch Version: 3.8.2

Vendor Advisory: https://github.com/bokeh/bokeh/security/advisories/GHSA-793v-589g-574v

Restart Required: Yes

Instructions:

1. Upgrade Bokeh to version 3.8.2 or later using pip: pip install --upgrade bokeh>=3.8.2
2. Restart all Bokeh server instances
3. Verify the fix by checking the version: python -c "import bokeh; print(bokeh.__version__)"

🔧 Temporary Workarounds

Disable allowlist or use strict matching

all

Remove --allow-websocket-origin configurations or implement strict domain matching at application layer

Remove --allow-websocket-origin flags from Bokeh server startup commands

Network isolation

linux

Restrict Bokeh server access to trusted networks only using firewall rules

iptables -A INPUT -p tcp --dport <bokeh_port> -s <trusted_network> -j ACCEPT
iptables -A INPUT -p tcp --dport <bokeh_port> -j DROP

🧯 If You Can't Patch

  • Implement reverse proxy with strict Origin header validation
  • Use network segmentation to isolate Bokeh servers from untrusted networks

🔍 How to Verify

Check if Vulnerable:

Check if Bokeh version is 3.8.1 or below AND server uses allowlist configuration (--allow-websocket-origin flag)

Check Version:

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

Verify Fix Applied:

Verify Bokeh version is 3.8.2 or higher and test WebSocket connections from domains that should be blocked

📡 Detection & Monitoring

Log Indicators:

  • WebSocket connections from domains with suspicious suffixes matching allowlist patterns
  • Multiple failed Origin validation attempts

Network Indicators:

  • WebSocket traffic to Bokeh servers from unexpected domains
  • DNS requests for domains ending with allowed domain patterns

SIEM Query:

websocket AND (origin CONTAINS '.attacker.' OR origin MATCHES '.*\.corp\.[^.]+\.com')

🔗 References

📤 Share & Export