{"id":"CVE-2026-86049","aliases":["DEBIAN-CVE-2026-86049","EUVD-2026-82436","GHSA-c3mw-737p-c7g2","PYSEC-2026-4054","UBUNTU-CVE-2026-86049"],"status":"published","title":"Jupyter Server: 5xx request logging leaks token-bearing Referer header values","description":"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.","severity":{"version":"3.1","score":7.1,"vector":"CVSS:3.1/AV:N/AC:H/PR:L/UI:R/S:U/C:H/I:H/A:H","level":"high","assessor":"cna","from":"cve"},"epss":{"day":"2026-11-12","score":0.00416,"percentile":0.3637,"model":"v2026.06.15"},"facts":{"in_kev":false,"known_exploited":false,"public_exploit":false,"fix_available":true},"cwes":["CWE-532"],"published":"2026-09-17T20:28:52Z","modified":"2026-10-28T02:30:49Z","fixes":[{"ecosystem":"PyPI","package":"jupyter-server","fixed_in":["2.21.0"],"sources":["ghsa","osv"]}],"affected":[{"source":"ghsa","ecosystem":"PyPI","package":"jupyter-server","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"last_affected":"2.20.0"},{"fixed":"2.21.0"}]}]},{"source":"osv","ecosystem":"Debian:12","package":"jupyter-server","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"}]}],"versions":["1.23.3-1","1.23.3-2","2.14.0-1","2.14.2-1","2.14.2-2","2.14.2-3","2.14.2-4","2.14.2-5","2.15.0-1","2.17.0-1","2.20.0-1","2.20.0-2","2.20.0-3","2.9.1-1"]},{"source":"osv","ecosystem":"Debian:13","package":"jupyter-server","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"}]}],"versions":["2.15.0-1","2.17.0-1","2.20.0-1","2.20.0-2","2.20.0-3"]},{"source":"osv","ecosystem":"Debian:14","package":"jupyter-server","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"}]}],"versions":["2.15.0-1","2.17.0-1","2.20.0-1","2.20.0-2","2.20.0-3"]},{"source":"osv","ecosystem":"PyPI","package":"jupyter-server","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"2.21.0"}]}],"versions":["0.0.0","0.0.1","0.0.2","0.0.3","0.0.4","0.0.5","0.1.0","0.1.1","0.2.0","0.2.1","0.3.0","1.0.0","1.0.0rc0","1.0.0rc1","1.0.0rc10","1.0.0rc11","1.0.0rc12","1.0.0rc13","1.0.0rc14","1.0.0rc15","1.0.0rc16","1.0.0rc2","1.0.0rc3","1.0.0rc4","1.0.0rc5","1.0.0rc6","1.0.0rc7","1.0.0rc8","1.0.0rc9","1.0.1","1.0.10","1.0.11","1.0.2","1.0.3","1.0.4","1.0.5","1.0.6","1.0.7","1.0.8","1.0.9","1.1.0","1.1.1","1.1.2","1.1.3","1.1.4","1.10.0","1.10.1","1.10.2","1.11.0","1.11.1","1.11.2","1.12.0","1.12.1","1.13.0","1.13.1","1.13.2","1.13.3","1.13.4","1.13.5","1.15.0","1.15.1","1.15.2","1.15.3","1.15.4","1.15.5","1.15.6","1.16.0","1.17.0","1.17.1","1.18.0","1.18.1","1.19.0","1.19.1","1.2.0","1.2.1","1.2.2","1.2.3","1.21.0","1.23.0","1.23.1","1.23.2","1.23.3","1.23.4","1.23.5","1.23.6","1.24.0","1.3.0","1.4.0","1.4.1","1.5.0","1.5.1","1.6.0","1.6.1","1.6.2","1.6.3","1.6.4","1.7.0","1.7.0a1","1.7.0a2","1.8.0","1.9.0","2.0.0","2.0.0a0","2.0.0a1","2.0.0a2","2.0.0b0","2.0.0b1","2.0.0rc0","2.0.0rc1","2.0.0rc2","2.0.0rc3","2.0.0rc4","2.0.0rc5","2.0.0rc6","2.0.0rc7","2.0.0rc8","2.0.1","2.0.2","2.0.3","2.0.4","2.0.5","2.0.6","2.0.7","2.1.0","2.10.0","2.10.1","2.11.0","2.11.1","2.11.2","2.12.0","2.12.1","2.12.2","2.12.3","2.12.4","2.12.5","2.13.0","2.14.0","2.14.1","2.14.2","2.15.0","2.16.0","2.17.0","2.18.0","2.18.1","2.18.2","2.19.0","2.2.0","2.2.1","2.20.0","2.3.0","2.4.0","2.5.0","2.6.0","2.7.0","2.7.1","2.7.2","2.7.3","2.8.0","2.9.0","2.9.1"]},{"source":"osv","ecosystem":"PyPI","package":"jupyter-server","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"2.21.0"}]}],"versions":["0.0.0","0.0.1","0.0.2","0.0.3","0.0.4","0.0.5","0.1.0","0.1.1","0.2.0","0.2.1","0.3.0","1.0.0","1.0.0rc0","1.0.0rc1","1.0.0rc10","1.0.0rc11","1.0.0rc12","1.0.0rc13","1.0.0rc14","1.0.0rc15","1.0.0rc16","1.0.0rc2","1.0.0rc3","1.0.0rc4","1.0.0rc5","1.0.0rc6","1.0.0rc7","1.0.0rc8","1.0.0rc9","1.0.1","1.0.10","1.0.11","1.0.2","1.0.3","1.0.4","1.0.5","1.0.6","1.0.7","1.0.8","1.0.9","1.1.0","1.1.1","1.1.2","1.1.3","1.1.4","1.10.0","1.10.1","1.10.2","1.11.0","1.11.1","1.11.2","1.12.0","1.12.1","1.13.0","1.13.1","1.13.2","1.13.3","1.13.4","1.13.5","1.15.0","1.15.1","1.15.2","1.15.3","1.15.4","1.15.5","1.15.6","1.16.0","1.17.0","1.17.1","1.18.0","1.18.1","1.19.0","1.19.1","1.2.0","1.2.1","1.2.2","1.2.3","1.21.0","1.23.0","1.23.1","1.23.2","1.23.3","1.23.4","1.23.5","1.23.6","1.24.0","1.3.0","1.4.0","1.4.1","1.5.0","1.5.1","1.6.0","1.6.1","1.6.2","1.6.3","1.6.4","1.7.0","1.7.0a1","1.7.0a2","1.8.0","1.9.0","2.0.0","2.0.0a0","2.0.0a1","2.0.0a2","2.0.0b0","2.0.0b1","2.0.0rc0","2.0.0rc1","2.0.0rc2","2.0.0rc3","2.0.0rc4","2.0.0rc5","2.0.0rc6","2.0.0rc7","2.0.0rc8","2.0.1","2.0.2","2.0.3","2.0.4","2.0.5","2.0.6","2.0.7","2.1.0","2.10.0","2.10.1","2.11.0","2.11.1","2.11.2","2.12.0","2.12.1","2.12.2","2.12.3","2.12.4","2.12.5","2.13.0","2.14.0","2.14.1","2.14.2","2.15.0","2.16.0","2.17.0","2.18.0","2.18.1","2.18.2","2.19.0","2.2.0","2.2.1","2.20.0","2.3.0","2.4.0","2.5.0","2.6.0","2.7.0","2.7.1","2.7.2","2.7.3","2.8.0","2.9.0","2.9.1"]},{"source":"osv","ecosystem":"Ubuntu:22.04:LTS","package":"jupyter-server","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"}]}],"versions":["1.2.2-1","1.13.1-1"]},{"source":"osv","ecosystem":"Ubuntu:24.04:LTS","package":"jupyter-server","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"}]}],"versions":["1.23.3-1","1.23.3-2"]},{"source":"osv","ecosystem":"Ubuntu:26.10","package":"jupyter-server","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"}]}],"versions":["2.17.0-1","2.20.0-3"]},{"source":"osv","ecosystem":"Ubuntu:26.04:LTS","package":"jupyter-server","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"}]}],"versions":["2.15.0-1","2.17.0-1"]}],"products":[{"vendor":"jupyter-server","product":"jupyter_server"}],"references":[{"url":"https://github.com/jupyter-server/jupyter_server/security/advisories/GHSA-c3mw-737p-c7g2","tags":["x_refsource_CONFIRM","advisory","web","report"]},{"url":"https://github.com/jupyter-server/jupyter_server/pull/1681","tags":["x_refsource_MISC","fix","web","report"]},{"url":"https://github.com/jupyter-server/jupyter_server/commit/52513529af7096e622c00911b17627b266294717","tags":["x_refsource_MISC","fix","web","report"]},{"url":"https://github.com/jupyter-server/jupyter_server/releases/tag/v2.21.0","tags":["x_refsource_MISC","web","report"]},{"url":"https://github.com/advisories/GHSA-c3mw-737p-c7g2","tags":["advisory"]},{"url":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/86xxx/CVE-2026-86049.json","tags":["advisory"]},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2026-86049","tags":["advisory"]},{"url":"https://security-tracker.debian.org/tracker/CVE-2026-86049","tags":["advisory"]},{"url":"https://github.com/jupyter-server/jupyter_server","tags":["package"]},{"url":"https://pypi.org/project/jupyter-server","tags":["package"]},{"url":"https://ubuntu.com/security/CVE-2026-86049","tags":["report"]},{"url":"https://www.cve.org/CVERecord?id=CVE-2026-86049","tags":["report"]}],"sources":{"cve":[{"id":"CVE-2026-86049","title":"Jupyter Server: 5xx request logging leaks token-bearing Referer header values","description":"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.","status":"published","published":"2026-09-17T20:28:52.154Z","modified":"2026-09-18T18:32:48.654Z","cvss":[{"version":"3.1","score":7.1,"vector":"CVSS:3.1/AV:N/AC:H/PR:L/UI:R/S:U/C:H/I:H/A:H","level":"high","assessor":"cna"}],"cwes":["CWE-532"],"updated_at":"2026-11-02T13:49:53.818886Z"}],"euvd":[{"id":"EUVD-2026-82436","description":"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.","status":"published","published":"2026-09-17T20:28:52Z","modified":"2026-09-18T18:32:48Z","cvss":[{"version":"3.1","score":7.1,"vector":"CVSS:3.1/AV:N/AC:H/PR:L/UI:R/S:U/C:H/I:H/A:H","level":"high"}],"updated_at":"2026-11-02T17:28:07.574446Z"}],"ghsa":[{"id":"GHSA-c3mw-737p-c7g2","title":"Jupyter Server: 5xx request logging leaks token-bearing Referer header values","description":"### Summary\n\nWhen a request returns a 500, `jupyter_server/log.py` logs a small JSON block of request headers. \n\nThe Referer header was copied into it as-is, so a token in the Referer URL ended up in the logs in plain text.\n\n### Impact\n\nAnyone 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.\n\nAffected: all versions before 2.21.0.\n\n### PoC\n\nAny malformed request that returns a 500 works:\n\n```bash\ncurl -i -X POST \\\n  -H 'Content-Type: application/json' \\\n  -H 'Referer: http://127.0.0.1:8899/tree?token=REFERTOKEN' \\\n  --data '{\"name\":123}' \\\n  'http://127.0.0.1:8899/api/kernels?token=VALIDTOKEN'\n```\n\nThe log shows the token twice, once raw and once redacted:\n\n```\n\"Referer\": \"http://127.0.0.1:8899/tree?token=REFERTOKEN\",\n[E ... ServerApp] 500 POST /api/kernels?token=[secret] (...) referer=http://127.0.0.1:8899/tree?token=[secret]\n```\n\n### Patches\n\nFixed in 2.21.0 by 5251352. Header values are now scrubbed before the block is logged. Upgrade to 2.21.0 or later.\n\n### Workarounds\n\nLimit who can read the server logs. If you can, avoid flows that put the token in the URL.","status":"published","published":"2026-09-17T20:28:55Z","modified":"2026-09-17T20:28:57Z","cvss":[{"version":"3.1","score":7.1,"vector":"CVSS:3.1/AV:N/AC:H/PR:L/UI:R/S:U/C:H/I:H/A:H","level":"high"}],"cwes":["CWE-532"],"updated_at":"2026-11-02T14:41:18.357514Z"}],"nvd":[{"id":"CVE-2026-86049","description":"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.","status":"published","published":"2026-09-17T21:17:50.213Z","modified":"2026-09-24T21:19:05.34Z","cvss":[{"version":"3.1","score":7.1,"vector":"CVSS:3.1/AV:N/AC:H/PR:L/UI:R/S:U/C:H/I:H/A:H","level":"high","assessor":"secondary"}],"cwes":["CWE-532"],"updated_at":"2026-11-02T14:12:49.70655Z"}],"osv":[{"id":"CVE-2026-86049","title":"Jupyter Server: 5xx request logging leaks token-bearing Referer header values","description":"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.","status":"published","published":"2026-09-17T20:28:52.154Z","modified":"2026-10-28T02:30:49.13714216Z","cvss":[{"version":"3.1","score":7.1,"vector":"CVSS:3.1/AV:N/AC:H/PR:L/UI:R/S:U/C:H/I:H/A:H","level":"high"}],"cwes":["CWE-532"],"updated_at":"2026-11-02T15:45:18.825071Z"},{"id":"DEBIAN-CVE-2026-86049","description":"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.","status":"published","published":"2026-09-17T21:17:50.213Z","modified":"2026-09-25T08:47:25.594981316Z","cvss":[{"version":"3.1","score":7.1,"vector":"CVSS:3.1/AV:N/AC:H/PR:L/UI:R/S:U/C:H/I:H/A:H","level":"high"}],"updated_at":"2026-11-02T15:46:05.022702Z"},{"id":"GHSA-c3mw-737p-c7g2","title":"Jupyter Server: 5xx request logging leaks token-bearing Referer header values","description":"### Summary\n\nWhen a request returns a 500, `jupyter_server/log.py` logs a small JSON block of request headers. \n\nThe Referer header was copied into it as-is, so a token in the Referer URL ended up in the logs in plain text.\n\n### Impact\n\nAnyone 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.\n\nAffected: all versions before 2.21.0.\n\n### PoC\n\nAny malformed request that returns a 500 works:\n\n```bash\ncurl -i -X POST \\\n  -H 'Content-Type: application/json' \\\n  -H 'Referer: http://127.0.0.1:8899/tree?token=REFERTOKEN' \\\n  --data '{\"name\":123}' \\\n  'http://127.0.0.1:8899/api/kernels?token=VALIDTOKEN'\n```\n\nThe log shows the token twice, once raw and once redacted:\n\n```\n\"Referer\": \"http://127.0.0.1:8899/tree?token=REFERTOKEN\",\n[E ... ServerApp] 500 POST /api/kernels?token=[secret] (...) referer=http://127.0.0.1:8899/tree?token=[secret]\n```\n\n### Patches\n\nFixed in 2.21.0 by 5251352. Header values are now scrubbed before the block is logged. Upgrade to 2.21.0 or later.\n\n### Workarounds\n\nLimit who can read the server logs. If you can, avoid flows that put the token in the URL.","status":"published","published":"2026-09-17T20:28:55Z","modified":"2026-10-01T17:55:42.193212736Z","cvss":[{"version":"3.1","score":7.1,"vector":"CVSS:3.1/AV:N/AC:H/PR:L/UI:R/S:U/C:H/I:H/A:H","level":"high"}],"cwes":["CWE-532"],"updated_at":"2026-11-02T15:46:44.571161Z"},{"id":"PYSEC-2026-4054","title":"Jupyter Server: 5xx request logging leaks token-bearing Referer header values","description":"### Summary\n\nWhen a request returns a 500, `jupyter_server/log.py` logs a small JSON block of request headers. \n\nThe Referer header was copied into it as-is, so a token in the Referer URL ended up in the logs in plain text.\n\n### Impact\n\nAnyone 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.\n\nAffected: all versions before 2.21.0.\n\n### PoC\n\nAny malformed request that returns a 500 works:\n\n```bash\ncurl -i -X POST \\\n  -H 'Content-Type: application/json' \\\n  -H 'Referer: http://127.0.0.1:8899/tree?token=REFERTOKEN' \\\n  --data '{\"name\":123}' \\\n  'http://127.0.0.1:8899/api/kernels?token=VALIDTOKEN'\n```\n\nThe log shows the token twice, once raw and once redacted:\n\n```\n\"Referer\": \"http://127.0.0.1:8899/tree?token=REFERTOKEN\",\n[E ... ServerApp] 500 POST /api/kernels?token=[secret] (...) referer=http://127.0.0.1:8899/tree?token=[secret]\n```\n\n### Patches\n\nFixed in 2.21.0 by 5251352. Header values are now scrubbed before the block is logged. Upgrade to 2.21.0 or later.\n\n### Workarounds\n\nLimit who can read the server logs. If you can, avoid flows that put the token in the URL.","status":"published","published":"2026-10-01T16:38:33.073533Z","modified":"2026-10-01T17:45:05.564324201Z","cvss":[{"version":"3.1","score":7.1,"vector":"CVSS:3.1/AV:N/AC:H/PR:L/UI:R/S:U/C:H/I:H/A:H","level":"high"}],"updated_at":"2026-11-02T15:52:57.255153Z"},{"id":"UBUNTU-CVE-2026-86049","description":"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.","status":"published","published":"2026-09-17T21:17:00Z","modified":"2026-10-17T13:01:13.768149658Z","cvss":[{"version":"3.1","score":7.1,"vector":"CVSS:3.1/AV:N/AC:H/PR:L/UI:R/S:U/C:H/I:H/A:H","level":"high"}],"updated_at":"2026-11-02T16:57:24.828975Z"}]}}
