Every third-party script tag is a standing grant to run code on your visitors.
A marketing form, a chat widget, an analytics snippet. Each one is permission for someone else's server to execute whatever it sends, on every page it sits on, forever.
- Incident date
- 14 September 2026
- Impact window
- 15:01 to 20:30 UTC, per Brevo
- Customer-embedded files
- Live from 16:07 UTC, per Brevo
- Stated mechanism
- A Cloudflare Worker deployed on Brevo's account
- Stated root cause
- A long-lived full-permission Cloudflare API key in application source code
- Lure
- A fake human verification page instructing visitors to paste a command
What Brevo says happened
Brevo published a post-mortem on a 14 September incident. In Brevo's words, an attacker used a compromised Brevo Cloudflare API key to deploy a Cloudflare Worker on its account. Brevo says the Worker injected a malicious script into pages of brevo.com and sibforms.com, and into three JavaScript files that customers embed on their own websites.
The script showed selected visitors a full-screen Cloudflare-branded page, sometimes appearing right after a genuine Cloudflare checkbox, asking them to press Win+R, then Ctrl+V, then Enter. That is a technique known as ClickFix: rather than exploiting the browser, it persuades the person to run the command themselves. Brevo says the pasted command downloaded malware onto the visitor's Windows computer, and that on WordPress sites it attempted to silently install and activate a plugin.
Brevo gives the impact window as 15:01 to 20:30 UTC, with the lure live on the listed customer URLs from 16:07. It states that its application at app.brevo.com was not affected, and that no Brevo systems were modified at their source, the content being altered in transit at its CDN edge. The stated root cause is a long-lived Cloudflare API key with full account permissions stored in application source code.
What Brevo asks affected sites to do
Brevo's own guidance is specific, and worth following if its scripts are on your pages.
- If you or a visitor ran the pasted command, treat that computer as compromised: disconnect it, run a full antivirus scan, and change passwords
- If your WordPress site loads Brevo scripts and an administrator visited it while logged in on 14 September, check for any plugin installed or activated that day
- If you logged in to Brevo via brevo.com on 14 September, change your password and review your API keys
The part that is not about Brevo
Two lessons here generalise, and neither depends on which vendor it happened to.
The first is the root cause. A long-lived API key with full account permissions, stored in source code, is a configuration most teams have somewhere. CDN tokens, DNS tokens, registrar API keys, object storage keys. They are created once during setup, given broad permissions because scoping them is fiddly, committed to make a deploy script work, and then never touched again. The right response is not to feel superior about it but to go looking for your own.
The second is the embed. When you put a third-party script tag on your page, you are granting that vendor's infrastructure permission to execute arbitrary code in your users' browsers, on every page that carries the tag, for as long as it is there. The content of that script can change at any time without any action from you, which is exactly why the tag is convenient. Your security posture on those pages is the union of yours and theirs.
Auditing your own embeds
Most teams have more third-party scripts than they remember adding, because they accumulate one marketing request at a time. Start by counting them, then decide what each one is worth.
- List every third-party script on your site, including tags injected by a tag manager, which is itself a script that can add more
- For each one, ask what it would mean if that vendor served different code tomorrow. If the answer is serious, that page should not carry it
- Keep third-party scripts off pages that handle authentication, payment or account settings, where the consequence of injected code is highest
- Use Subresource Integrity where the vendor serves a versioned, immutable file. Note that it does not help for loader scripts designed to change, which is most analytics and chat widgets
- Set a Content Security Policy that lists allowed script origins, so a script injected from an unexpected origin is blocked even if a tag is tampered with
- Prefer a server-side integration over a browser embed where the vendor offers one
And your own keys
The root cause deserves an hour of your week regardless of which vendors you use. Find the long-lived, broadly-scoped credentials in your own systems and narrow them.
- Search repositories and their history for CDN, DNS, registrar and object storage API keys
- Replace full-account tokens with tokens scoped to a single zone, bucket or permission
- Move anything remaining into a secret manager rather than source code, and rotate it as you move it
- Turn on alerting for configuration changes at your CDN and DNS provider, since that is where an injection like this becomes visible first
What to do
- 1Follow Brevo's guidance if its scripts are on your pages, including the WordPress plugin check for 14 September.
- 2Inventory every third-party script on your site and remove the ones nobody can justify.
- 3Keep third-party embeds off authentication, payment and account settings pages.
- 4Set a Content Security Policy listing allowed script origins.
- 5Find and rescope long-lived full-permission CDN and DNS API keys in your own repositories.
Common questions
What is ClickFix?
A social engineering technique where a page shows a fake verification or error prompt and instructs the visitor to copy a command and run it themselves, typically via the Windows Run dialog. It sidesteps browser security because the person executes the command, not the page.
What does Brevo say was affected?
Brevo says the Worker injected a script into pages of brevo.com and sibforms.com and into three JavaScript files that customers embed on their own sites. It states that its application at app.brevo.com was not affected, and that no Brevo systems were modified at their source.
Does Subresource Integrity solve this?
Only partly. SRI verifies a file against a hash you pin, which works for versioned immutable assets. It does not work for loader scripts that are designed to change, which is how most analytics and chat widgets are delivered.
What is the safest place to start?
Remove third-party scripts from pages that handle authentication, payment or account settings. That is where injected code does the most damage, and it is usually the easiest change to justify internally.
Why does a full-permission API key matter so much?
Because the blast radius is the whole account rather than one resource. In Brevo's stated root cause, a full-permission Cloudflare key stored in source code was enough to deploy a Worker that altered content in transit for every site loading the affected files.
Sources
Read against the primary documentation rather than secondary coverage. Where a figure comes from a provider's own docs, it is quoted as published on 2026-09-25.
Related
More from Signals
Open the tool.
Ten production categories, three minutes, and a ranked list of what to fix first.
Check your own stack