Every CVE Search/ Get API key

CVE-2026-86049

Jupyter Server: 5xx request logging leaks token-bearing Referer header values

7.1 HighFix available

Jupyter Server is the backend for Jupyter web applications. Prior to version 2.21.0, the 5xx request logging path in jupyter_server/log.py copies the Referer header into a JSON header block without applying the token scrubbing used for the request URI. A request that returns HTTP 500 while the Referer contains a token-bearing URL can therefore write that token to server logs in plaintext. An attacker who can read those logs can recover the token and use the affected user's Jupyter Server permissions. This issue is fixed in version 2.21.0.

Attack profile

How easy it is to exploit

Attack vector
Network
Complexity
High
Privileges needed
Low
User interaction
Required

What an attacker can affect

Confidentiality
High
Integrity
High
Availability
High

Exploit likelihood

0.42%Up 0.2 points since Sep 18, 2026
90%50%10%1%

What each source reports

CVE List Score used 7.1

Jupyter Server: 5xx request logging leaks token-bearing Referer header values

Jupyter Server is the backend for Jupyter web applications. Prior to version 2.21.0, the 5xx request logging path in jupyter_server/log.py copies the Referer header into a JSON header block without applying the token scrubbing used for the request URI. A request that returns HTTP 500 while the Referer contains a token-bearing URL can therefore write that token to server logs in plaintext. An attacker who can read those logs can recover the token and use the affected user's Jupyter Server permissions. This issue is fixed in version 2.21.0.

Record
CVE-2026-86049
CVSS 3.1
7.1 HighCVSS:3.1/AV:N/AC:H/PR:L/UI:R/S:U/C:H/I:H/A:H
Weakness
CWE-532
Updated
2026-11-02
EUVDEUVD-2026-82436 7.1

Jupyter Server is the backend for Jupyter web applications. Prior to version 2.21.0, the 5xx request logging path in jupyter_server/log.py copies the Referer header into a JSON header block without applying the token scrubbing used for the request URI. A request that returns HTTP 500 while the Referer contains a token-bearing URL can therefore write that token to server logs in plaintext. An attacker who can read those logs can recover the token and use the affected user's Jupyter Server permissions. This issue is fixed in version 2.21.0.

Record
EUVD-2026-82436
CVSS 3.1
7.1 HighCVSS:3.1/AV:N/AC:H/PR:L/UI:R/S:U/C:H/I:H/A:H
Updated
2026-11-02
GitHub AdvisoriesGHSA-c3mw-737p-c7g2 7.1

Jupyter Server: 5xx request logging leaks token-bearing Referer header values

Summary

When a request returns a 500, jupyter_server/log.py logs a small JSON block of request headers.

The Referer header was copied into it as-is, so a token in the Referer URL ended up in the logs in plain text.

Impact

Anyone who can read the server logs can pick tokens out of these 500 entries. Tokens end up in the Referer during normal token-based login and launch flows.

Affected: all versions before 2.21.0.

PoC

Any malformed request that returns a 500 works:

curl -i -X POST \
  -H 'Content-Type: application/json' \
  -H 'Referer: http://127.0.0.1:8899/tree?token=REFERTOKEN' \
  --data '{"name":123}' \
  'http://127.0.0.1:8899/api/kernels?token=VALIDTOKEN'

The log shows the token twice, once raw and once redacted:

"Referer": "http://127.0.0.1:8899/tree?token=REFERTOKEN",
[E ... ServerApp] 500 POST /api/kernels?token=[secret] (...) referer=http://127.0.0.1:8899/tree?token=[secret]

Patches

Fixed in 2.21.0 by 5251352. Header values are now scrubbed before the block is logged. Upgrade to 2.21.0 or later.

Workarounds

Limit who can read the server logs. If you can, avoid flows that put the token in the URL.

Record
GHSA-c3mw-737p-c7g2
CVSS 3.1
7.1 HighCVSS:3.1/AV:N/AC:H/PR:L/UI:R/S:U/C:H/I:H/A:H
Weakness
CWE-532
Updated
2026-11-02
NVD 7.1

