Attackers rewrote Brevo's embedded scripts at Cloudflare's edge with a hardcoded full-permission key
Brevo says a long-lived Cloudflare key with full account permissions sat in its application source code, and the Worker built with it stripped Content-Security-Policy headers from scripts that Sansec estimates reach 100,000 sites.
The Watch · Security desk

What happened
- Brevo confirmed that attackers stole a Cloudflare API key and used it to create a malicious Cloudflare Worker that modified content at the CDN edge for about five and a half hours on September 14.
- The Worker altered pages on brevo.com, sendinblue.com and sibforms.com plus the Brevo forms script, the Conversations widget and the SDK loader scripts that customers embed on their own sites.
- Sansec, which reported the incident first, said up to 100,000 websites use the affected Brevo components, and confirmed the malicious subdomains stopped resolving on September 15.
- Visitors to affected pages were shown a fake Cloudflare verification page followed by ClickFix instructions urging them to run a command on Windows.
Why it matters
- What's now possible capability File integrity monitoring on a vendor's origin tells you nothing about what its CDN serves, and a Content-Security-Policy header is no help when the code rewriting the response can delete the header.
- Who's exposed exposure Any WordPress administrator who browsed an affected site while logged in on September 14 may be running a plugin that hides from the plugin list and mints administrator sessions without the password.
- What doesn't add up contradiction Brevo's rounded duration is longer than the timestamps in its own advisory and longer than Sansec's observed window, so log review should be scoped to the timestamps rather than the summary figure.
- Who has to decide decision With no public link between the SSO account hijacking and the Cloudflare key, customers weighing whether to keep Brevo script tags in their pages are deciding without knowing if one intruder had access or two.
Next story · Invest · yesterday
Bitquery counts $102 million drained from 324 Ledger-linked wallets across six chainsConfirmed6 publishers
A Cloudflare API key with full account permissions can create Workers, routes and DNS records across every zone on the account. Brevo says the key in its application source code was long-lived and did all three for the attackers without triggering an alert [4]. The Worker they built sat in front of the origin and edited what came out of it. "Because the Worker rewrote responses at the edge and removed security headers such as Content-Security-Policy, our origin servers and files remained unmodified and standard integrity checks did not detect the change," Brevo said in its post-mortem [7]. Anyone hashing files on Brevo's servers that afternoon would have found them correct.
The duration is unsettled. Brevo calls it approximately five and a half hours of edge modification [1] and elsewhere defines the exposure window as 16:07 to 20:30 UTC, a span of 4 hours 23 minutes [23][26]. Sansec dates the activity from 16:05 to 20:13 UTC, 4 hours 8 minutes [25][27]. Both observed windows run about an hour shorter than the figure in Brevo's own summary [28]. Brevo also says the key may have been exposed as early as late August, with no evidence of malicious use before September 14 [8].
On WordPress sites embedding an affected widget, the injected script checked whether the visitor was logged in as an administrator, then tried to upload wm.zip from cdn10.sendibt1[.]com [11]. BleepingComputer pulled a copy from VirusTotal and describes a plugin named "Web Media Optimizer" that works as a persistent backdoor and JavaScript loader [12]. It hides itself from the plugin list, copies itself into the must-use plugins directory, and polls glegchner.com/ads.php [13]. That server returns a Base64 string, currently decoding to corralos[.]beer/a412dkoq.js [14], and the plugin caches the last working URL so it keeps loading code if the server stops answering [15]. A hardcoded authentication key inside it generates a valid administrator session without the password [16]. BleepingComputer also saw the plugin and scripts served from yelahaye[.]surf and boiseno[.]club [20].
Brevo revoked the key, removed the credential from source, deleted attacker hostnames and purged its edge caches [9]. None of that touches an installed copy of the plugin, which persists locally and calls its own server [22].
Brevo says app.brevo.com, its API, email delivery infrastructure and customer account data were not affected [19]. If you do not embed the forms script, the Conversations widget or the SDK loader, and no administrator browsed an affected site on September 14, this one is closed for you [2][3][6].
This is Brevo's second disclosure in five days. On September 10 the company reported an SSO-related incident in which attackers hijacked customer accounts and ran phishing against those customers' users [5]. Trezor said on September 11 that the phishing reached 347,000 email addresses and compromised at least 2,500, about 0.7% [17][21]. Brevo did not answer BleepingComputer's questions about whether the two incidents are connected [18].
What to watch
- Fresh distribution hosts for the fake plugin once yelahaye[.]surf and boiseno[.]club stop resolving.
- Any named actor or shared infrastructure tying the September 10 SSO account hijacking to the Worker campaign.
- Reports of unauthorised administrator logins on WordPress sites where the plugin's hardcoded key was used.
Clarity's read
What the record supports and how the coverage leans. The claims behind it follow.
Reality
- Evidence78
- Adoption60
- Hype gap+20
- Incentives58
- Confidence72
Perspective Coverage
3 publishers- Builder
- Builder 34%
- Operator
- Operator 48%
- Investor
- Investor 18%
Claim ledger
Ranked by verification strength, evidence, and original report placement.
- [1]
Brevo confirmed that attackers stole a Cloudflare API key and used it to create a malicious Cloudflare Worker that modified content at the CDN edge for approximately five and a half hours on September 14, injecting malicious ClickFix scripts into its websites and JavaScript files embedded on customer sites.
- [2]
The attack affected pages on brevo.com, sendinblue.com, login/account/my/onboarding.brevo.com and sibforms.com.
- [3]
The Cloudflare Worker also modified the Brevo forms script, the Brevo Conversations widget and the Brevo SDK loader scripts that customers embed on their websites.
- [4]
In a post-mortem, Brevo said attackers obtained a long-lived Cloudflare API key with full account permissions that had been hardcoded in application source code, which allowed them to create Cloudflare Workers, routes and DNS records across Brevo's zones without triggering an alert.
- [5]
On September 10 Brevo disclosed a different SSO-related incident where attackers hijacked customer accounts and launched phishing attacks targeting customers of companies using Brevo.
- [6]
WordPress administrators who visited an affected site while logged in on September 14 should check for unusual plugins installed or activated that day.
- [7]
"Because the Worker rewrote responses at the edge and removed security headers such as Content-Security-Policy, our origin servers and files remained unmodified and standard integrity checks did not detect the change," Brevo said.
- [8]
Brevo says the key may have been compromised as early as late August, but there is no evidence of prior malicious activity.
- [9]
In the hours after detection Brevo revoked the compromised key and credentials created with it, removed the hardcoded credential from its source code, deleted attacker-controlled hostnames and purged its edge caches.
- [10]
Visitors to affected websites were shown a fake Cloudflare verification page followed by ClickFix instructions urging them to run a command on Windows.
- [11]
On WordPress websites embedding an affected Brevo widget, the script checked whether the visitor was logged in as an administrator and attempted to upload a malicious plugin from https://cdn10.sendibt1[.]com/p/wm.zip.
- [12]
Sansec was not able to retrieve the archive; BleepingComputer found it uploaded to VirusTotal and confirms it pretends to be a WordPress plugin named "Web Media Optimizer" but acts as a persistent backdoor and JavaScript loader.
- [13]
Once installed, the plugin hides itself from the WordPress plugin list, copies itself into the must-use plugins directory for persistence, and periodically contacts the attacker-controlled https://glegchner.com/ads.php server.
- [14]
That URL is currently returning a Base64-encoded URL that decodes to https://corralos[.]beer/a412dkoq.js, which the site injects to fetch a ClickFix lure.
- [15]
The plugin stores a backup copy of the last valid JavaScript URL so it can continue loading malicious code if the remote server becomes unavailable.
- [16]
The plugin contains a hardcoded authentication key that allows attackers to generate a valid login session for a WordPress administrator account without knowing the account password.
- [17]
Cryptocurrency wallet vendor Trezor reported on September 11 that phishing attacks reached 347,000 user email addresses and successfully compromised at least 2,500.
- [18]
Brevo did not respond to BleepingComputer's questions as to whether the SSO incident and the Cloudflare compromise were connected.
- [19]
Brevo says app.brevo.com, its API, email delivery infrastructure and customer account data were not affected.
- [20]
Other domains BleepingComputer saw distributing the malicious WordPress plugin and scripts include https://yelahaye[.]surf and https://boiseno[.]club.
- [21]
The at-least-2,500 compromised Trezor users are about 0.7% of the 347,000 addresses the phishing reached.
- [22]
Brevo's remediation of its own key, source code, hostnames and edge caches does not remove an installed copy of the plugin, which persists in the must-use plugins directory and contacts its own command server.
- [23]
On detecting the compromise Brevo removed the Worker and its routes, defining the exposure window as between 16:07 and 20:30 UTC.
- [24]
The incident was first reported by security firm Sansec, which said it may have impacted up to 100,000 websites that use the affected Brevo components, and confirmed that all malicious subdomains stopped resolving on September 15 and that Brevo files are now clean.
- [25]
Sansec says the incident began on September 14, 2026, between 16:05 and 20:13 UTC.
- [26]
Brevo's stated exposure window of 16:07 to 20:30 UTC is 4 hours 23 minutes.
- [27]
Sansec's observed window of 16:05 to 20:13 UTC is 4 hours 8 minutes.
- [28]
Brevo's approximate figure of five and a half hours exceeds the window defined by its own timestamps by about 1 hour 7 minutes.
Sources
3 independent publishers whose own reporting we read for this story.
- bleepingcomputer.comBrevo supply-chain attack injected ClickFix scripts on customer sites
1 article · September 17, 2026
- securityaffairs.comBrevo Supply-Chain Attack Infected Over 100,000 Websites
1 article · September 18, 2026
- securityweek.comBrevo Supply Chain Attack Injects Malware Into 100,000 Websites
1 article · September 18, 2026
Topics and entities
Topics
- Secrets Management
- Web content integrity monitoring
- WordPress Security
- CDN and edge security
- Software supply chain attacks
Entities
- Web Media Optimizer (malicious plugin)
- ClickFix
- Sansec
- SAML
- Cloudflare
- WordPress
- Brevo
- Cloudflare Workers
- Trezor
- Content Security Policy