{"id":"CVE-2026-73626","aliases":["BIT-jupyterlab-2026-73626","DEBIAN-CVE-2026-73626","EUVD-2026-57795","GHSA-r336-hqvq-mfjh","GHSA-whvh-wf3x-g77j","OESA-2026-4167","OESA-2026-4168","UBUNTU-CVE-2026-73626","openSUSE-SU-2026:11634-1"],"status":"published","title":"JupyterLab before 4.6.2 Authentication Bypass via PyPIExtensionManager","description":"JupyterLab versions \u003e=4.6.0,\u003c=4.6.1 and \u003c=4.5.9 contain an allowlist/blocklist enforcement gap in PyPIExtensionManager.install(). A missing 'await' caused the is_install_allowed coroutine to never execute, so the extension allowlist/blocklist check was not enforced for direct callers of install(). The stock JupyterLab HTTP API and Extension Manager UI are not affected, as they perform a separate, correctly awaited check. The issue affects only deployments where a custom extension or downstream integration imports PyPIExtensionManager and calls install() directly with a package name influenced by untrusted input, an allowlist/blocklist is configured, the PyPI Extension Manager is enabled, and kernels and terminals are disabled or delegated to remote hosts. Fixed in JupyterLab 4.6.2 and 4.5.10.","severity":{"version":"4.0","score":7.7,"vector":"CVSS:4.0/AV:N/AC:H/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N","level":"high","assessor":"cna","from":"cve"},"epss":{"day":"2026-11-11","score":0.00363,"percentile":0.30497,"model":"v2026.06.15"},"facts":{"in_kev":false,"known_exploited":false,"public_exploit":false,"fix_available":true},"cwes":["CWE-284","CWE-636"],"published":"2026-07-22T23:12:22Z","modified":"2026-10-28T02:30:28Z","fixes":[{"ecosystem":"PyPI","package":"jupyterlab","fixed_in":["4.6.2","4.5.10"],"sources":["ghsa","osv"]},{"ecosystem":"Bitnami","package":"jupyterlab","fixed_in":["4.5.10","4.6.2"],"sources":["osv"]},{"ecosystem":"Debian:14","package":"jupyterlab","fixed_in":["4.4.10+ds1+~3.1.0+~0.16.6+~cs1.4.4-4"],"sources":["osv"]},{"ecosystem":"openEuler:24.03-LTS-SP3","package":"python-jupyterlab","fixed_in":["4.3.5-5.oe2403sp3"],"sources":["osv"]}],"affected":[{"source":"ghsa","ecosystem":"PyPI","package":"jupyterlab","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"4.6.0"},{"last_affected":"4.6.1"},{"fixed":"4.6.2"}]}]},{"source":"ghsa","ecosystem":"PyPI","package":"jupyterlab","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"last_affected":"4.5.9"},{"fixed":"4.5.10"}]}]},{"source":"osv","ecosystem":"Bitnami","package":"jupyterlab","ranges":[{"type":"SEMVER","events":[{"introduced":"0"},{"fixed":"4.5.10"},{"introduced":"4.6.0"},{"fixed":"4.6.2"}]}]},{"source":"osv","ecosystem":"Debian:13","package":"jupyterlab","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"}]}],"versions":["4.0.11+ds1+~cs11.25.27-7","4.0.11+ds1+~cs11.25.27-8","4.0.11+ds1+~cs11.25.27-9","4.0.11+ds2+~cs11.25.27-1","4.0.11+ds2+~cs11.25.27-3","4.0.11+ds3+~cs11.25.27-1","4.0.11+ds4+~cs11.25.27-1","4.0.11+ds4+~cs11.25.27-2","4.0.11+ds4+~cs11.25.27-3","4.0.11+ds4+~cs11.25.27-4","4.0.11+ds5+~cs11.25.27-1","4.0.13+ds1+~2.0.1+~cs1.4.4-1","4.1.3+ds1+~2.0.1+~0.15.3+~cs1.4.4-1","4.1.8+ds1+~2.0.1+~0.15.3+~cs1.4.4-1","4.1.8+ds1+~2.0.1+~0.15.3+~cs1.4.4-2","4.1.8+ds1+~2.0.1+~0.15.3+~cs1.4.4-3","4.1.8+ds1+~2.0.1+~0.15.3+~cs1.4.4-4","4.1.8+ds1+~2.0.1+~0.15.3+~cs1.4.4-5","4.1.8+ds1+~2.0.1+~0.15.3+~cs1.4.4-6","4.1.8+ds1+~2.0.1+~0.15.3+~cs1.4.4-7","4.1.8+ds1+~2.0.1+~0.15.3+~cs1.4.4-8","4.4.1+ds1+~3.0.5+~0.16.6+~cs1.4.4-1","4.4.10+ds1+~3.1.0+~0.16.6+~cs1.4.4-1","4.4.10+ds1+~3.1.0+~0.16.6+~cs1.4.4-2","4.4.10+ds1+~3.1.0+~0.16.6+~cs1.4.4-3","4.4.10+ds1+~3.1.0+~0.16.6+~cs1.4.4-4","4.4.10+ds1+~3.1.0+~0.16.6+~cs1.4.4-5","4.4.10+ds1+~3.1.0+~0.16.6+~cs1.4.4-6","4.4.8+ds1+~3.1.0+~0.16.6+~cs1.4.4-1"]},{"source":"osv","ecosystem":"Debian:14","package":"jupyterlab","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"4.4.10+ds1+~3.1.0+~0.16.6+~cs1.4.4-4"}]}],"versions":["4.0.11+ds1+~cs11.25.27-7","4.0.11+ds1+~cs11.25.27-8","4.0.11+ds1+~cs11.25.27-9","4.0.11+ds2+~cs11.25.27-1","4.0.11+ds2+~cs11.25.27-3","4.0.11+ds3+~cs11.25.27-1","4.0.11+ds4+~cs11.25.27-1","4.0.11+ds4+~cs11.25.27-2","4.0.11+ds4+~cs11.25.27-3","4.0.11+ds4+~cs11.25.27-4","4.0.11+ds5+~cs11.25.27-1","4.0.13+ds1+~2.0.1+~cs1.4.4-1","4.1.3+ds1+~2.0.1+~0.15.3+~cs1.4.4-1","4.1.8+ds1+~2.0.1+~0.15.3+~cs1.4.4-1","4.1.8+ds1+~2.0.1+~0.15.3+~cs1.4.4-2","4.1.8+ds1+~2.0.1+~0.15.3+~cs1.4.4-3","4.1.8+ds1+~2.0.1+~0.15.3+~cs1.4.4-4","4.1.8+ds1+~2.0.1+~0.15.3+~cs1.4.4-5","4.1.8+ds1+~2.0.1+~0.15.3+~cs1.4.4-6","4.1.8+ds1+~2.0.1+~0.15.3+~cs1.4.4-7","4.1.8+ds1+~2.0.1+~0.15.3+~cs1.4.4-8","4.4.1+ds1+~3.0.5+~0.16.6+~cs1.4.4-1","4.4.10+ds1+~3.1.0+~0.16.6+~cs1.4.4-1","4.4.10+ds1+~3.1.0+~0.16.6+~cs1.4.4-2","4.4.10+ds1+~3.1.0+~0.16.6+~cs1.4.4-3","4.4.8+ds1+~3.1.0+~0.16.6+~cs1.4.4-1"]},{"source":"osv","ecosystem":"PyPI","package":"jupyterlab","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"4.6.0"},{"fixed":"4.6.2"}]}],"versions":["4.6.0","4.6.1"]},{"source":"osv","ecosystem":"PyPI","package":"jupyterlab","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"4.5.10"}]}],"versions":["0.0.1","0.0.10","0.0.13","0.0.2","0.0.3","0.0.4","0.0.5","0.0.6","0.0.7","0.0.8","0.0.9","0.1.1","0.1.2","0.10.0","0.11.0","0.11.1","0.11.2","0.11.3","0.12.0","0.12.1","0.13.0","0.13.1","0.13.2","0.14.0","0.15.0","0.15.1","0.16.0","0.16.2","0.17.0","0.17.1","0.17.2","0.17.4","0.17.5","0.18.0","0.18.0.dev1","0.18.1","0.19.0","0.2.0","0.20.0","0.20.0rc1","0.20.1","0.20.2","0.20.3","0.20.4","0.21.0","0.21.0rc1","0.21.0rc2","0.21.0rc3","0.21.0rc4","0.21.0rc5","0.22.0","0.22.0rc0","0.22.1","0.23.0","0.23.0rc0","0.23.0rc1","0.23.1","0.23.2","0.24.0","0.24.0rc0","0.24.0rc1","0.24.0rc2","0.24.1","0.25.0","0.25.0rc0","0.25.0rc1","0.25.1","0.25.2","0.25.2rc0","0.26.0","0.26.0rc0","0.26.0rc1","0.26.1","0.26.2","0.26.3","0.26.4","0.26.5","0.27.0","0.27.0rc0","0.27.0rc1","0.27.0rc2","0.27.0rc3","0.27.0rc4","0.27.0rc5","0.27.1","0.27.2","0.28.0","0.28.0rc0","0.28.0rc1","0.28.0rc2","0.28.0rc3","0.28.1","0.28.10","0.28.11","0.28.12","0.28.13","0.28.14","0.28.15","0.28.2","0.28.3","0.28.4","0.28.5","0.28.6","0.28.7","0.28.8","0.29.0","0.29.0rc0","0.29.1","0.29.2","0.3.0","0.30.0","0.30.0rc0","0.30.0rc1","0.30.1","0.30.2","0.30.3","0.30.4","0.30.5","0.30.6","0.31.0","0.31.0rc0","0.31.0rc1","0.31.0rc2","0.31.1","0.31.10","0.31.11","0.31.12","0.31.2","0.31.3","0.31.4","0.31.5","0.31.6","0.31.7","0.31.8","0.31.9","0.32.0","0.32.0rc0","0.32.0rc1","0.32.1","0.33.0","0.33.0rc0","0.33.0rc1","0.33.1","0.33.10","0.33.11","0.33.12","0.33.2","0.33.3","0.33.4","0.33.5","0.33.6","0.33.7","0.33.8","0.33.9","0.34.0","0.34.0rc0","0.34.0rc1","0.34.0rc2","0.34.1","0.34.10","0.34.11","0.34.12","0.34.2","0.34.3","0.34.4","0.34.5","0.34.6","0.34.7","0.34.8","0.34.9","0.35.0","0.35.0rc0","0.35.0rc1","0.35.0rc2","0.35.1","0.35.2","0.35.3","0.35.4","0.35.5","0.35.6","0.4.0","0.4.1","0.5.0","0.6.0","0.7.0","0.8.0","0.9.0","0.9.1","1.0.0","1.0.0a0","1.0.0a1","1.0.0a10","1.0.0a2","1.0.0a3","1.0.0a4","1.0.0a5","1.0.0a6","1.0.0a7","1.0.0a8","1.0.0a9","1.0.0rc0","1.0.0rc1","1.0.1","1.0.10","1.0.2","1.0.3","1.0.4","1.0.5","1.0.6","1.0.7","1.0.9","1.1.0","1.1.0a0","1.1.0a1","1.1.0a2","1.1.0rc0","1.1.1","1.1.2","1.1.3","1.1.4","1.1.5","1.2.0","1.2.0a0","1.2.0a1","1.2.0a2","1.2.0a3","1.2.0rc0","1.2.1","1.2.10","1.2.11","1.2.12","1.2.13","1.2.14","1.2.15","1.2.16","1.2.17","1.2.18","1.2.19","1.2.2","1.2.20","1.2.21","1.2.3","1.2.4","1.2.5","1.2.6","1.2.7","1.2.8","1.2.9","2.0.0","2.0.0a0","2.0.0a1","2.0.0a3","2.0.0a4","2.0.0b1","2.0.0b2","2.0.0b3","2.0.0rc0","2.0.0rc1","2.0.0rc2","2.0.1","2.0.1rc0","2.0.2","2.1.0","2.1.0a0","2.1.0b0","2.1.0rc0","2.1.1","2.1.2","2.1.3","2.1.4","2.1.5","2.2.0","2.2.0a0","2.2.0a1","2.2.0rc1","2.2.1","2.2.10","2.2.2","2.2.4","2.2.5","2.2.6","2.2.7","2.2.8","2.2.9","2.3.0","2.3.0a0","2.3.0a1","2.3.0a2","2.3.0rc0","2.3.1","2.3.2","3.0.0","3.0.0a0","3.0.0a10","3.0.0a11","3.0.0a12","3.0.0a13","3.0.0a14","3.0.0a3","3.0.0a4","3.0.0a5","3.0.0a6","3.0.0a7","3.0.0a8","3.0.0a9","3.0.0b1","3.0.0b2","3.0.0b3","3.0.0b4","3.0.0b6","3.0.0b7","3.0.0b8","3.0.0rc0","3.0.0rc1","3.0.0rc10","3.0.0rc11","3.0.0rc12","3.0.0rc13","3.0.0rc14","3.0.0rc15","3.0.0rc2","3.0.0rc3","3.0.0rc4","3.0.0rc5","3.0.0rc6","3.0.0rc7","3.0.0rc8","3.0.0rc9","3.0.1","3.0.10","3.0.11","3.0.12","3.0.13","3.0.14","3.0.15","3.0.16","3.0.17","3.0.18","3.0.2","3.0.3","3.0.4","3.0.5","3.0.6","3.0.7","3.0.8","3.0.9","3.1.0","3.1.0a0","3.1.0a1","3.1.0a10","3.1.0a11","3.1.0a12","3.1.0a13","3.1.0a2","3.1.0a3","3.1.0a4","3.1.0a5","3.1.0a6","3.1.0a7","3.1.0a8","3.1.0a9","3.1.0b0","3.1.0b1","3.1.0rc1","3.1.0rc2","3.1.1","3.1.10","3.1.11","3.1.12","3.1.13","3.1.14","3.1.16","3.1.17","3.1.18","3.1.19","3.1.2","3.1.4","3.1.6","3.1.7","3.1.8","3.1.9","3.2.0","3.2.0a0","3.2.0a1","3.2.0b0","3.2.0rc0","3.2.1","3.2.2","3.2.3","3.2.4","3.2.5","3.2.6","3.2.7","3.2.8","3.2.9","3.3.0","3.3.0a1","3.3.0a2","3.3.0a3","3.3.0b0","3.3.0rc0","3.3.1","3.3.2","3.3.3","3.3.4","3.4.0","3.4.0a0","3.4.0b0","3.4.0rc0","3.4.1","3.4.2","3.4.3","3.4.4","3.4.5","3.4.6","3.4.7","3.4.8","3.5.0","3.5.0a0","3.5.0b0","3.5.0rc0","3.5.1","3.5.2","3.5.3","3.6.0","3.6.0a0","3.6.0a1","3.6.0a2","3.6.0a3","3.6.0a4","3.6.0a5","3.6.0b0","3.6.0rc0","3.6.0rc1","3.6.1","3.6.2","3.6.3","3.6.4","3.6.5","3.6.6","3.6.7","3.6.8","4.0.0","4.0.0a0","4.0.0a1","4.0.0a10","4.0.0a11","4.0.0a12","4.0.0a13","4.0.0a14","4.0.0a15","4.0.0a16","4.0.0a17","4.0.0a18","4.0.0a19","4.0.0a20","4.0.0a21","4.0.0a22","4.0.0a23","4.0.0a24","4.0.0a25","4.0.0a26","4.0.0a27","4.0.0a28","4.0.0a29","4.0.0a3","4.0.0a30","4.0.0a31","4.0.0a32","4.0.0a33","4.0.0a34","4.0.0a35","4.0.0a36","4.0.0a4","4.0.0a6","4.0.0a7","4.0.0a8","4.0.0a9","4.0.0b0","4.0.0b1","4.0.0b2","4.0.0rc0","4.0.0rc1","4.0.1","4.0.10","4.0.11","4.0.12","4.0.13","4.0.2","4.0.3","4.0.4","4.0.5","4.0.6","4.0.7","4.0.8","4.0.9","4.1.0","4.1.0a1","4.1.0a2","4.1.0a3","4.1.0a4","4.1.0b0","4.1.0b1","4.1.0b2","4.1.0rc0","4.1.0rc1","4.1.1","4.1.2","4.1.3","4.1.4","4.1.5","4.1.6","4.1.7","4.1.8","4.2.0","4.2.0a0","4.2.0a1","4.2.0a2","4.2.0b0","4.2.0b1","4.2.0b2","4.2.0b3","4.2.0rc0","4.2.1","4.2.2","4.2.3","4.2.4","4.2.5","4.2.6","4.2.7","4.3.0","4.3.0a0","4.3.0a1","4.3.0a2","4.3.0b0","4.3.0b1","4.3.0b2","4.3.0b3","4.3.0rc0","4.3.0rc1","4.3.1","4.3.2","4.3.3","4.3.4","4.3.5","4.3.6","4.3.7","4.3.8","4.4.0","4.4.0a0","4.4.0a1","4.4.0a2","4.4.0a3","4.4.0b0","4.4.0b1","4.4.0b2","4.4.0rc0","4.4.0rc1","4.4.1","4.4.10","4.4.2","4.4.3","4.4.4","4.4.5","4.4.6","4.4.7","4.4.8","4.4.9","4.5.0","4.5.0a0","4.5.0a1","4.5.0a2","4.5.0a3","4.5.0a4","4.5.0b0","4.5.0b1","4.5.0rc0","4.5.0rc1","4.5.1","4.5.2","4.5.3","4.5.4","4.5.5","4.5.6","4.5.7","4.5.8","4.5.9"]},{"source":"osv","ecosystem":"openEuler:24.03-LTS-SP3","package":"python-jupyterlab","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"4.3.5-5.oe2403sp3"}]}]},{"source":"osv","ecosystem":"openEuler:24.03-LTS-SP4","package":"python-jupyterlab","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"4.3.5-5.oe2403sp4"}]}],"bundled":2},{"source":"osv","ecosystem":"Ubuntu:26.10","package":"jupyterlab","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"}]}],"versions":["4.0.11+ds1+~cs11.25.27-9","4.4.10+ds1+~3.1.0+~0.16.6+~cs1.4.4-3","4.4.10+ds1+~3.1.0+~0.16.6+~cs1.4.4-4"]},{"source":"osv","ecosystem":"Ubuntu:26.04:LTS","package":"jupyterlab","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"}]}],"versions":["4.0.11+ds1+~cs11.25.27-7","4.0.11+ds1+~cs11.25.27-8","4.0.11+ds1+~cs11.25.27-9"]},{"source":"osv","ecosystem":"openSUSE:Tumbleweed","package":"python-jupyterlab","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"4.5.10-1.1"}]}],"bundled":5}],"products":[{"vendor":"jupyterlab","product":"jupyterlab"}],"references":[{"url":"https://github.com/jupyterlab/jupyterlab/security/advisories/GHSA-whvh-wf3x-g77j","tags":["vendor-advisory","web","advisory","report"]},{"url":"https://www.vulncheck.com/advisories/jupyterlab-before-authentication-bypass-via-pypiextensionmanager","tags":["third-party-advisory","web","advisory","report"]},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2026-73626","tags":["web","advisory"]},{"url":"https://github.com/advisories/GHSA-r336-hqvq-mfjh"},{"url":"https://github.com/jupyterlab/jupyterlab/pull/19184","tags":["web"]},{"url":"https://github.com/jupyterlab/jupyterlab/pull/19185","tags":["web"]},{"url":"https://github.com/jupyterlab/jupyterlab/pull/19186","tags":["web"]},{"url":"https://github.com/jupyterlab/jupyterlab/commit/be9303f5bcd5308eaeae953c5a3c903046682c2c","tags":["web"]},{"url":"https://github.com/jupyterlab/jupyterlab/commit/f1beab4a2027af4719d6edc07d52d6cf5a39a432","tags":["web"]},{"url":"https://github.com/jupyterlab/jupyterlab/releases/tag/v4.5.10","tags":["web"]},{"url":"https://github.com/jupyterlab/jupyterlab/releases/tag/v4.6.2","tags":["web"]},{"url":"https://github.com/advisories/GHSA-whvh-wf3x-g77j"},{"url":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/73xxx/CVE-2026-73626.json","tags":["advisory"]},{"url":"https://security-tracker.debian.org/tracker/CVE-2026-73626","tags":["advisory"]},{"url":"https://github.com/jupyterlab/jupyterlab","tags":["package"]},{"url":"https://www.openeuler.org/zh/security/security-bulletins/detail/?id=openEuler-SA-2026-4167","tags":["advisory"]},{"url":"https://www.openeuler.org/zh/security/security-bulletins/detail/?id=openEuler-SA-2026-4168","tags":["advisory"]},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2026-67338","tags":["advisory"]},{"url":"https://ubuntu.com/security/CVE-2026-73626","tags":["report"]},{"url":"https://www.cve.org/CVERecord?id=CVE-2026-73626","tags":["report"]},{"url":"","tags":["advisory"]},{"url":"https://www.suse.com/security/cve/CVE-2026-73415","tags":["web"]},{"url":"https://www.suse.com/security/cve/CVE-2026-73416","tags":["web"]},{"url":"https://www.suse.com/security/cve/CVE-2026-73417","tags":["web"]},{"url":"https://www.suse.com/security/cve/CVE-2026-73626","tags":["web"]},{"url":"https://www.suse.com/security/cve/CVE-2026-73627","tags":["web"]}],"sources":{"cve":[{"id":"CVE-2026-73626","title":"JupyterLab before 4.6.2 Authentication Bypass via PyPIExtensionManager","description":"JupyterLab versions \u003e=4.6.0,\u003c=4.6.1 and \u003c=4.5.9 contain an allowlist/blocklist enforcement gap in PyPIExtensionManager.install(). A missing 'await' caused the is_install_allowed coroutine to never execute, so the extension allowlist/blocklist check was not enforced for direct callers of install(). The stock JupyterLab HTTP API and Extension Manager UI are not affected, as they perform a separate, correctly awaited check. The issue affects only deployments where a custom extension or downstream integration imports PyPIExtensionManager and calls install() directly with a package name influenced by untrusted input, an allowlist/blocklist is configured, the PyPI Extension Manager is enabled, and kernels and terminals are disabled or delegated to remote hosts. Fixed in JupyterLab 4.6.2 and 4.5.10.","status":"published","published":"2026-08-13T11:28:25.551Z","modified":"2026-08-28T13:45:55.401Z","cvss":[{"version":"4.0","score":7.7,"vector":"CVSS:4.0/AV:N/AC:H/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N","level":"high","assessor":"cna"},{"version":"3.1","score":7.5,"vector":"CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H","level":"high","assessor":"cna"}],"cwes":["CWE-284"],"updated_at":"2026-11-02T13:43:44.898272Z"}],"euvd":[{"id":"EUVD-2026-57795","description":"JupyterLab versions \u003e=4.6.0,\u003c=4.6.1 and \u003c=4.5.9 contain an allowlist/blocklist enforcement gap in PyPIExtensionManager.install(). A missing 'await' caused the is_install_allowed coroutine to never execute, so the extension allowlist/blocklist check was not enforced for direct callers of install(). The stock JupyterLab HTTP API and Extension Manager UI are not affected, as they perform a separate, correctly awaited check. The issue affects only deployments where a custom extension or downstream integration imports PyPIExtensionManager and calls install() directly with a package name influenced by untrusted input, an allowlist/blocklist is configured, the PyPI Extension Manager is enabled, and kernels and terminals are disabled or delegated to remote hosts. Fixed in JupyterLab 4.6.2 and 4.5.10.","status":"published","published":"2026-08-13T11:28:25Z","modified":"2026-08-28T13:45:55Z","cvss":[{"version":"4.0","score":7.7,"vector":"CVSS:4.0/AV:N/AC:H/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N","level":"high"}],"updated_at":"2026-11-02T18:01:23.608347Z"}],"ghsa":[{"id":"GHSA-r336-hqvq-mfjh","title":"JupyterLab versions \u003e=4.6.0,\u003c=4.6.1 and \u003c=4.5.9 contain an allowlist/blocklist enforcement gap in...","description":"JupyterLab versions \u003e=4.6.0,\u003c=4.6.1 and \u003c=4.5.9 contain an allowlist/blocklist enforcement gap in PyPIExtensionManager.install(). A missing 'await' caused the is_install_allowed coroutine to never execute, so the extension allowlist/blocklist check was not enforced for direct callers of install(). The stock JupyterLab HTTP API and Extension Manager UI are not affected, as they perform a separate, correctly awaited check. The issue affects only deployments where a custom extension or downstream integration imports PyPIExtensionManager and calls install() directly with a package name influenced by untrusted input, an allowlist/blocklist is configured, the PyPI Extension Manager is enabled, and kernels and terminals are disabled or delegated to remote hosts. Fixed in JupyterLab 4.6.2 and 4.5.10.","status":"published","published":"2026-08-13T12:31:11Z","modified":"2026-08-13T12:31:12Z","cvss":[{"version":"4.0","score":0,"vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:N/VI:N/VA:N/SC:N/SI:N/SA:N/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","level":"none"},{"version":"3.1","score":0,"vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:N","level":"none"}],"cwes":["CWE-284"],"updated_at":"2026-11-02T15:10:24.70819Z"},{"id":"GHSA-whvh-wf3x-g77j","title":"JupyterLab: Allowlist/blocklist check in `PyPIExtensionManager.install()` not enforced for direct callers (missing `await`)","description":"The extension allowlist/blocklist check inside `PyPIExtensionManager.install()` was not enforced due to a missing await. For purposes of JupyterLab this was a secondary defense-in-depth check: `install()` was intended to enforce the allowlist/blocklist itself for any future uses and users calling this method directly (in addition to the separate check handling requests arriving through the HTTP API).  The only runtime symptom was a `RuntimeWarning: coroutine 'is_install_allowed' was never awaited.`\n\nThis has security implications only for deployments that combine all of the following:\n- a custom extension or downstream integration that imports `PyPIExtensionManager` and calls `install()` directly with a package name influenced by untrusted user input (the stock JupyterLab HTTP handler is not affected - it performs its own awaited allowlist check before calling `install()`);\n- an allowlist/blocklist configured with the intent of restricting which packages users can install;\n- the (default) PyPI Extension Manager enabled; and\n- kernels and terminals disabled or delegated to remote hosts, so that the custom extension's `install()` call is the only available package-install vector (otherwise a user with kernel access can install packages directly regardless of this check)\n\n### Impact\n\nLow. No exposure for stock JupyterLab: the HTTP API and Extension Manager UI enforce the listing through a separate, correctly awaited check. The gap affected only custom extensions or downstream integrations that called the public `install()` method directly and relied on it to self-enforce.\n\n### Patches\n\nJupyterLab [`v4.6.2`](https://github.com/jupyterlab/jupyterlab/releases/tag/v4.6.2) and [`v4.5.10`](https://github.com/jupyterlab/jupyterlab/releases/tag/v4.5.10) contain the patch.\n\nUsers of applications that depend on JupyterLab, such as Notebook v7+, should update `jupyterlab` package too.\n\n### Workarounds\n\nNo action is required for deployments that only expose extension management through the JupyterLab HTTP API / Extension Manager UI, as that path was already enforcing the listing via the handler's own check. Deployments wanting to disable programmatic extension installation entirely can switch to the read-only extension manager:\n\n```bash\n--LabApp.extension_manager=readonly\n```\n\nor the following traitlet:\n\n```python\nc.LabApp.extension_manager = 'readonly'\n```\n\nYou can confirm that the read-only manager is in use from GUI:\n\n\u003cimg width=\"293\" height=\"293\" alt=\"image\" src=\"https://github.com/user-attachments/assets/8016c809-633e-4ed0-a5bc-6bc4793caa0f\" /\u003e","status":"published","published":"2026-07-22T23:12:22Z","modified":"2026-07-22T23:12:23Z","cvss":[{"version":"3.1","score":0,"vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:N","level":"none"}],"cwes":["CWE-284","CWE-636"],"updated_at":"2026-11-02T14:40:51.375752Z"}],"nvd":[{"id":"CVE-2026-73626","description":"JupyterLab versions \u003e=4.6.0,\u003c=4.6.1 and \u003c=4.5.9 contain an allowlist/blocklist enforcement gap in PyPIExtensionManager.install(). A missing 'await' caused the is_install_allowed coroutine to never execute, so the extension allowlist/blocklist check was not enforced for direct callers of install(). The stock JupyterLab HTTP API and Extension Manager UI are not affected, as they perform a separate, correctly awaited check. The issue affects only deployments where a custom extension or downstream integration imports PyPIExtensionManager and calls install() directly with a package name influenced by untrusted input, an allowlist/blocklist is configured, the PyPI Extension Manager is enabled, and kernels and terminals are disabled or delegated to remote hosts. Fixed in JupyterLab 4.6.2 and 4.5.10.","status":"published","published":"2026-08-13T12:17:27.897Z","modified":"2026-09-09T20:36:38.867Z","cvss":[{"version":"4.0","score":7.7,"vector":"CVSS:4.0/AV:N/AC:H/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N/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","level":"high","assessor":"secondary"},{"version":"3.1","score":7.5,"vector":"CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H","level":"high","assessor":"primary"}],"cwes":["CWE-284"],"updated_at":"2026-11-02T14:12:37.217486Z"}],"osv":[{"id":"CVE-2026-73626","title":"JupyterLab before 4.6.2 Authentication Bypass via PyPIExtensionManager","description":"JupyterLab versions \u003e=4.6.0,\u003c=4.6.1 and \u003c=4.5.9 contain an allowlist/blocklist enforcement gap in PyPIExtensionManager.install(). A missing 'await' caused the is_install_allowed coroutine to never execute, so the extension allowlist/blocklist check was not enforced for direct callers of install(). The stock JupyterLab HTTP API and Extension Manager UI are not affected, as they perform a separate, correctly awaited check. The issue affects only deployments where a custom extension or downstream integration imports PyPIExtensionManager and calls install() directly with a package name influenced by untrusted input, an allowlist/blocklist is configured, the PyPI Extension Manager is enabled, and kernels and terminals are disabled or delegated to remote hosts. Fixed in JupyterLab 4.6.2 and 4.5.10.","status":"published","published":"2026-08-13T11:28:25.551Z","modified":"2026-10-28T02:30:28.876379321Z","cvss":[{"version":"4.0","score":7.7,"vector":"CVSS:4.0/AV:N/AC:H/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N","level":"high"}],"cwes":["CWE-284"],"updated_at":"2026-11-02T15:45:16.365946Z"},{"id":"DEBIAN-CVE-2026-73626","description":"JupyterLab versions \u003e=4.6.0,\u003c=4.6.1 and \u003c=4.5.9 contain an allowlist/blocklist enforcement gap in PyPIExtensionManager.install(). A missing 'await' caused the is_install_allowed coroutine to never execute, so the extension allowlist/blocklist check was not enforced for direct callers of install(). The stock JupyterLab HTTP API and Extension Manager UI are not affected, as they perform a separate, correctly awaited check. The issue affects only deployments where a custom extension or downstream integration imports PyPIExtensionManager and calls install() directly with a package name influenced by untrusted input, an allowlist/blocklist is configured, the PyPI Extension Manager is enabled, and kernels and terminals are disabled or delegated to remote hosts. Fixed in JupyterLab 4.6.2 and 4.5.10.","status":"published","published":"2026-08-13T12:17:27.897Z","modified":"2026-10-01T03:03:02.165434668Z","cvss":[{"version":"3.1","score":7.5,"vector":"CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H","level":"high"}],"updated_at":"2026-11-02T15:46:02.499355Z"},{"id":"GHSA-whvh-wf3x-g77j","title":"JupyterLab: Allowlist/blocklist check in `PyPIExtensionManager.install()` not enforced for direct callers (missing `await`)","description":"The extension allowlist/blocklist check inside `PyPIExtensionManager.install()` was not enforced due to a missing await. For purposes of JupyterLab this was a secondary defense-in-depth check: `install()` was intended to enforce the allowlist/blocklist itself for any future uses and users calling this method directly (in addition to the separate check handling requests arriving through the HTTP API).  The only runtime symptom was a `RuntimeWarning: coroutine 'is_install_allowed' was never awaited.`\n\nThis has security implications only for deployments that combine all of the following:\n- a custom extension or downstream integration that imports `PyPIExtensionManager` and calls `install()` directly with a package name influenced by untrusted user input (the stock JupyterLab HTTP handler is not affected - it performs its own awaited allowlist check before calling `install()`);\n- an allowlist/blocklist configured with the intent of restricting which packages users can install;\n- the (default) PyPI Extension Manager enabled; and\n- kernels and terminals disabled or delegated to remote hosts, so that the custom extension's `install()` call is the only available package-install vector (otherwise a user with kernel access can install packages directly regardless of this check)\n\n### Impact\n\nLow. No exposure for stock JupyterLab: the HTTP API and Extension Manager UI enforce the listing through a separate, correctly awaited check. The gap affected only custom extensions or downstream integrations that called the public `install()` method directly and relied on it to self-enforce.\n\n### Patches\n\nJupyterLab [`v4.6.2`](https://github.com/jupyterlab/jupyterlab/releases/tag/v4.6.2) and [`v4.5.10`](https://github.com/jupyterlab/jupyterlab/releases/tag/v4.5.10) contain the patch.\n\nUsers of applications that depend on JupyterLab, such as Notebook v7+, should update `jupyterlab` package too.\n\n### Workarounds\n\nNo action is required for deployments that only expose extension management through the JupyterLab HTTP API / Extension Manager UI, as that path was already enforcing the listing via the handler's own check. Deployments wanting to disable programmatic extension installation entirely can switch to the read-only extension manager:\n\n```bash\n--LabApp.extension_manager=readonly\n```\n\nor the following traitlet:\n\n```python\nc.LabApp.extension_manager = 'readonly'\n```\n\nYou can confirm that the read-only manager is in use from GUI:\n\n\u003cimg width=\"293\" height=\"293\" alt=\"image\" src=\"https://github.com/user-attachments/assets/8016c809-633e-4ed0-a5bc-6bc4793caa0f\" /\u003e","status":"published","published":"2026-07-22T23:12:22Z","modified":"2026-09-25T14:25:48.030827903Z","cvss":[{"version":"3.1","score":0,"vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:N","level":"none"}],"cwes":["CWE-284","CWE-636"],"updated_at":"2026-11-02T15:46:58.767335Z"},{"id":"OESA-2026-4167","title":"python-jupyterlab security update","description":"JupyterLab is the next-generation user interface for Project Jupyter offering all the familiar building blocks of the classic Jupyter Notebook (notebook, terminal, text editor, file browser, rich outputs, etc.) in a flexible and powerful user interface.\r\n\r\nSecurity Fix(es):\n\nJupyterLab versions \u0026gt;=4.6.0,\u0026lt;=4.6.1 and \u0026lt;=4.5.9 contain an allowlist/blocklist enforcement gap in PyPIExtensionManager.install(). A missing \u0026apos;await\u0026apos; caused the is_install_allowed coroutine to never execute, so the extension allowlist/blocklist check was not enforced for direct callers of install(). The stock JupyterLab HTTP API and Extension Manager UI are not affected, as they perform a separate, correctly awaited check. The issue affects only deployments where a custom extension or downstream integration imports PyPIExtensionManager and calls install() directly with a package name influenced by untrusted input, an allowlist/blocklist is configured, the PyPI Extension Manager is enabled, and kernels and terminals are disabled or delegated to remote hosts. Fixed in JupyterLab 4.6.2 and 4.5.10.(CVE-2026-73626)","status":"published","published":"2026-09-30T13:47:14Z","modified":"2026-10-01T02:00:03.599756537Z","cvss":[{"version":"3.1","score":7.5,"vector":"CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H","level":"high"}],"updated_at":"2026-11-02T15:52:47.643553Z"},{"id":"OESA-2026-4168","title":"python-jupyterlab security update","description":"JupyterLab is the next-generation user interface for Project Jupyter offering all the familiar building blocks of the classic Jupyter Notebook (notebook, terminal, text editor, file browser, rich outputs, etc.) in a flexible and powerful user interface.\r\n\r\nSecurity Fix(es):\n\nJupyterLab before 4.5.9 contains a stored cross-site scripting vulnerability in the Extension Manager that fails to validate URI protocols in package metadata URLs. Attackers can publish malicious PyPI packages with javascript: URLs in project metadata that execute arbitrary JavaScript in the JupyterLab origin when users click the extension name.(CVE-2026-67338)\n\nJupyterLab versions \u0026gt;=4.6.0,\u0026lt;=4.6.1 and \u0026lt;=4.5.9 contain an allowlist/blocklist enforcement gap in PyPIExtensionManager.install(). A missing \u0026apos;await\u0026apos; caused the is_install_allowed coroutine to never execute, so the extension allowlist/blocklist check was not enforced for direct callers of install(). The stock JupyterLab HTTP API and Extension Manager UI are not affected, as they perform a separate, correctly awaited check. The issue affects only deployments where a custom extension or downstream integration imports PyPIExtensionManager and calls install() directly with a package name influenced by untrusted input, an allowlist/blocklist is configured, the PyPI Extension Manager is enabled, and kernels and terminals are disabled or delegated to remote hosts. Fixed in JupyterLab 4.6.2 and 4.5.10.(CVE-2026-73626)","status":"published","published":"2026-09-30T13:47:15Z","modified":"2026-10-01T02:00:04.278032803Z","cvss":[{"version":"3.1","score":7.5,"vector":"CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H","level":"high"}],"updated_at":"2026-11-02T15:52:47.643553Z"},{"id":"UBUNTU-CVE-2026-73626","description":"JupyterLab versions \u003e=4.6.0,\u003c=4.6.1 and \u003c=4.5.9 contain an allowlist/blocklist enforcement gap in PyPIExtensionManager.install(). A missing 'await' caused the is_install_allowed coroutine to never execute, so the extension allowlist/blocklist check was not enforced for direct callers of install(). The stock JupyterLab HTTP API and Extension Manager UI are not affected, as they perform a separate, correctly awaited check. The issue affects only deployments where a custom extension or downstream integration imports PyPIExtensionManager and calls install() directly with a package name influenced by untrusted input, an allowlist/blocklist is configured, the PyPI Extension Manager is enabled, and kernels and terminals are disabled or delegated to remote hosts. Fixed in JupyterLab 4.6.2 and 4.5.10.","status":"published","published":"2026-08-13T12:17:00Z","modified":"2026-10-17T13:01:04.071388931Z","cvss":[{"version":"3.1","score":7.5,"vector":"CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H","level":"high"},{"version":"4.0","score":7.7,"vector":"CVSS:4.0/AV:N/AC:H/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N","level":"high"}],"updated_at":"2026-11-02T16:57:08.628462Z"},{"id":"BIT-jupyterlab-2026-73626","title":"JupyterLab before 4.6.2 Authentication Bypass via PyPIExtensionManager","description":"JupyterLab versions \u003e=4.6.0,\u003c=4.6.1 and \u003c=4.5.9 contain an allowlist/blocklist enforcement gap in PyPIExtensionManager.install(). A missing 'await' caused the is_install_allowed coroutine to never execute, so the extension allowlist/blocklist check was not enforced for direct callers of install(). The stock JupyterLab HTTP API and Extension Manager UI are not affected, as they perform a separate, correctly awaited check. The issue affects only deployments where a custom extension or downstream integration imports PyPIExtensionManager and calls install() directly with a package name influenced by untrusted input, an allowlist/blocklist is configured, the PyPI Extension Manager is enabled, and kernels and terminals are disabled or delegated to remote hosts. Fixed in JupyterLab 4.6.2 and 4.5.10.","status":"published","published":"2026-09-25T12:23:14.88Z","modified":"2026-09-25T14:25:48.030827903Z","updated_at":"2026-11-02T15:28:31.782692Z"},{"id":"openSUSE-SU-2026:11634-1","title":"jupyter-jupyterlab-4.5.10-1.1 on GA media","description":"These are all security issues fixed in the jupyter-jupyterlab-4.5.10-1.1 package on the GA media of openSUSE Tumbleweed.","status":"published","published":"2026-08-28T00:00:00Z","modified":"2026-08-29T09:15:04.360420392Z","updated_at":"2026-11-02T16:58:39.516824Z"}]}}