Jupyter Server is the backend for Jupyter web applications. Prior to version 2.21.0, the 5xx request logging path in jupyter_server/log.py copies the Referer header into a JSON header block without applying the token scrubbing used for the request URI. A request that returns HTTP 500 while the Referer contains a token-bearing URL can therefore write that token to server logs in plaintext. An attacker who can read those logs can recover the token and use the affected user's Jupyter Server permissions. This issue is fixed in version 2.21.0.

Record
CVE-2026-86049
CVSS 3.1
7.1 HighCVSS:3.1/AV:N/AC:H/PR:L/UI:R/S:U/C:H/I:H/A:H
Weakness
CWE-532
Updated
2026-11-02
OSV 7.1

Jupyter Server: 5xx request logging leaks token-bearing Referer header values

Jupyter Server is the backend for Jupyter web applications. Prior to version 2.21.0, the 5xx request logging path in jupyter_server/log.py copies the Referer header into a JSON header block without applying the token scrubbing used for the request URI. A request that returns HTTP 500 while the Referer contains a token-bearing URL can therefore write that token to server logs in plaintext. An attacker who can read those logs can recover the token and use the affected user's Jupyter Server permissions. This issue is fixed in version 2.21.0.

Record
CVE-2026-86049
CVSS 3.1
7.1 HighCVSS:3.1/AV:N/AC:H/PR:L/UI:R/S:U/C:H/I:H/A:H
Weakness
CWE-532
Updated
2026-11-02
OSVDEBIAN-CVE-2026-86049 7.1

Jupyter Server is the backend for Jupyter web applications. Prior to version 2.21.0, the 5xx request logging path in jupyter_server/log.py copies the Referer header into a JSON header block without applying the token scrubbing used for the request URI. A request that returns HTTP 500 while the Referer contains a token-bearing URL can therefore write that token to server logs in plaintext. An attacker who can read those logs can recover the token and use the affected user's Jupyter Server permissions. This issue is fixed in version 2.21.0.

Record
DEBIAN-CVE-2026-86049
CVSS 3.1
7.1 HighCVSS:3.1/AV:N/AC:H/PR:L/UI:R/S:U/C:H/I:H/A:H
Updated
2026-11-02
OSVGHSA-c3mw-737p-c7g2 7.1

Jupyter Server: 5xx request logging leaks token-bearing Referer header values

Summary

When a request returns a 500, jupyter_server/log.py logs a small JSON block of request headers.

The Referer header was copied into it as-is, so a token in the Referer URL ended up in the logs in plain text.

Impact

Anyone who can read the server logs can pick tokens out of these 500 entries. Tokens end up in the Referer during normal token-based login and launch flows.

Affected: all versions before 2.21.0.

PoC

Any malformed request that returns a 500 works:

curl -i -X POST \
  -H 'Content-Type: application/json' \
  -H 'Referer: http://127.0.0.1:8899/tree?token=REFERTOKEN' \
  --data '{"name":123}' \
  'http://127.0.0.1:8899/api/kernels?token=VALIDTOKEN'

The log shows the token twice, once raw and once redacted:

"Referer": "http://127.0.0.1:8899/tree?token=REFERTOKEN",
[E ... ServerApp] 500 POST /api/kernels?token=[secret] (...) referer=http://127.0.0.1:8899/tree?token=[secret]

Patches

Fixed in 2.21.0 by 5251352. Header values are now scrubbed before the block is logged. Upgrade to 2.21.0 or later.

Workarounds

Limit who can read the server logs. If you can, avoid flows that put the token in the URL.

Record
GHSA-c3mw-737p-c7g2
CVSS 3.1
7.1 HighCVSS:3.1/AV:N/AC:H/PR:L/UI:R/S:U/C:H/I:H/A:H
Weakness
CWE-532
Updated
2026-11-02
OSVPYSEC-2026-4054 7.1

Jupyter Server: 5xx request logging leaks token-bearing Referer header values

Summary

When a request returns a 500, jupyter_server/log.py logs a small JSON block of request headers.

The Referer header was copied into it as-is, so a token in the Referer URL ended up in the logs in plain text.

Impact

Anyone who can read the server logs can pick tokens out of these 500 entries. Tokens end up in the Referer during normal token-based login and launch flows.

Affected: all versions before 2.21.0.

PoC

Any malformed request that returns a 500 works:

curl -i -X POST \
  -H 'Content-Type: application/json' \
  -H 'Referer: http://127.0.0.1:8899/tree?token=REFERTOKEN' \
  --data '{"name":123}' \
  'http://127.0.0.1:8899/api/kernels?token=VALIDTOKEN'

The log shows the token twice, once raw and once redacted:

"Referer": "http://127.0.0.1:8899/tree?token=REFERTOKEN",
[E ... ServerApp] 500 POST /api/kernels?token=[secret] (...) referer=http://127.0.0.1:8899/tree?token=[secret]

Patches

Fixed in 2.21.0 by 5251352. Header values are now scrubbed before the block is logged. Upgrade to 2.21.0 or later.

Workarounds

Limit who can read the server logs. If you can, avoid flows that put the token in the URL.

Record
PYSEC-2026-4054
CVSS 3.1
7.1 HighCVSS:3.1/AV:N/AC:H/PR:L/UI:R/S:U/C:H/I:H/A:H
Updated
2026-11-02
OSVUBUNTU-CVE-2026-86049 7.1

Jupyter Server is the backend for Jupyter web applications. Prior to version 2.21.0, the 5xx request logging path in jupyter_server/log.py copies the Referer header into a JSON header block without applying the token scrubbing used for the request URI. A request that returns HTTP 500 while the Referer contains a token-bearing URL can therefore write that token to server logs in plaintext. An attacker who can read those logs can recover the token and use the affected user's Jupyter Server permissions. This issue is fixed in version 2.21.0.

Record
UBUNTU-CVE-2026-86049
CVSS 3.1
7.1 HighCVSS:3.1/AV:N/AC:H/PR:L/UI:R/S:U/C:H/I:H/A:H
Updated
2026-11-02

Affected products

Affected packages

Affected packages
PackageAffectedFixed
jupyter-server
PyPI
through 2.20.0
2.21.0
jupyter-server
Debian:12
All versions, plus listed versions
1.23.3-11.23.3-22.14.0-12.14.2-12.14.2-2
Show 9 moreShow less
2.14.2-32.14.2-42.14.2-52.15.0-12.17.0-12.20.0-12.20.0-22.20.0-32.9.1-1
None known
jupyter-server
Debian:13
All versions, plus listed versions
2.15.0-12.17.0-12.20.0-12.20.0-22.20.0-3
None known
jupyter-server
Debian:14
All versions, plus listed versions
2.15.0-12.17.0-12.20.0-12.20.0-22.20.0-3
None known
jupyter-server
PyPI
before 2.21.0, plus listed versions
0.0.00.0.10.0.20.0.30.0.4
Show 45 moreShow less
0.0.50.1.00.1.10.2.00.2.10.3.01.0.01.0.0rc01.0.0rc11.0.0rc101.0.0rc111.0.0rc121.0.0rc131.0.0rc141.0.0rc151.0.0rc161.0.0rc21.0.0rc31.0.0rc41.0.0rc51.0.0rc61.0.0rc71.0.0rc81.0.0rc91.0.11.0.101.0.111.0.21.0.31.0.41.0.51.0.61.0.71.0.81.0.91.1.01.1.11.1.21.1.31.1.41.10.01.10.11.10.21.11.01.11.1
2.21.0
jupyter-server
Ubuntu:22.04:LTS
All versions, plus listed versions
1.2.2-11.13.1-1
None known
jupyter-server
Ubuntu:24.04:LTS
All versions, plus listed versions
1.23.3-11.23.3-2
None known
jupyter-server
Ubuntu:26.10
All versions, plus listed versions
2.17.0-12.20.0-3
None known
jupyter-server
Ubuntu:26.04:LTS
All versions, plus listed versions
2.15.0-12.17.0-1
None known

History

History
RecordedChangedSources
first indexedCVE List, EUVD, GitHub Advisories, NVD, OSV

Dates are when Every CVE recorded each change. Upstream dates may differ.

In short

CVE-2026-86049 is a high vulnerability (CVSS 7.1) in Jupyter-server Jupyter Server, published September 17, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.42%, the 36th percentile. Fixed in jupyter-server 2.21.0.

References

Show 6 moreShow less
This page doesn't list everything

Left out here: 110 versions. The JSON record has them.

MoveEnter Open