Skip to main content
Blog
Blog Attacks

Web Supply Chain Attack Explained: The Polyfill.io Incident, Full Timeline & Lessons (2024-2026)

A web supply chain attack turns trusted third-party code against visitors. See how the Polyfill.io attack hit 490,000+ sites and what it teaches about JavaScript supply chain risk.

Jun 14, 2026 11 min read
Web Supply Chain Attack Explained: The Polyfill.io Incident, Full Timeline & Lessons (2024-2026)

TL;DR: Polyfill.io attack timeline

  • The count was wrong: The headlines said 100,000 sites and that was wrong, because it was the default result cap of the PublicWWW search tool the researchers used, and the actual footprint was much larger and heavier on high-trust properties.
  • The real footprint: cside ran the search past the cap and found over 490,000 websites carrying polyfill.io, and Censys independently counted 384,773 affected hosts on 2 July 2024 before OFAC sanctioned Funnull on 29 May 2025.
  • Trust is not a control: If a single vendor script can flip malicious after being trusted since 2015, source-based approval is not a control, so monitor runtime behavior on every session instead of trusting a one-time vendor sign-off.

Short on time? See cside's in-browser Magecart and skimmer blocking. It covers everything below in one deployment.

Quick answer: A web supply chain attack compromises a third-party library or CDN service that legitimate websites already trust, then uses that trust to run attacker-controlled code in every visitor's browser. The Polyfill.io attack is the clearest documented example: the trusted polyfill service was acquired by Funnull in February 2024, turned malicious by June, and hit more than 490,000 websites before anyone noticed. This page explains how the attack category works, documents the Polyfill.io incident in full, and shows what your site needs to do differently.

Update 2026-07-19: Added a section on web supply chain attack types and how the category works, plus new FAQ entries. The core Polyfill.io timeline and data are unchanged.

What is a web supply chain attack?

A web supply chain attack compromises a third-party JavaScript library, CDN, or service that legitimate websites load and trust. Because the page loads that code as if it were its own, the attacker gains code execution in every visitor's browser without touching the target site directly.

A web supply chain attack has a few defining properties. The victim site approved the script once, and the attacker inherits that trust permanently. The payload runs client-side, after the server has already sent the page, so one compromised library propagates to every site that loads it. WAFs, CDN logs, and server-side scanners see no anomaly, because the attack happens entirely in the browser.

Polyfill.io is the most documented case in this category. A free, widely trusted utility sat on hundreds of thousands of sites. New owners turned it into an attack surface overnight, and no site owner changed a single line of code.

How web supply chain attacks work: four main vectors

Web supply chain attacks share the same trust-abuse model but reach sites through different entry points.

Attack typeHow it worksHow the polyfill.io attack fits
CDN / domain takeoverAttacker acquires a domain that sites already load via script tagsFunnull bought polyfill.io; sites kept loading it without any code change
npm package hijackingA popular package is taken over or a typosquat is published; CI pipelines pull the malicious version into the buildNot this attack, but the risk is the same if build output embeds the package client-side
Open-source repository compromiseMaintainer account is taken over; a malicious release is pushed to the official packageThe polyfill.io GitHub repo changed ownership along with the domain
Dependency confusionAn internal package name is registered on the public registry; the build pulls the attacker's version by defaultNot this attack, but affects sites that bundle and serve dependencies from their own CDN

The common thread: in all four cases, code you did not write ends up executing in your users' browsers with the same trust level as your own JavaScript.

The Polyfill.io web supply chain attack: full record

The short version

  • The polyfill.io domain was sold to Funnull in February 2024. By June it was serving malicious redirects.
  • There is no incident-wide CVE; the closest, CVE-2024-38526, is scoped to the pdoc documentation tool that loaded polyfill.io, not the attack itself.
  • The real scale was 490,000+ websites, not the widely quoted 100,000. That figure was PublicWWW's default result cap. cside reported the true number first.
  • The captured payload was a mobile-only redirect to scam and betting sites, built to evade researchers.
  • On 2025-05-29, OFAC sanctioned Funnull and its administrator Liu Lizhi.
  • As of 2026-05-18, more than 61,000 pages still embed polyfill.io. If yours is one of them, remove it.

