Detect polyfill.io and Funnull CDN malware on GitHub Pages and arbitrary websites
Project description
bootlegg
Detect GitHub Pages sites loading scripts from Funnull-controlled CDNs — polyfill.io, BootCSS, BootCDN, Staticfile, and a growing set of typosquat fronts.
Our scan found 1,960 GitHub Pages sites still loading malicious CDN scripts as of June 2026: 786 via polyfill.io (weaponized June 2024), 1,191 via Funnull's BootCSS / BootCDN / Staticfile CDNs (malicious since June 2023, OFAC-sanctioned May 2025). Infected sites collectively carry over 530,000 GitHub stars — including microsoft/AirSim (18k ⭐), deeplearning-ai/machine-learning-yearning-cn (7.8k ⭐), and CyC2018/CS-Notes (184k ⭐), the primary technical interview reference for Chinese software engineers.
Install
pip install bootlegg
Or run directly without installing:
python3 -m bootlegg https://user.github.io/repo/
Usage
bootlegg https://user.github.io/repo/
For github.io URLs, bootlegg automatically finds the source repo and runs two checks:
- Source scan — searches GitHub Code API for CDN references in the repo's files
- Live crawl — fetches the site (mobile UA + desktop fallback), walks linked pages
up to
--max-pages(default: 30), and scans each for malicious script tags
# GitHub token raises source scan from 10 → 30 req/min
bootlegg https://user.github.io/repo/ --token ghp_xxx
# or: export GITHUB_TOKEN=ghp_xxx
# Any site (no GitHub source search)
bootlegg https://example.com --no-github
# Single-page check, no crawl
bootlegg https://user.github.io/ --max-pages 1
# JSON output for scripting; exits 1 if infected
bootlegg https://user.github.io/ --json | jq .summary
What it detects
| CDN | Status | Notes |
|---|---|---|
| polyfill.io | Malicious | Acquired by Funnull Feb 2024; malware injected Jun 2024 |
| cdn.polyfill.io | Malicious | Same domain, different subdomain |
| polyfill.cn / polyfill.com | Malicious | Mirror / typosquat |
| bootcss.com | Malicious | Confirmed Funnull operator; malicious since Jun 2023 |
| bootcdn.net | Malicious | Confirmed Funnull operator |
| staticfile.org / staticfile.net | Malicious | Confirmed Funnull; OFAC-sanctioned May 2025 |
| jquecy.com | Malicious | Typosquats jQuery |
| jsdclivr.com | Malicious | Typosquats jsDelivr |
| clondflare.com | Malicious | Typosquats Cloudflare |
| bytedauce.com | Malicious | Typosquats ByteDance |
| bdustatic.com | Malicious | Typosquats BDU Static |
| ailyunoss.com | Malicious | Typosquats Alibaba Cloud OSS |
| cdn1.ai | Suspected | Post-sanction Funnull front, stood up Jun 2025 |
| bolecnd.com | Suspected | Post-sanction Funnull CDN front |
| yunray.ai | Suspected | Post-sanction Funnull CDN front |
| cdn5.com | Suspected | Post-sanction Funnull CDN front |
| ctgcdn.com | Suspected | Post-sanction Funnull CDN front |
| macoms.la / unionadjs.com | C2 infra | Funnull redirect / C2 infrastructure |
Fix
Remove <script> tags referencing any of these CDNs.
For polyfill.io specifically: most use cases are unnecessary in modern browsers. If you do need a polyfill, use Fastly's drop-in mirror or bundle it with your build tool.
Scan data
infected_sites.md — 1,960 GitHub Pages sites confirmed
loading malicious CDN scripts across two June 2026 scans (subdomain BFS crawl up to 30 pages
per site + Sourcegraph-based discovery).
Background
In February 2024, the polyfill.io domain was acquired by Funnull Technology Inc., a Chinese CDN operator. In June 2024, Cloudflare and Sansec discovered that Funnull had modified the served JavaScript to inject malware targeting mobile browsers — redirecting users to gambling and adult sites via fake browser-update popups. Over 100,000 sites were affected globally at peak.
Sansec and Censys later confirmed (via shared Cloudflare account credentials) that BootCSS, BootCDN, and Staticfile are operated by the same entity and had been injecting malicious code since at least June 2023, a year before the polyfill incident became public. The US Treasury sanctioned Funnull / Triad Nexus in May 2025.
References:
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file bootlegg-0.1.0.tar.gz.
File metadata
- Download URL: bootlegg-0.1.0.tar.gz
- Upload date:
- Size: 11.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
88313f0d41769281b5908ce56723f58bd4fe64481d54ef83cea6349d7da08bd5
|
|
| MD5 |
fa46dad45f5ebd1dcc8d02fd2a6f594f
|
|
| BLAKE2b-256 |
9fc85fc4936b0dface6fdf1a64d4371d09cedcbcd47e24be441d74e804df509b
|
File details
Details for the file bootlegg-0.1.0-py3-none-any.whl.
File metadata
- Download URL: bootlegg-0.1.0-py3-none-any.whl
- Upload date:
- Size: 10.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c7f0ef4fdf717f05322f1fc2ecd8a16d0ac91ee5831960468226a799d9d442ec
|
|
| MD5 |
e224e215620ef6491d46a88ee85aa138
|
|
| BLAKE2b-256 |
55cc1de37bc2ebe2df2bcb078c845d0efc2f9774975c4590c92e8d0357d76d82
|