Status: In Progress · Proposal
August 2026¶
Summary of Work Completed¶
11 reports were triaged including 3 by email, and fixes were written or reviewed for four of the accepted ones.
22 new advisories were opened across the Jupyter orgs in July + 8 emails received at security@jupyter
Jupyterlab desktop got its first release in two years to address a security issue that got published in a blog article.
Ten advisories were published this month, most of them in jupyterlab.
Deliverables/Milestones¶
Reports accepted and turned into advisories:
https://
github .com /jupyter -server /jupyter _server /security /advisories /GHSA -c3mw -737p -c7g2: fix written and merged https://
github .com /jupyterhub /binderhub /security /advisories /GHSA -q276 -fxp7 -xhx3: triaged, initially accepted then closed. https://
github .com /jupyterhub /jupyter -server -proxy /security /advisories /GHSA -569q -87m2 -93rh: opened, patch has been opened by the maintainer and needs to be merged. jupyterlab
-contrib /jupyter -archive #163, fix written and merged
Reports triaged and closed:
https://
github .com /voila -dashboards /voila /security /advisories /GHSA -q77q -6933 -cj7v https://
github .com /jupyterhub /jupyter -server -proxy /security /advisories /GHSA -q52h -2389 -h4hv => moved to a regular issue https://
github .com /jupyterhub /jupyter -server -proxy /security /advisories /GHSA -j85j -j8pw -f447 https://
github .com /jupyterhub /oauthenticator /security /advisories /GHSA -x86p -v62g -4vgj https://
github .com /jupyterhub /oauthenticator /security /advisories /GHSA -vj3f -h97x -f2vv
Published :
Supply chain / tooling
Improvements to github-security-overview (tool to aggregate GHSAs across multiple orgs): https://
github .com /Yann -P /github -security -overview and subsequently updated jupyter/cve#45
Statistics for July¶
Advisories in triage
Currently in triage: 17 (median age: 29 days)
Opened this month: 12
New advisories opened this month, all states: 22
Accepted advisories waiting for a fix
Advisories in draft: 50 (median age 186 days)
Advisories in draft older than 90 days: 30
Published advisories
All time: 80 (median time to publication 30 days)
This month: 10 (median time to publication 62.5 days)
Definitions
“age” : difference between current date and initial creation of the advisory. Does not take into account the date where the advisory was accepted (transition from triage to draft), because this information is not in the GH API.
“time to publication” = time between the initial creation of the advisory and publication date.
Challenges or Risks¶
Incoming volume is still the main risk: 22 new advisories opened this month. A large share of the reports still looks AI-generated and low signal.
The draft backlog is still very large.
Budget Update¶
Next Steps¶
Follow up on the fixes opened this month
Publish key indicators on jupyter.org for transparency (carried over from June).
Document the advisory publishing checklist in jupyter/security
Appendix¶
Script used for statistics¶
using https://
JUPYTER_ORGS=(binder-examples binderhub-ci-repos ipython jupyter jupyter-attic jupyter-book jupyter-governance jupyter-incubator jupyter-resources jupyter-server jupyter-standard jupyter-standards jupyter-widgets jupyter-xeus jupytercon jupyterhealth jupyterhub jupyterlab jupyterlite pickleshare voila-dashboards voila-gallery)
FROM_DATE=2026-07-01
TO_DATE=2026-08-01
security-overview "${JUPYTER_ORGS[@]}" --state triage | wc -l
security-overview "${JUPYTER_ORGS[@]}" --state triage | datamash median 1
security-overview "${JUPYTER_ORGS[@]}" --state triage --opened-from $FROM_DATE --opened-to $TO_DATE | wc -l
# All states, to measure incoming volume
security-overview "${JUPYTER_ORGS[@]}" --opened-from $FROM_DATE --opened-to $TO_DATE | wc -l
security-overview "${JUPYTER_ORGS[@]}" --state draft | wc -l
security-overview "${JUPYTER_ORGS[@]}" --state draft | datamash median 1
# Open for more than 90 days
security-overview "${JUPYTER_ORGS[@]}" --state draft --opened-to $(date -v-90d +%Y-%m-%d) | wc -l
security-overview "${JUPYTER_ORGS[@]}" --state published | wc -l
security-overview "${JUPYTER_ORGS[@]}" --state published | datamash median 3 # 3 is the column for time to publication
security-overview "${JUPYTER_ORGS[@]}" --state published --published-from $FROM_DATE --published-to $TO_DATE | wc -l
security-overview "${JUPYTER_ORGS[@]}" --state published --published-from $FROM_DATE --published-to $TO_DATE | datamash median 3July 2026¶
Summary of Work Completed¶
This month was focused on supply chain and measurements included below, and maintenance about the email addresses used to reach us and PGP keys. A few fixes. Issues in triage are stacking up and I need to prioritize this for the beginning of July.
Deliverables/Milestones¶
Automated inventories for supply chain security using GitHub actions: jupyter/cve#52, jupyter/cve#41, jupyter/cve#44
Removed PGP keys from all documentation since the private key is lost.
Initiated transition from security@ipython
.org to security@jupyter .org, tracked in jupyter /security #124 and jupyter /security #125 Fixed and published https://
github .com /jupyterlab /jupyterlab /security /advisories /GHSA -vmhf -c436 -hxj4 Fixed and published https://
github .com /jupyter -server /jupyter _server /security /advisories /GHSA -fcw5 -x6j4 -ccmp Reviewed fix for https://
github .com /jupyterlab /jupyterlab -git /security /advisories /GHSA -436q -jwfr -rm2h Bi-weekly security meetings attended: June 2, 16, 30
Statistics for June¶
Advisories in triage
Currently in triage: 17 (median age: 21 days)
Opened this month: 15
Accepted advisories waiting for a fix
Advisories in draft: 51 (median age 275 days)
Advisories in draft older than 90 days: 31
Published advisories
All time: 70 (median time to publication 27 days)
This month: 7 (median time to publication 64 days)
Definitions
“age” : difference between current date and initial creation of the advisory. Does not take into account the date where the advisory was accepted (transition from triage to draft), because this information is not in the GH API.
“time to publication” = time between the initial creation of the advisory and publication date.
Challenges or Risks¶
Lots of incoming reports, lots of them seem to be AI.
Budget Update¶
Next Steps¶
Publish key indicators on jupyter.org for transparency
Catch up on triage (lots of reports lately).
Appendix¶
Script used for statistics¶
using https://
JUPYTER_ORGS=(binder-examples binderhub-ci-repos ipython jupyter jupyter-attic jupyter-book jupyter-governance jupyter-incubator jupyter-resources jupyter-server jupyter-standard jupyter-standards jupyter-widgets jupyter-xeus jupytercon jupyterhealth jupyterhub jupyterlab jupyterlite pickleshare voila-dashboards voila-gallery)
FROM_DATE=2026-06-01
TO_DATE=2026-07-01
security-overview "${JUPYTER_ORGS[@]}" --state triage | wc -l
security-overview "${JUPYTER_ORGS[@]}" --state triage | datamash median 1
security-overview "${JUPYTER_ORGS[@]}" --state draft | wc -l
security-overview "${JUPYTER_ORGS[@]}" --state draft | datamash median 1
# Open for more than 90 days
security-overview "${JUPYTER_ORGS[@]}" --state draft --opened-to $(date -v-90d +%Y-%m-%d) | wc -l
security-overview "${JUPYTER_ORGS[@]}" --state published | wc -l
security-overview "${JUPYTER_ORGS[@]}" --state published | datamash median 3 # 3 is the column for time to publication
security-overview "${JUPYTER_ORGS[@]}" --state published --published-from $FROM_DATE --published-to $TO_DATE | wc -l
security-overview "${JUPYTER_ORGS[@]}" --state published --published-from $FROM_DATE --published-to $TO_DATE | datamash median 3June 2026¶
Context: contract with Yann-P started on 2026-06-01 (2 days ago) for the next 6 months at 8h/week as part of jupyter
Summary of Work Completed¶
As volunteer work before the contract started
Built a tool to oversee GHSAs over all the jupyter repositories: https://
github .com /Yann -P /github -security -overview Triaged ~20 GHSAs
Cleaned up spam in security@jupyter
.org Released jupyter_server v2.18.0 with security fixes
After start of contract
Tool to find supply chain security flaws across all jupyter repos (in jupyter/cve)
Deliverables/Milestones¶
As volunteer work before the contract started
Published advisories
as remediation developer:
https://
github .com /advisories /GHSA -37w4 -hwhx -4rc4 / CVE-2026-42266 https://
github .com /advisories /GHSA -24qx -w28j -9m6p / CVE-2026-40110 https://
github .com /advisories /GHSA -5789 -5fc7 -67v3 / CVE-2026-35397
as remediation reviewer:
https://
github .com /advisories /GHSA -mqcg -5x36 -vfcg / CVE-2026-42557
as coordinator:
https://
github .com /advisories /GHSA -qh7q -6qm3 -653w / CVE-2025-61669 https://
github .com /advisories /GHSA -rch3 -82jr -f9w9 / CVE-2026-40171 https://
github .com /advisories /GHSA -5mrq -x3x5 -8v8f / CVE-2026-40934
And a few others that are not yet published.
After start of contract
Supply chain inventory scripts in jupyter/cve
Detect repos that need github actions security (zizmor, actionlint)
Detect repos that need trusted publishing
Challenges or Risks¶
Budget Update¶
Next Steps¶
Quantify everything (# of open GHSAs, # of repos that needs supply chain hardening, ...) and track progress over time.
More tools to oversee supply chain security across all repos
Triage new GHSAs as they are reported.
If I have time, work on fixes.