From 1 September to 16 October 2026, 1,609 GitHub-reviewed advisories were published across package ecosystems, per OSV's mirror of the GitHub Advisory Database. 63 were later withdrawn, leaving 1,546 active entries. npm has 533 of them, PyPI 359 and Go 313.
We counted from public bulk files downloaded on 18 October 2026. This post shows how, so the numbers are reproducible, and what the split means for your triage queue.
How we counted
OSV publishes one zip per ecosystem. Every GitHub advisory in those zips has an ID starting with GHSA- and a database_specific block with the GitHub severity and a github_reviewed flag. We kept records whose published date falls from 2026-09-01 to 2026-10-16 inclusive (UTC).
for e in npm PyPI Go Maven NuGet RubyGems crates.io Packagist Pub Hex; do
curl -sS -o "$e.zip" "https://osv-vulnerabilities.storage.googleapis.com/$e/all.zip"
done
import zipfile, json, collections
rows = []
for eco in ["npm", "PyPI", "Go", "Maven", "NuGet", "RubyGems",
"crates.io", "Packagist", "Pub", "Hex"]:
z = zipfile.ZipFile(f"{eco}.zip")
for name in z.namelist():
if name.startswith("GHSA-"):
d = json.loads(z.read(name))
if "2026-09-01" <= d["published"][:10] <= "2026-10-16":
d["_eco"] = eco
rows.append(d)
active = [d for d in rows if not d.get("withdrawn")]
print(len(rows), "entries,", len({d["id"] for d in rows}), "unique IDs,", len(active), "active")
for eco, n in collections.Counter(d["_eco"] for d in active).most_common():
sev = collections.Counter(d["database_specific"]["severity"]
for d in active if d["_eco"] == eco)
print(eco, n, dict(sev))
A count is per advisory per ecosystem. An advisory that affects two ecosystems appears in both zips and counts once in each. That is why there are 1,609 entries but 1,585 unique IDs. Every entry in the window has github_reviewed set to true.
What's affected
| Ecosystem | Active entries | Share | Critical | High | Moderate | Low | Critical or High |
|---|---|---|---|---|---|---|---|
| npm | 533 | 34.5% | 72 | 245 | 189 | 27 | 59.5% |
| PyPI | 359 | 23.2% | 32 | 146 | 171 | 10 | 49.6% |
| Go | 313 | 20.2% | 29 | 141 | 128 | 15 | 54.3% |
| Packagist | 121 | 7.8% | 8 | 52 | 51 | 10 | 49.6% |
| Maven | 80 | 5.2% | 10 | 36 | 29 | 5 | 57.5% |
| NuGet | 75 | 4.9% | 6 | 49 | 18 | 2 | 73.3% |
| crates.io | 45 | 2.9% | 1 | 23 | 17 | 4 | 53.3% |
| RubyGems | 11 | 0.7% | 1 | 4 | 6 | 0 | 45.5% |
| Hex | 8 | 0.5% | 0 | 4 | 3 | 1 | 50.0% |
| Pub | 1 | 0.1% | 0 | 1 | 0 | 0 | 100.0% |
| Total | 1,546 | 159 | 701 | 612 | 74 | 55.6% |
Counts are by the severity label GitHub assigns, not by a CVSS score we computed. 1,512 of the 1,546 active entries (97.8%) list at least one fixed version.
A few packages produce a lot of advisories
The 1,546 entries cover 587 distinct packages, going by the first affected package listed in each record. 361 of those packages have a single advisory. The ten busiest account for 260 entries, or 16.8%:
| Ecosystem | Package | Advisories |
|---|---|---|
| Go | github.com/siyuan-note/siyuan/kernel | 48 |
| npm | vm2 | 30 |
| Go | code.vikunja.io/api | 29 |
| Packagist | getgrav/grav | 27 |
| PyPI | nltk | 26 |
| PyPI | mcp-atlassian | 25 |
| npm | ghost | 20 |
| Go | github.com/0xJacky/Nginx-UI | 19 |
| PyPI | open-webui | 18 |
| npm | payload | 18 |
An advisory count tells you how much reporting a project got, not how risky it is to run. One maintainer receiving a batch of reports shows up as a spike here.
How to check if you're exposed
Pull the advisories for the packages you actually use instead of reading the whole feed. OSV answers per package:
curl -s -X POST https://api.osv.dev/v1/query \
-d '{"package":{"name":"vm2","ecosystem":"npm"},"version":"3.9.19"}' \
| python3 -c 'import json,sys; [print(v["id"]) for v in json.load(sys.stdin).get("vulns",[])]'
Replace the name, ecosystem and version with a line from your lockfile.
What to do now
- Triage by what you run, not by ecosystem totals. npm leads on volume, but NuGet had the highest share of High or Critical entries at 73.3%, on a small base of 75.
- Expect upgrades, not workarounds. 97.8% of entries list a fixed version, so most of the queue is a version bump.
- Look for packages with many advisories in your tree. If one of the ten above is a direct dependency, expect more upgrade pressure from it.
- Deduplicate before you count. Raw advisory counts overstate unique issues: 63 entries in this window were withdrawn as duplicates.
Quick check
How many active GitHub-reviewed advisories were published from 1 Sep to 16 Oct 2026?
1,546 advisory-ecosystem entries from 1,522 unique advisories, after removing 63 that were withdrawn.
Which ecosystem had the highest share of High or Critical advisories?
NuGet, with 55 of 75 entries (73.3%). npm was next at 59.5% on a larger base of 533.