Full timeline (2009-2026)

DateEvent
2009-2010Remy Sharp coins the term "polyfill"; the idea spreads through the web development community
2014Andrew Betts builds the polyfill.io service at Financial Times Labs; one script tag tailors polyfills to each browser
2014-10-28HTML5 becomes a W3C Recommendation; evergreen, auto-updating browsers soon make polyfill.io largely unnecessary
~2023The Financial Times hands the project to its long-time maintainer, Jake Champion
Feb 2024The polyfill.io domain and GitHub repository are sold to Funnull, a Chinese-operated company
2024-02-25Andrew Betts warns publicly: "If your website uses polyfill.io, remove it IMMEDIATELY"
2024-02-29Cloudflare publishes a safe cdnjs mirror to reduce supply-chain risk; Fastly stands up its own mirror days earlier
2024-06-24Japanese researcher "piyokango" flags the malicious behavior
2024-06-25Sansec publishes its forensic disclosure; cside publishes the same day and reports the real 490,000+ scale
2024-06-26Cloudflare begins auto-rewriting polyfill.io to its mirror; Google warns affected advertisers
2024-06-27Namecheap suspends the polyfill.io domain
2024-07-02Censys independently counts 384,773 affected hosts
2025-05-29OFAC sanctions Funnull and administrator Liu Lizhi; the FBI ties 548 Funnull CNAMEs to 332,000+ domains
2026-05-1861,593 pages still embed polyfill.io

The "100,000 sites" number was wrong

Almost every report about this attack used the same figure: roughly 100,000 sites. That number is an artifact of the tool, not a measurement of the attack.

Researchers, cside included, used PublicWWW to find every page containing the polyfill.io snippet. PublicWWW caps results at 100,000 by default. So every count that relied on it landed at "100,000+." When we ran the search past the cap, the real number was more than 490,000 websites.

This matters because the affected set was not random. It skewed heavily toward high-traffic, high-trust destinations: banks, government sites, major publishers, and well-known brands. Reporting "100,000" undersold an attack that was nearly five times larger. cside surfaced the true 490,000+ figure, correcting the public record, and Censys's independent count of 384,773 hosts on 2024-07-02 confirms the scale was far past 100,000.

What the malicious code actually did

The behavior that was captured, decoded, and published was a redirect. Sansec's forensic report on 2024-06-25 showed the tampered script sending some mobile visitors through a fake Google Analytics typosquat, googie-anaiytics[.]com (note the swapped letters), and on to sports-betting and adult sites.

The tradecraft is what made it dangerous and hard to catch. The redirect:

  • fired only on mobile devices, never desktop;
  • varied by geographic region and by time of day;
  • hit each device or IP only once, so neither a victim nor a researcher could reproduce it on refresh;
  • went quiet when it detected an admin user or the presence of web analytics;
  • shipped with anti-reverse-engineering armor.

Because polyfill.io was a dynamic service by design, the operator could serve clean code to one visitor and malicious code to the next. Subresource Integrity could not help, because it pins a hash of a fixed file and this service had no fixed file. The script ran first-party in each site's own origin, so it had access to that page's DOM, forms, and cookies, and it sat on the CSP allowlists of hundreds of thousands of trusted domains.

Was it only a redirect? That is the honest, unresolved part. Independent deobfuscation of the recovered payload found redirect logic and nothing else: no keystroke capture, no credential theft. But the per-request design means a variant aimed at one high-value visitor need never appear in any public scan. The redirect is what was caught. What else may have run during those months cannot be proven either way. We made the capability case in detail in The Polyfill.io attack: more than just a redirect attack.

For the full incident write-up from the time, see The Polyfill attack explained and our same-day report, More than 490k websites targeted in a web supply chain attack.

Is there a CVE for the Polyfill.io attack?

