A monthly count of malicious package records can jump a hundredfold in one month. In OSV, npm shows 142,163 records dated November 2025 against 1,067 for December. Spikes like this tell you a batch was filed, not that the risk to you changed. Track what you install, not feed totals.
Method
We downloaded the OSV exports for npm, PyPI and RubyGems on 19 October 2026 and counted records whose ID starts with MAL-, excluding withdrawn ones, by the month in their published field. The published date is when the record was published in OSV, which may be later than when the package was uploaded or attacked.
We do not know why individual months spike. We only show the counts.
What the numbers say
npm, selected months:
| Month | Malicious records |
|---|---|
| June 2025 | 802 |
| July 2025 | 1,030 |
| August 2025 | 35,099 |
| September 2025 | 5,579 |
| November 2025 | 142,163 |
| December 2025 | 1,067 |
| March 2026 | 1,047 |
| August 2026 | 4,078 |
| September 2026 | 886 |
RubyGems is quieter but has the same shape. Most months of 2025 and 2026 hold between 1 and 120 records. July 2026 holds 2,540 and September 2026 holds 611.
PyPI is steady by comparison: between 56 and 265 per month from June 2025 through October 2026.
So three ecosystems, three patterns: lumpy, lumpy at a smaller scale, and steady.
Three numbers to track instead
Feed totals answer a question you are not asking. These answer the ones you are.
- Hits against your own inventory. How many packages in your lockfiles, images and build caches appear in a malicious record this week? Most weeks the answer should be zero, and when it is not, you need it within hours.
- Time to remove. For each hit, how long between the record being published and the package being gone from every build? That is a number you control.
- New names admitted. How many dependencies were added in the last 30 days, and how many were reviewed? Malicious packages enter through new names more often than through old ones.
A fourth, optional number: share of installs that go through a gate that blocks known malicious names. If the gate is absent, everything depends on a human noticing.
Treat a spike as a prompt to recheck number 1. If a large batch lands, rescan your lockfiles the same day and confirm that nothing you use is on it.
Quick check
Does a spike mean attacks increased?
Not necessarily. A record's published date can reflect when a batch was filed. The count of attacks and the count of records are different things.
Which ecosystem's monthly count is most stable?
Of the three we looked at, PyPI, at 56 to 265 per month from June 2025 to October 2026.
Sources
- OSV data sources and per-ecosystem downloads, fetched 19 October 2026
- OSV schema, fetched 19 October 2026
Last reviewed: 19 October 2026.