{"id":"CVE-2026-102530","kind":"vulnerability","aliases":["CVE-2026-102530"],"related":[],"title":"JupyterLab Desktop: crafted server URL runs code with user privileges","description":"JupyterLab Desktop is the cross-platform desktop application for JupyterLab. Prior to 4.6.2-1, remote-server URLs were inserted into the server-selection dialog and Welcome view without safe encoding. An attacker who convinces a user to submit a crafted URL can execute JavaScript in the Welcome renderer and abuse its privileged IPC bridge to execute arbitrary code with the user’s privileges. The Welcome view also unsafely renders RSS news-feed titles; exploitation through this separate input path requires control over content delivered through the application’s Jupyter Blog feed or its cached feed data, rather than submission of a remote-server URL. This issue affects all supported platforms and is fixed in version 4.6.2-1.","summary":"JupyterLab Desktop inserts remote-server URLs into its server-selection dialog and Welcome view without safe encoding. An attacker who gets a user to submit a crafted URL can run JavaScript in the Welcome window and use its privileged bridge to execute arbitrary code as that user.","severity":"critical","cvss":9.4,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["data-science","desktop","jupyterlab","jupyterlab-desktop","package"],"not_affected_if":["browser-only-jupyterlab","version-4.6.2-1-or-later"],"how_to_check":"- Check the installed JupyterLab Desktop version in the app's About dialog or package metadata; versions below `4.6.2-1` are in scope.\n- Look for JupyterLab Desktop installs on developer machines and shared workstations.","fix":"- JupyterLab Desktop: upgrade to `4.6.2-1`.","status":"open","published_at":"2026-11-06T21:17:05+00:00","first_seen_at":"2026-11-06T21:45:07+00:00","triaged_at":"2026-11-06T21:46:30+00:00","updated_at":"2026-11-06T21:46:30+00:00","category":"package","confidence":0.7,"triage":{"at":"2026-11-06T21:46:30Z","model":"claude-haiku-5-5","output":{"fix":"- JupyterLab Desktop: upgrade to `4.6.2-1`.","reach":"local","title":"JupyterLab Desktop: crafted server URL runs code with user privileges","impact":"high","summary":"JupyterLab Desktop inserts remote-server URLs into its server-selection dialog and Welcome view without safe encoding. An attacker who gets a user to submit a crafted URL can run JavaScript in the Welcome window and use its privileged bridge to execute arbitrary code as that user.","audience":"developers","category":"package","nicknames":[],"who_cares":["jupyterlab","jupyterlab-desktop","data-science","desktop"],"confidence":0.7,"fix_status":"available","needs_auth":"no","worst_case":"Attacker runs arbitrary code with the user's privileges on their machine.","analyst_note":"","how_to_check":"- Check the installed JupyterLab Desktop version in the app's About dialog or package metadata; versions below `4.6.2-1` are in scope.\n- Look for JupyterLab Desktop installs on developer machines and shared workstations.","plain_action":"","needs_analyst":false,"not_affected_if":["version-4.6.2-1-or-later","browser-only-jupyterlab"],"who_is_affected":"Anyone running JupyterLab Desktop on any supported platform before 4.6.2-1 who might open a remote server URL supplied by someone else. The RSS news-feed path needs control over the Jupyter Blog feed or its cache, so it is a secondary concern. Teams that only use JupyterLab through a browser or a hosted service are not exposed through this desktop app.","user_interaction":"yes","needs_special_setup":"no","severity_if_unknown":"critical"},"cost_usd":0.000741,"input_tokens":4406,"output_tokens":600,"severity_before":"critical"},"analyst_status":null,"analyst_note":null,"search":"'-1':89C,196C '-102530':13A,16A '-2026':12A,15A '4.6.2':88C,195C 'abus':127C 'affect':186C 'also':144C 'applic':83C,165C 'arbitrari':70B,134C 'attack':46B,109C 'blog':168C 'bridg':67B,131C 'cach':172C 'code':7A,71B,135C 'content':161C 'control':159C 'convinc':111C 'craft':3A,54B,117C 'cross':80C 'cross-platform':79C 'cve':11A,14A 'data':18B,174C 'data-sci':17B 'deliv':162C 'desktop':2A,20B,24B,27B,76C,82C 'dialog':38B,101C 'encod':44B,107C 'execut':69B,120C,133C 'exploit':152C 'feed':150C,169C,173C 'fix':192C 'get':48B 'input':156C 'insert':28B,95C 'ipc':130C 'issu':185C 'javascript':58B,121C 'jupyt':167C 'jupyterlab':1A,21B,23B,26B,75C,85C 'jupyterlab-desktop':22B 'news':149C 'news-fe':148C 'packag':25B 'path':157C 'platform':81C,189C 'prior':86C 'privileg':10A,66B,129C,140C 'rather':175C 'remot':30B,91C,181C 'remote-serv':29B,90C,180C 'render':125C,146C 'requir':158C 'rss':147C 'run':6A,57B 'safe':43B,106C 'scienc':19B 'select':37B,100C 'separ':155C 'server':4A,31B,36B,92C,99C,182C 'server-select':35B,98C 'submiss':177C 'submit':52B,115C 'support':188C 'titl':151C 'unsaf':145C 'url':5A,32B,55B,93C,118C,183C 'use':64B 'user':9A,50B,74B,113C,138C 'version':194C 'view':41B,104C,143C 'welcom':40B,61B,103C,124C,142C 'window':62B 'without':42B,105C","nicknames":[],"mitigations":[],"who_affected":"Anyone running JupyterLab Desktop on any supported platform before 4.6.2-1 who might open a remote server URL supplied by someone else. The RSS news-feed path needs control over the Jupyter Blog feed or its cache, so it is a secondary concern. Teams that only use JupyterLab through a browser or a hosted service are not exposed through this desktop app.","tier":"B","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"developers","plain_action":null,"pkeys":[],"ptokens":[],"labels":["critical","datascience","desktop","jupyterlab","jupyterlabdesktop","package"],"campaign_type":null,"search_a":"'-102530':13A,16A '-2026':12A,15A 'code':7A 'craft':3A 'cve':11A,14A 'desktop':2A 'jupyterlab':1A 'privileg':10A 'run':6A 'server':4A 'url':5A 'user':9A","search_b":"'arbitrari':70B 'attack':46B 'bridg':67B 'code':71B 'craft':54B 'data':18B 'data-sci':17B 'desktop':20B,24B,27B 'dialog':38B 'encod':44B 'execut':69B 'get':48B 'insert':28B 'javascript':58B 'jupyterlab':21B,23B,26B 'jupyterlab-desktop':22B 'packag':25B 'privileg':66B 'remot':30B 'remote-serv':29B 'run':57B 'safe':43B 'scienc':19B 'select':37B 'server':31B,36B 'server-select':35B 'submit':52B 'url':32B,55B 'use':64B 'user':50B,74B 'view':41B 'welcom':40B,61B 'window':62B 'without':42B","search_c":"'-1':89C,196C '4.6.2':88C,195C 'abus':127C 'affect':186C 'also':144C 'applic':83C,165C 'arbitrari':134C 'attack':109C 'blog':168C 'bridg':131C 'cach':172C 'code':135C 'content':161C 'control':159C 'convinc':111C 'craft':117C 'cross':80C 'cross-platform':79C 'data':174C 'deliv':162C 'desktop':76C,82C 'dialog':101C 'encod':107C 'execut':120C,133C 'exploit':152C 'feed':150C,169C,173C 'fix':192C 'input':156C 'insert':95C 'ipc':130C 'issu':185C 'javascript':121C 'jupyt':167C 'jupyterlab':75C,85C 'news':149C 'news-fe':148C 'path':157C 'platform':81C,189C 'prior':86C 'privileg':129C,140C 'rather':175C 'remot':91C,181C 'remote-serv':90C,180C 'render':125C,146C 'requir':158C 'rss':147C 'safe':106C 'select':100C 'separ':155C 'server':92C,99C,182C 'server-select':98C 'submiss':177C 'submit':115C 'support':188C 'titl':151C 'unsaf':145C 'url':93C,118C,183C 'user':113C,138C 'version':194C 'view':104C,143C 'welcom':103C,124C,142C 'without':105C","first_public_at":"2026-07-24T10:08:36+00:00","kev":null,"cvss_vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:A/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X","cvss_by":"security-advisories@github.com","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-102530","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-102530","severity":null,"published_at":"2026-11-06T21:17:05+00:00","modified_at":"2026-11-06T21:17:05+00:00","first_seen_at":"2026-11-06T21:45:07+00:00","fetched_at":"2026-11-06T21:45:07+00:00","note":null}],"documents":[{"id":90294,"url":"https://github.com/jupyterlab/jupyterlab-desktop/commit/f59fd4f61bc6a2ca89cf0d13dce5f60511eaef5d","title":"Patch: github.com","kind":"other","source":"nvd","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Patch: github.com"},{"id":90286,"url":"https://github.com/jupyterlab/jupyterlab-desktop/releases/tag/v4.6.2-1","title":"Release notes: github.com","kind":"release","source":"nvd","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Release notes: github.com"},{"id":90296,"url":"https://github.com/jupyterlab/jupyterlab-desktop/security/advisories/GHSA-vrj4-r4fw-9rfh","title":"Vendor advisory: github.com","kind":"vendor","source":"nvd","publisher":"vendor","text":null,"published_at":"2026-07-24T10:08:36+00:00","relation":"advisory","confidence":null,"note":"Vendor advisory: github.com"}],"exploit_sources":[],"notice":"Free to read, with fair use of about 60 pages a minute. For higher limits or API access: sales@infrastack.ai"}