There is no single CVE assigned to the Polyfill.io incident itself. The closest identifier in the National Vulnerability Database is CVE-2024-38526, but it is scoped to pdoc, a Python API-documentation tool that linked to polyfill.io in the docs it generated (fixed in pdoc 14.5.1). It does not cover cdn.polyfill[.]io or the wider set of affected sites. If you manage a vulnerability program, track this incident by its affected domains (cdn.polyfill[.]io, plus the related bootcdn[.]net, bootcss[.]com, staticfile[.]net, staticfile[.]org, and unionadjs[.]com) rather than a single CVE, and reference CVE-2024-38526 only for pdoc exposure.

The Funnull connection and the 2025 sanctions

Polyfill.io was not a one-off. The domain's buyer, Funnull, ran a much larger operation.

On 2025-05-29, the U.S. Treasury's Office of Foreign Assets Control sanctioned Funnull Technology Inc. and its administrator, Liu Lizhi. Treasury tied Funnull's infrastructure to more than $200 million in U.S. victim-reported losses from investment scams, the pattern often called pig butchering. Its notice described the polyfill connection without naming the service: in 2024 Funnull "purchased a repository of code used by web developers and maliciously altered the code to redirect visitors of legitimate websites to scam websites and online gambling sites."

The same day, the FBI tied 548 Funnull CNAMEs to more than 332,000 domains. This is infrastructure laundering: renting reputable cloud and CDN space through illicit accounts and reselling it to scammers so malicious sites look legitimate and stay hard to remove. We covered the sanctions and what they mean for security teams in Funnull sanctioned: what the Polyfill.io attack exposed about infrastructure laundering.

Who is still exposed

Sanctions disrupt a company. They do not remove code from your site. As of 2026-05-18, PublicWWW still listed 61,593 pages containing polyfill.io, well over a year after the domain was suspended.

That residue is the real lesson. Browser dependencies stay embedded long after a domain is blocked, because people do not remove things. Every one of those pages is still pointed at a domain that has already been weaponized once.

How to find and remove Polyfill.io today

Start with the pages that touch login, checkout, account creation, payment, and personal data.

  1. Search your source code, tag managers, CMS templates, and legacy snippets for polyfill.io, plus the related domains bootcdn[.]net, bootcss[.]com, staticfile[.]net, staticfile[.]org, and unionadjs[.]com.
  2. Remove the references. Modern browsers no longer need these polyfills, so deletion is safer than swapping in a mirror.
  3. Map every remaining third-party script to an owner, a purpose, a page scope, and a data-access level.
  4. Flag scripts that load more scripts, build URLs dynamically, or behave differently by user agent, region, or session.
  5. Use Subresource Integrity only where a script is static and the provider supports stable hashes.
  6. Tighten Content Security Policy on sensitive flows, starting in report-only mode.
  7. Monitor what scripts actually do at runtime, so an ownership change or a new payload is visible when real users load the page.

What this attack teaches about web supply chain security

The Polyfill.io attack worked because trust was treated as permanent. A script approved once kept running after the company behind it changed and after the code it served changed. Server logs did not see it. Vendor questionnaires did not catch it. The browser executed it anyway.

That gap, between trusted inclusion and runtime execution, is exactly what cside was built to close. cside works at the browser layer, where third-party scripts actually run. It shows which scripts load on real pages, what they call, how they change, and whether they attempt suspicious behavior such as unexpected redirects or data access. In the Polyfill.io case, that runtime view is what flags a trusted dependency the moment it turns hostile.

The next polyfill.io is already on the web somewhere, embedded and trusted. The only reliable way to catch it is to watch what your scripts do, not just who shipped them. Secure your site for free with cside and see every script your users actually load.

Simon Wijckmans
Founder & CEO

Founder and CEO of cside. Previously a product manager on Cloudflare Page Shield (now Cloudflare Client-Side Security). Co-chair of the W3C Anti-Fraud Community Group and a Forbes 30 Under 30 honoree. Building accessible security against client-side attacks, web security is not an enterprise-only problem.

FAQ

Frequently Asked Questions

A web supply chain attack occurs when an attacker compromises a third-party JavaScript library, CDN, or service that legitimate websites embed. Because the target site loads that code with the same trust as its own assets, the attacker gains execution inside the browser of every visitor who loads the page. The attack bypasses server-side defenses because it runs entirely on the client side. Common vectors include CDN domain takeover, npm package hijacking, and open-source repository compromise.

