Status: In Progress · Proposal
September 2026¶
Summary of Work Completed¶
This month was focused on a triage catchup (20 advisories + 4 emails), mostly closing a lot of duplicates. We have a few vulnerabilities that are reported dozen of times due to AI.
The counterpart is that I had no time to write fixes, although I reached with two subprojects about open vulnerabilities.
I put together some statistics in JupyterLab: https://
I am drafting a new funding proposal with Carreau to continue this proposal after December
I was elected as the software steering security representative. Thanks to Jason Grout for handling the documentations updates consecutive to this!
Deliverables/Milestones¶
Documentation:
6 pull requests to group security policies to meta-repositories (org/.github/SECURITY.md) and remove the old email security@ipython
.org (jupyter /security #125, jupyter /security #124)
Processed GHSAs:¶
Closed as duplicates:
Click to expand
GHSA-97p8-mh5v-38xq
GHSA-vccx-hp5j-37j8
GHSA-7q97-7g2m-4354
GHSA-x5jj-xcv9-4w75
GHSA-53c8-rxh3-3jq5
GHSA-r3c6-864h-gvwh
GHSA-q6q9-3wvc-924p
GHSA-xqvq-73g7-v63q
GHSA-6j57-j9w6-6fcw
GHSA-mcx4-2x35-qq67
GHSA-9fr6-rgcw-3cwp
GHSA-ch66-5pm6-f4c9
Closed as not a vulnerability:
Click to expand
GHSA-6pmw-6fjc-rqjj
Accepted
Click to expand
GHSA-7rvj-4prw-5h89
GHSA-4hx8-6pmx-236v
GHSA-h2fj-rjp3-387r
GHSA-65hh-f7w2-rh2m
GHSA-f249-v4h8-2j54
GHSA-6c95-ghgq-3p9c
GHSA-chg9-78g7-w373
Published
Click to expand
GHSA-c3mw-737p-c7g2
Statistics for August¶
Advisories in triage
Currently in triage: 11 (median age: 28 days)
New advisories opened this month: 20 (+ 4 by email)
Opened this month and still in triage: 7 (+ 0 by email)
Accepted advisories waiting for a fix
Advisories in draft: 56 (median age 135.5 days)
Advisories in draft older than 90 days: 34
Published advisories
All time: 84 (median time to publication 32 days)
This month: 4 (median time to publication 33 days)
Challenges or Risks¶
Backlog of accepted advisories waiting to be fixed is high and not decreasing.
Reports keep flowing in at high volumes.
Budget Update¶
Next Steps¶
Long term initiatives, not yet started:
Ownership initiative: map every repo to a subproject to be able to contact someone in charge when needed.
Labeling initiative: find a way to “flag” unmaintained projects with security risks.
Think about writing a blog post about security, because these reports probably don’t get read a lot by the users.
Appendix¶
Script used for statistics¶
See August 2026 report.
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.