Firefox vulnerability disclosures

Distinct CVEs

The final bar is a partial quarter.

Every distinct CVE, by impact

Mozilla's advisory impact rating; colour is the credit band. The few undated CVEs are absent.

Definition

Mozilla publishes one YAML file per security advisory, and each CVE inside it carries a reporter string. The same CVE can appear in advisories for several products or releases, so a mention count moves with how Mozilla packages releases as well as with discovery. The counted unit is therefore the distinct CVE ID: a flaw fixed in Firefox, Firefox ESR and Thunderbird on the same day is one event, not three.

A "discovery" in this series is one distinct CVE ID appearing in that year's advisories, dated by its earliest announcement. It is a disclosure count, not a count of bugs found or bugs remaining. Each CVE carries one of four credit bands: explicit_ai when a reporter string names an AI system or method, ai_affiliated when it names only an AI-security employer, fuzz when it names a fuzzer, and other otherwise. Because Mozilla's reporter strings frequently name fuzzers, fuzzing is counted as its own band rather than folded into the human or the AI side.

Facts

Firefox CVEs by impact: distinct-CVE counts by Mozilla's impact rating and reporter credit.

The impact heatmap cuts the per-CVE ledger by Mozilla's own rating, one count grid for all finders and one per credit band, each cell printing its count. Unrated is a missing rating, not a mild one; its row stays on the chart while the ledger holds such a row.

Advisory–CVE mentions against distinct CVE IDs for Firefox.

The counting-units chart plots the two units together. The gap between them is Mozilla's packaging: more products shipping the same fix multiply mentions without adding a distinct CVE.

The collection-wide cumulative index redraws this series as cumulative distinct CVEs to date:

Cumulative distinct CVEs to date.

Method

The CSVs are built by fetch.py, which walks every announce/*.yml file in Mozilla's repository, takes each advisory's date and year from its announced field — normalizing the ordinal forms a few advisories write, like "December 15th, 2025" — and skips advisories announced after the repository's snapshot date, so a refetch reproduces the committed window. It classifies each CVE's reporter string with the shared markers in ../../lib/credits.py: EXPLICIT_AI_METHOD matches a named system or method (Claude, GPT, Gemini, Big Sleep, Mythos, and the bare words "LLM" and "agent"); AI_AFFILIATION matches an employer (Anthropic, OpenAI, Aisle, XBOW, ZeroPath, AntAISecurityLab); FUZZ matches "fuzz" and is orthogonal to both, so an AI-written harness can be true in two columns at once. Bare "Claude" is accepted only from 2024 onward, so a human reporter with that given name cannot create a historical AI credit. Pre-2016 advisories do not list CVEs in this structure, which is where the series starts.

Bars need one band per segment, so a display precedence applies: method, then affiliation, then fuzz, then none. Where one CVE carries different reporter strings in different advisories, its signals are unioned across the year before that precedence is applied. The annual CSV keeps the mention-level columns (total, ai_attributed, fuzz_attributed, other_attributed) beside the distinct-CVE ones, so the older unit remains auditable.

firefox-cves.csv is the ledger the aggregates summarize: one row per distinct CVE per year, carrying its earliest announcement date and quarter, the most severe impact any of its mentions carries, its credit band and its verbatim reporter strings. firefox-by-quarter.csv sums it by quarter and band; rows with no parseable announcement date appear in the annual counts but not in any quarter, and the main and cumulative charts state that remainder.

figure.py draws stacked quarterly bars from firefox-by-quarter.csv: other in blue, fuzz in amber, ai_affiliated in pale red and explicit_ai in full red, with the partial_quarter bar outlined. The two red bands are one colour family in two strengths because they are two grades of evidence, not two kinds of finder. January 2026 onward is shaded, as in every figure here. The same script draws the impact heatmap from the per-CVE ledger — shading scaled within each panel — and the counting-units chart, kept as a separate figure because by 2026 mentions run more than three times distinct CVEs and sharing an axis would flatten the bars. check.py recomputes the fact lines above and fails when the ledger, the quarterly sums and the annual bands stop agreeing.

Limitations

AI attribution

Of the 37 AI-marked distinct CVEs in 2026, 31 are credited to a single seven-person team using Claude; the credit string is identical on all 31 rows of firefox-ai-cves.csv:

"Evyatar Ben Asher, Keane Lucas, Nicholas Carlini, Newton Cheng, Daniel Freeman, Alex Gaynor, and Joel Weinberger using Claude from Anthropic" — Mozilla advisory reporter string for CVE-2026-2763 and 30 further CVEs, vendored in firefox-ai-cves.csv, read 2026-08-14

Those 31 CVEs are roughly 9% of everything Firefox disclosed in 2026 through 2026-08-04. The remaining 6 AI-marked CVEs of 2026, with credit strings quoted from the same file as read 2026-08-14: 3 credit "Amy Burnett of OpenAI", 1 credits "Artur Cygan of Trail of Bits in partnership with OpenAI", 1 credits "OpenAI Preparedness, Bill Demirkapi" — all affiliation credits naming no method — and 1 carries the method-naming credit "Claude, Kai Engert" (CVE-2026-14899).

The single AI-marked CVE of 2025 is CVE-2025-13016, whose reporter strings are "Aisle Research | Igor Morgenstern" in the vendored ledger — an affiliation with no method stated. No reporter string carries an AI marker before 2025, as of the 2026-08-04 snapshot. Alex Gaynor also appears in OpenSSL's finder table (../cyber-openssl/) [@anthropicmythos2026; @aisle2026].

Sources