Polyfill.io was a popular service that delivered JavaScript polyfills to websites through a single script tag. In February 2024 the domain and its GitHub repository were sold to Funnull, a Chinese-operated company. By June 2024 the service was serving malicious code that redirected mobile users to scam and sports-betting sites. Because the script ran first-party on every site that embedded it, the operator could change what it served at any time.

Most coverage said 100,000. That number was wrong. It was the default result cap of PublicWWW, the code-search tool researchers used to count embeds. cside ran the same search past the cap and found more than 490,000 websites carrying the script. Censys independently counted 384,773 affected hosts on 2024-07-02. The real footprint was far larger than the headline figure, and skewed toward high-traffic, high-trust sites.

The main types are: CDN domain takeover (an attacker acquires a domain that sites already load, the polyfill.io method); npm package hijacking (a typosquat or account-compromise plants malicious code in a widely installed package); open-source repository compromise (a maintainer account is taken over and a malicious release is published); and dependency confusion (an internal package name is registered on a public registry, causing CI/build pipelines to pull the attacker's version). All four result in attacker-controlled code running in your users' browsers or your build pipeline.

No. There is no single CVE for the Polyfill.io incident itself. CVE-2024-38526 is the closest identifier in the National Vulnerability Database, but it is scoped to pdoc, a Python documentation tool that loaded polyfill.io in its generated docs (fixed in pdoc 14.5.1), not the cdn.polyfill[.]io domain or the hundreds of thousands of other sites that embedded the script.

The behavior that was captured and decoded was a redirect. It sent some mobile visitors to a fake Google Analytics typosquat (googie-anaiytics[.]com) and on to betting and adult sites. The redirect fired only on mobile, varied by region and time of day, hit each device once, and went quiet when it detected an admin user or analytics. Independent deobfuscation found only redirect logic in the recovered sample. Because the service generated code per request, a targeted data-theft variant aimed at specific visitors could never be ruled out, but none was ever publicly captured.

Funnull bought the polyfill.io domain in early 2024. On 2025-05-29 the U.S. Treasury's OFAC sanctioned Funnull Technology Inc. and its administrator Liu Lizhi for providing infrastructure tied to more than $200 million in U.S. victim-reported scam losses. Treasury's notice described Funnull purchasing a code repository used by web developers and altering it to redirect visitors, which matches the Polyfill.io incident.

Search your source code, tag managers, CMS templates, and old snippets for polyfill.io, plus the related domains bootcdn[.]net, bootcss[.]com, staticfile[.]net, staticfile[.]org, and unionadjs[.]com. Remove any references. Modern browsers no longer need these polyfills, so the safest fix is deletion. Then monitor what third-party scripts actually load at runtime, because a trusted vendor domain can change hands or change behavior after approval.

Web application firewalls, intrusion detection systems, and server-side scanners inspect requests and responses at the network layer. A web supply chain attack runs in the visitor's browser, after the page has been delivered. The malicious script loads from what appears to be a trusted domain, executes with full DOM access, and exfiltrates data or redirects visitors without touching the server at all. Tools that only inspect server-side traffic see nothing. Only runtime browser monitoring can observe the attack as it actually executes.

Monitor and Secure Your Third-Party Scripts

Gain full visibility and control over every script delivered to your users to enhance site security and performance.

Start free, or try Business with a 14-day trial.

cside dashboard interface showing script monitoring and security analytics
Related Articles
Book a demo

When is a good time to talk?

You've spent some time on our website and we'd love to get to know you. Let's book some time so we can see where we could help.

We'll walk you through:

Which third-party scripts are running on your site right now
Where you stand on PCI DSS 6.4.3 and 11.6.1
How much of your traffic is bots and AI agents

Finding open slots…

Real humans only. We'd know.

Having trouble booking? Open scheduler in a new tab

What are you trying to solve?

Tell us in a line and we'll come back with something useful, not a generic pitch.

We usually help with:

Seeing which third-party scripts run on your site
PCI DSS 6.4.3 and 11.6.1 evidence
Bots, AI agents and account takeover

Prefer to just book a time? Pick a slot instead