We counted the weakness types (CWEs) in three public datasets for 1 September to 16 October 2026: every non-rejected CVE in the NVD, the 61 CVEs CISA added to KEV, and the 1,522 unique GitHub advisories for open source packages. Cross-site scripting (CWE-79) is the most common weakness across all CVEs, at 8.1%. It does not appear in a single one of the 61 KEV additions.
The three lists rank weaknesses very differently. That gap is the useful part, so the tables and the code to reproduce them are below.
How we counted
All data was downloaded on 18 October 2026.
- All CVEs. NVD CVE API 2.0 filtered by publication date from 2026-09-01 to 2026-10-16 returned 24,141 records. 207 were rejected, leaving 23,934. We collected every
weaknesses[].description[].valueper CVE, deduplicated within a CVE. - KEV. The
cwesfield of the CISA KEV JSON feed, for entries withdateAddedin the same window (61 entries, catalog version 2026.10.16). - GitHub advisories.
database_specific.cwe_idsin OSV's GHSA records published in the window and not withdrawn, deduplicated by ID.
# NVD: repeat with startIndex=0,2000,4000... and sleep between calls
curl -sS "https://services.nvd.nist.gov/rest/json/cves/2.0?pubStartDate=2026-09-01T00:00:00.000Z&pubEndDate=2026-10-16T23:59:59.999Z&resultsPerPage=2000&startIndex=0"
curl -sS -o kev.json https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json
import collections
# nvd_live: non-rejected NVD CVE objects; kev: KEV entries in the window; ghsa: unique GHSA records
def cwes(cve):
return {d["value"] for w in cve.get("weaknesses", []) for d in w["description"]}
nvd_counts = collections.Counter(c for x in nvd_live for c in cwes(x))
kev_counts = collections.Counter(c for v in kev for c in set(v["cwes"]))
ghsa_counts = collections.Counter(c for r in ghsa
for c in set(r["database_specific"].get("cwe_ids", [])))
print(nvd_counts.most_common(10))
A CVE with two CWEs counts once under each, so shares can add to more than 100%. We did not exclude the placeholders NVD-CWE-noinfo (20 CVEs) and NVD-CWE-Other (3) from the denominators.
What's affected
All 23,934 CVEs
21,489 CVEs (89.8%) have at least one numeric CWE. 2,431 (10.2%) have no weakness entry. 452 distinct CWEs appear. Of the 21,626 weakness entries, 1,157 are NVD's own (type Primary) and 20,469 come from the CNA (type Secondary).
| Rank | CWE | Name | CVEs | Share |
|---|---|---|---|---|
| 1 | CWE-79 | Cross-site scripting | 1,937 | 8.1% |
| 2 | CWE-862 | Missing authorization | 1,474 | 6.2% |
| 3 | CWE-416 | Use after free | 943 | 3.9% |
| 4 | CWE-89 | SQL injection | 847 | 3.5% |
| 5 | CWE-122 | Heap-based buffer overflow | 845 | 3.5% |
| 6 | CWE-125 | Out-of-bounds read | 812 | 3.4% |
| 7 | CWE-863 | Incorrect authorization | 750 | 3.1% |
| 8 | CWE-284 | Improper access control | 731 | 3.1% |
| 9 | CWE-639 | Authorization bypass through user-controlled key | 701 | 2.9% |
| 10 | CWE-22 | Path traversal | 697 | 2.9% |
The 61 KEV additions
| CWE | Name | KEV entries | Rank among all CVEs |
|---|---|---|---|
| CWE-287 | Improper authentication | 5 | 21 |
| CWE-22 | Path traversal | 4 | 10 |
| CWE-787 | Out-of-bounds write | 4 | 15 |
| CWE-77 | Command injection | 3 | 33 |
| CWE-78 | OS command injection | 3 | 13 |
| CWE-119 | Memory buffer errors | 3 | 26 |
| CWE-122 | Heap-based buffer overflow | 3 | 5 |
All 61 entries carry at least one CWE, 45 distinct in total. With counts this small, treat the order as a hint: CWE-287 leads by a single entry.
The 1,522 GitHub advisories
1,513 of the 1,522 have a CWE.
| Rank | CWE | Name | Advisories |
|---|---|---|---|
| 1 | CWE-22 | Path traversal | 120 |
| 2 | CWE-400 | Uncontrolled resource consumption | 113 |
| 3 | CWE-862 | Missing authorization | 102 |
| 4 | CWE-79 | Cross-site scripting | 92 |
| 5 | CWE-863 | Incorrect authorization | 86 |
| 6 | CWE-918 | Server-side request forgery | 81 |
| 7 | CWE-200 | Exposure of sensitive information | 74 |
| 8 | CWE-770 | Allocation of resources without limits | 66 |
| 9 | CWE-94 | Code injection | 55 |
| 10 | CWE-20 | Improper input validation | 50 |
Grouped view
We grouped CWEs into families. The lists are fixed in the code so you can change them.
| Family | CWEs in the family | All CVEs | KEV | GitHub advisories |
|---|---|---|---|---|
| Access control and authentication | 269, 284, 285, 287, 288, 290, 306, 639, 862, 863 | 20.8% | 26.2% | 19.8% |
| Memory safety | 119, 120, 121, 122, 125, 415, 416, 787 | 15.1% | 16.4% | 2.0% |
| Injection | 77, 78, 89, 94 | 8.0% | 14.8% | 7.0% |
| Path traversal | 22 | 2.9% | 6.6% | 7.9% |
| Cross-site scripting | 79 | 8.1% | 0.0% | 6.0% |
Memory safety bugs are rare in the open source package advisories (30 of 1,522) and common in the CVE feed overall (15.1%). Injection and path traversal are over-represented in KEV relative to all CVEs, and XSS is absent.
How to check if you're exposed
Count the families in your own backlog. If you export findings with a CWE column, this gives the same view:
python3 -c '
import csv, collections, sys
rows = csv.DictReader(open(sys.argv[1]))
c = collections.Counter(r["cwe"] for r in rows)
print(c.most_common(10))
' findings.csv
Then compare the top of your list with the KEV table above, not with the all-CVE table.
What to do now
- Rank fix work by weakness families that appear in KEV, starting with authentication, path traversal, command injection and memory errors on anything internet facing.
- Don't discard XSS findings, but don't let them set the order. They fill the CVE feed and were absent from KEV in this window.
- Add authorization tests for object access. Four of the top ten CWEs for all CVEs are access control types (862, 863, 284, 639).
- Add limits to anything that parses or allocates on user input. CWE-400 and CWE-770 appear in 113 and 66 of the open source advisories.
- Store the CWE with every finding so you can run this analysis on your own data.
Why it matters
CWE counts describe what developers get wrong, and KEV describes what attackers use. The two lists overlap but they are not the same list. Mixing them leads teams to spend effort on the weaknesses that are most common instead of the ones that are most exploited.
The caveat is size. 61 KEV entries in 46 days is a small sample, and the open source advisories skew to web applications and servers. Rerun the script on a longer window before you set policy.
Try it yourself
Pick the three most common CWEs in your own findings and compare them with the KEV table. Then run a code scan on one service and see which of these families it surfaces. The demo shows a static code scan from start to finish.
Click through it at your own pace, or open it full screen.
Quick check
Which weakness is most common across all CVEs in the window, and how often does it appear in KEV?
Cross-site scripting (CWE-79), in 1,937 of 23,934 CVEs (8.1%). It appears in none of the 61 KEV additions.
What is the most common KEV weakness in the window?
Improper authentication (CWE-287), in 5 of 61 entries, followed by path traversal (CWE-22) and out-of-bounds write (CWE-787) with 4 each.
Why is memory safety so rare in the GitHub advisory data?
Only 30 of 1,522 advisories (2.0%) carry a memory safety CWE, against 15.1% of all CVEs. We measured the gap and did not test why it exists.