Skip to content

Conversation

@renovate
Copy link
Contributor

@renovate renovate bot commented Jan 6, 2026

This PR contains the following updates:

Package Change Age Confidence
bokeh ==2.4.3==3.8.2 age confidence

GitHub Vulnerability Alerts

CVE-2026-21883

This vulnerability allows for Cross-Site WebSocket Hijacking (CSWSH) of a deployed Bokeh server instance.

Scope

This vulnerability is only relevant to deployed Bokeh server instances. There is no impact on static HTML output, standalone embedded plots, or Jupyter notebook usage.

This vulnerability does not prevent any requirements for up-front authentication on Bokeh servers that have authentication hooks in place, and cannot be used to make Bokeh servers deployed on private, internal networks accessible outside those networks.

Impact

If a Bokeh server is configured with an allowlist (e.g., dashboard.corp), an attacker can register a domain like dashboard.corp.attacker.com (or use a subdomain if applicable) and lure a victim to visit it. The malicious site can then initiate a WebSocket connection to the vulnerable Bokeh server. Since the Origin header (e.g., http://dashboard.corp.attacker.com/) matches the allowlist according to the flawed logic, the connection is accepted.

Once connected, the attacker can interact with the Bokeh server on behalf of the victim, potentially accessing sensitive data, or modifying visualizations.

Patches

Patched in versions 3.8.2 and later.

Workarounds

None

Technical description

The match_host function in src/bokeh/server/util.py contains a flaw in how it compares hostnames against the allowlist patterns. The function uses Python's zip() function to iterate over the parts of the hostname and the pattern simultaneously. However, zip() stops iteration when the shortest iterable is exhausted.

Because the code only checks if the pattern is longer than the host (lines 232-233), but fails to check if the host is longer than the pattern, a host that starts with the pattern (but has additional segments) will successfully match.

For example, if the allowlist is configured to ['[example.com](http://example.com/)'], the function will incorrectly validate [example.com.bad.com](http://example.com.evil.com/) as a match:

  1. host parts: ['example', 'com', 'bad', 'com']
  2. pattern parts: ['example', 'com']
  3. zip compares example==example (OK) and com==com (OK).
  4. Iteration stops, and the function returns True.

Release Notes

bokeh/bokeh (bokeh)

v3.8.2

Compare Source

v3.8.1

Compare Source

v3.8.0

Compare Source

v3.7.3

Compare Source

v3.7.2

Compare Source

v3.7.1

Compare Source

v3.7.0

Compare Source

v3.6.3

Compare Source

v3.6.2

Compare Source

v3.6.1

Compare Source

v3.6.0

Compare Source

v3.5.2

Compare Source

v3.5.1

Compare Source

v3.5.0

Compare Source

v3.4.3

Compare Source

v3.4.2

Compare Source

v3.4.1

Compare Source

v3.4.0

Compare Source

v3.3.4

Compare Source

v3.3.3

Compare Source

v3.3.2

Compare Source

v3.3.1

Compare Source

v3.3.0

Compare Source

v3.2.2

Compare Source

v3.2.1

Compare Source

v3.2.0

Compare Source

v3.1.1

Compare Source

v3.1.0

Compare Source

v3.0.3

Compare Source

v3.0.2

Compare Source

v3.0.1

Compare Source

v3.0.0

Compare Source


Configuration

📅 Schedule: Branch creation - "" (UTC), Automerge - At any time (no schedule defined).

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant