Back to Intelligence

Brevo Supply Chain Compromise: WordPress Backdoor + ClickFix Dual-Payload Campaign — OTX Detection Pack

SA
Security Arsenal Team
September 18, 2026
10 min read

Threat Level: CRITICAL | Campaign Window: Active since 2026-09-14 | TLP: WHITE

Threat Summary

On September 14, 2026, threat actors compromised Brevo's (formerly Sendinblue) infrastructure and injected malicious code into the company's legitimate JavaScript assets and widgets. Because Brevo's marketing and transactional-email widgets are embedded directly into customer websites, this single upstream compromise cascaded into one of the largest observed supply-chain infections of 2026 — over 100,000 customer websites began serving attacker-controlled code to their visitors and administrators without any action required by the site owners themselves.

The campaign is notable for its dual-payload architecture:

  1. WordPress Plugin Backdoor — When a logged-in site administrator visited their own compromised site, the poisoned JavaScript silently leveraged the admin's authenticated session to install a malicious WordPress plugin. This converts a passive browser visit into a persistent server-side foothold — a technique that bypasses traditional perimeter controls because the "installation" originates from a legitimate, authenticated admin session.
  2. ClickFix Overlays — Regular site visitors were presented with fake browser-verification or CAPTCHA-style overlays instructing them to execute "fix" commands (typically copied PowerShell or Run-dialog commands). ClickFix-style social engineering has become the dominant initial-access vector of 2025–2026 because it weaponizes the victim's own hands to execute malware, sidestepping email gateways and download scanning entirely.

The attackers' infrastructure (cdn10.sendibt1.com, a typosquat/lookalike of Brevo's legitimate sendibt CDN naming) hosted a secondary payload archive (wm.zip), indicating staged payload delivery. The ecomscan.com domain and the five SHA256 file hashes correspond to the malicious plugin components and ClickFix loader artifacts.

Objective: Based on the payload pair, this is a monetization-focused criminal operation: the WordPress backdoor enables persistent SEO poisoning, malvertising injection, and resale of site access to other actors (initial access brokerage), while the ClickFix overlays harvest credentials and deliver follow-on stealers from the visitor side.

Threat Actor / Malware Profile

Attribution: Unknown criminal cluster (no APT attribution at time of publication). The tradecraft — CDN poisoning, session-riding plugin installation, and ClickFix social engineering — aligns with financially motivated e-crime groups that specialize in CMS mass-compromise.

Payload 1: WordPress Backdoor (delivered as wm.zip)

  • Distribution: Injected via poisoned Brevo JS widget; installs only when a WordPress admin session cookie is present in the visitor's browser (session-riding via authenticated REST/AJAX calls against the site's own wp-admin endpoints).
  • Behavior: Drops a malicious plugin containing obfuscated PHP webshells; creates rogue admin accounts; modifies wp-config.php or theme files for redundancy.
  • Persistence: Plugin directory under wp-content/plugins/, rogue admin users, and injected code in theme functions.php.
  • Anti-analysis: The installer only fires for authenticated admin browsers, meaning security crawlers, sandboxes, and unauthenticated scanners see clean content (conditional cloaking).

Payload 2: ClickFix Overlay Loader

  • Distribution: Rendered in-page for regular visitors as a fake "Verify you are human" / "Browser update required" overlay.
  • Behavior: Uses clipboard hijacking (navigator.clipboard.writeText) to silently copy a malicious PowerShell one-liner, then instructs the victim to paste it into Win+R or a terminal — resulting in self-executed malware delivery (typically a stealer or RAT second stage).
  • C2: Staging via cdn10.sendibt1.com; tracking/telemetry via ecomscan.com.
  • Anti-analysis: Overlay logic is conditionally served by geolocation and user-agent filtering; the clipboard payload is base64-encoded and time-boxed.

MITRE ATT&CK Mapping:

  • T1195.002 — Supply Chain Compromise: Software Supply Chain
  • T1189 — Drive-by Compromise
  • T1204.004 — User Execution: Malicious Copy and Paste (ClickFix)
  • T1505.003 — Web Shell (WordPress plugin backdoor)
  • T1136.001 — Create Account: Local Account (rogue WP admins)
  • T1027 — Obfuscated Files or Information
  • T1071.001 — Application Layer Protocol: Web (C2)

IOC Analysis

The pulse contains 17 indicators across four types. Operationalization guidance:

TypeIndicatorsAction
Hostname/Domaincdn10.sendibt1.com, ecomscan.comBlock at DNS sinkhole, proxy, and EDR network layer. Note: sendibt1.com is a lookalike of legitimate Brevo sendibt.com infrastructure — block the full apex domain sendibt1.com, not just the subdomain.
URLhttps://cdn10.sendibt1.com/p/wm.zipBlock full URL and the /p/ path pattern; alert on any .zip retrieval from CDN hostnames not on an allowlist.
FileHash-SHA256 (x5)26166cd8…ddca, 4af488d7…2df7, 58a5c601…2308, 9b62c12b…87a5, f67d572d…6782Push to EDR block lists and cloud storage scanning. These correspond to the wm.zip archive and the malicious PHP plugin files — hunt web servers for these hashes in wp-content/ trees.

Tooling: Hash lookups via VirusTotal / OTX DirectConnect API; domain detonation via urlscan.io and ANY.RUN; WordPress integrity checking via WP-CLI wp plugin verify-checksums and wp core verify-checksums. For CMS-side forensics, diff wp-content/plugins/ against a known-good baseline and audit wp_users for accounts created after 2026-09-14.

Detection Engineering

YAML
---
title: Brevo Supply Chain - Malicious CDN Payload Retrieval
id: 9a1f2b3c-brev-2026-0001
status: experimental
description: Detects network retrieval of the wm.zip payload or communication with known Brevo supply-chain compromise infrastructure (sendibt1.com lookalike CDN, ecomscan.com).
author: Security Arsenal Threat Intel
date: 2026/09/19
references:
    - http://sansec.io/research/brevo-supply-chain-attack
logsource:
    category: proxy
product: any
detection:
    selection_domain:
        c-dns-domain|contains:
            - 'sendibt1.com'
            - 'ecomscan.com'
    selection_url:
        c-uri|contains:
            - '/p/wm.zip'
    condition: 1 of selection_*
falsepositives:
    - None expected; sendibt1.com is a lookalike of legitimate sendibt.com infrastructure
level: critical
tags:
    - attack.t1195.002
    - attack.t1071.001
---
title: ClickFix Social Engineering - Clipboard-to-Run PowerShell Execution
id: 9a1f2b3c-brev-2026-0002
status: experimental
description: Detects the execution pattern typical of ClickFix overlays - encoded or download-cradle PowerShell launched shortly after browser activity, consistent with a user pasting a malicious command from a fake verification overlay.
author: Security Arsenal Threat Intel
date: 2026/09/19
references:
    - http://sansec.io/research/brevo-supply-chain-attack
logsource:
    category: process_creation
    product: windows
detection:
    selection_parent:
        ParentImage|endswith:
            - '\explorer.exe'
            - '\RunDLL32.exe'
    selection_img:
        Image|endswith:
            - '\powershell.exe'
            - '\pwsh.exe'
            - '\mshta.exe'
            - '\cmd.exe'
    selection_cli:
        CommandLine|contains:
            - ' -enc'
            - ' -e '
            - 'FromBase64String'
            - 'IEX'
            - 'Invoke-Expression'
            - 'DownloadString'
            - 'hidden'
            - 'bypass'
    condition: selection_img and selection_cli and selection_parent
falsepositives:
    - IT automation scripts; correlate with browser history for ClickFix overlay domains
level: high
tags:
    - attack.t1204.004
    - attack.t1059.001
---
title: WordPress Supply Chain Backdoor - Rogue Plugin or Admin Creation
id: 9a1f2b3c-brev-2026-0003
status: experimental
description: Detects suspicious PHP file creation in WordPress plugin directories or new plugin installation events consistent with the Brevo session-riding backdoor installer.
author: Security Arsenal Threat Intel
date: 2026/09/19
references:
    - http://sansec.io/research/brevo-supply-chain-attack
logsource:
    category: file_event
    product: linux
    service: auditd
    product: windows
    service: sysmon
detection:
    selection_path:
        TargetFilename|contains:
            - 'wp-content/plugins/'
            - 'wp-content/mu-plugins/'
            - 'wp-content/themes/'
    selection_ext:
        TargetFilename|endswith:
            - '.php'
            - '.phtml'
            - '.php5'
    filter_legit_updates:
        Image|contains:
            - 'wp-cli'
            - 'composer'
    condition: selection_path and selection_ext and not filter_legit_updates
falsepositives:
    - Legitimate plugin/theme updates - correlate with maintenance windows and admin activity logs
level: high
tags:
    - attack.t1505.003
    - attack.t1136.001
KQL — Microsoft Sentinel / Defender
// Brevo Supply Chain Campaign - Network & Execution Hunt (Microsoft Sentinel)
// Hunt for C2/staging communication, payload hashes, and ClickFix-style execution
let BrevoIOCs = dynamic(["sendibt1.com", "cdn10.sendibt1.com", "ecomscan.com"]);
let BrevoHashes = dynamic([
    "26166cd87ff07e7a50317a24126d14b262e842c5715585636dee3ab3f227ddca",
    "4af488d79aef7daa12b1c18f0cce28b7edadccb8b6b0fb8d50d1d53a9a7c2df7",
    "58a5c601c9df7ca2120435588fc39f97712d9b878795f6ee500590099a432308",
    "9b62c12bc5c7feb9802f58e6cf75a368690df3c754e37cc64483a92acacf87a5",
    "f67d572d2d30407b3f470904326411450763108980cdad89550fbb221fb06782"
]);
let Lookback = 14d;
let NetworkHits = DeviceNetworkEvents
    | where TimeGenerated > ago(Lookback)
    | where RemoteUrl has_any (BrevoIOCs) or RemoteUrl endswith "wm.zip";
let HashHits = DeviceFileEvents
    | where TimeGenerated > ago(Lookback)
    | where SHA256 in~ (BrevoHashes)
    | project TimeGenerated, DeviceName, FileName, FolderPath, SHA256, InitiatingProcessFileName;
let ClickFixExec = DeviceProcessEvents
    | where TimeGenerated > ago(Lookback)
    | where FileName in~ ("powershell.exe", "pwsh.exe", "mshta.exe", "cmd.exe")
    | where ProcessCommandLine has_any ("FromBase64String", "IEX", "Invoke-Expression", "DownloadString", " -enc ", "bypass")
    | where InitiatingProcessFileName =~ "explorer.exe"
    | project TimeGenerated, DeviceName, FileName, ProcessCommandLine, AccountName;
NetworkHits
| project TimeGenerated, DeviceName, InitiatingProcessFileName, RemoteUrl, RemoteIP, ActionType
| union (HashHits | extend RemoteUrl="", RemoteIP="", ActionType="HashMatch")
| union (ClickFixExec | extend RemoteUrl="", RemoteIP="", ActionType="ClickFixExecution", InitiatingProcessFileName=FileName)
| sort by TimeGenerated desc
PowerShell
# Brevo Supply Chain IOC Hunt - Windows Endpoints & Web Servers
# Checks for malicious hashes, ClickFix artifacts, DNS cache hits, and WP backdoor indicators
# Run elevated. Output: CSV to $env:TEMP\brevo_hunt_results.csv

$results = @()

$malHashes = @(
    "26166cd87ff07e7a50317a24126d14b262e842c5715585636dee3ab3f227ddca",
    "4af488d79aef7daa12b1c18f0cce28b7edadccb8b6b0fb8d50d1d53a9a7c2df7",
    "58a5c601c9df7ca2120435588fc39f97712d9b878795f6ee500590099a432308",
    "9b62c12bc5c7feb9802f58e6cf75a368690df3c754e37cc64483a92acacf87a5",
    "f67d572d2d30407b3f470904326411450763108980cdad89550fbb221fb06782"
)

# 1. DNS cache check for malicious domains
Write-Host "[*] Checking DNS cache for campaign domains..."
$dns = Get-DnsClientCache -ErrorAction SilentlyContinue | Where-Object {
    $_.Entry -match "sendibt1\.com|ecomscan\.com"
}
foreach ($d in $dns) {
    $results += [pscustomobject]@{Type="DNSCache"; Indicator=$d.Entry; Detail="Resolves to $($d.Data)"; Host=$env:COMPUTERNAME}
}

# 2. Active/historical network connections
Write-Host "[*] Checking network connections..."
Get-NetTCPConnection -ErrorAction SilentlyContinue | ForEach-Object {
    try {
        $r = Resolve-DnsName $_.RemoteAddress -ErrorAction Stop -QuickTimeout
        if ($r.NameHost -match "sendibt1\.com|ecomscan\.com") {
            $results += [pscustomobject]@{Type="NetConnection"; Indicator=$r.NameHost; Detail="State: $($_.State) PID: $($_.OwningProcess)"; Host=$env:COMPUTERNAME}
        }
    } catch {}
}

# 3. WordPress plugin hash sweep (adjust root paths for your web hosts)
Write-Host "[*] Sweeping WordPress directories for malicious hashes..."
$wpRoots = @("C:\inetpub\wwwroot", "C:\xampp\htdocs", "/var/www/html")
foreach ($root in $wpRoots) {
    if (Test-Path $root) {
        Get-ChildItem -Path $root -Recurse -Include *.php,*.zip -ErrorAction SilentlyContinue | ForEach-Object {
            $h = (Get-FileHash $_.FullName -Algorithm SHA256 -ErrorAction SilentlyContinue).Hash
            if ($malHashes -contains $h) {
                $results += [pscustomobject]@{Type="MaliciousFile"; Indicator=$h; Detail=$_.FullName; Host=$env:COMPUTERNAME}
            }
        }
    }
}

# 4. ClickFix artifact check - Run dialog history (MRU) for suspicious commands
Write-Host "[*] Checking RunMRU for ClickFix-style pasted commands..."
$runMru = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU"
if (Test-Path $runMru) {
    (Get-ItemProperty $runMru).PSObject.Properties | Where-Object {
        $_.Value -match "powershell|mshta|certutil|curl|bitsadmin|IEX"
    } | ForEach-Object {
        $results += [pscustomobject]@{Type="RunMRU"; Indicator=$_.Name; Detail=$_.Value; Host=$env:COMPUTERNAME}
    }
}

# 5. Scheduled tasks created since campaign start (2026-09-14)
Write-Host "[*] Checking scheduled tasks created after 2026-09-14..."
Get-ScheduledTask -ErrorAction SilentlyContinue | Where-Object {
    $_.Date -gt (Get-Date "2026-09-14") -and $_.TaskPath -notlike "\Microsoft*"
} | ForEach-Object {
    $results += [pscustomobject]@{Type="ScheduledTask"; Indicator=$_.TaskName; Detail="Created: $($_.Date)"; Host=$env:COMPUTERNAME}
}

# Output
if ($results.Count -gt 0) {
    $results | Format-Table -AutoSize
    $results | Export-Csv "$env:TEMP\brevo_hunt_results.csv" -NoTypeInformation
    Write-Host "[!] $($results.Count) potential hits. Results saved to $env:TEMP\brevo_hunt_results.csv" -ForegroundColor Red
} else {
    Write-Host "[+] No indicators found on this host." -ForegroundColor Green
}

Response Priorities

Immediate (0–4 hours)

  • Block sendibt1.com (full apex), cdn10.sendibt1.com, and ecomscan.com at DNS, proxy, and EDR network controls. Block the URL pattern */p/wm.zip.
  • Push the five SHA256 hashes to EDR prevention lists and web server AV scanning profiles.
  • Inventory exposure: Identify all web properties embedding Brevo widgets (search source code and tag managers for Brevo/Sendinblue script includes). Any property with Brevo JS loaded since 2026-09-14 is potentially compromised.
  • Run the KQL hunt and PowerShell script across endpoints and web servers; check RunMRU artifacts for ClickFix victimization on user workstations.

Within 24 Hours

  • WordPress integrity audit on all affected properties: enumerate plugins installed after 2026-09-14 (wp plugin list --format=csv), diff against known-good baselines, audit wp_users for rogue admin accounts, and inspect functions.php for injected code.
  • Credential resets: Because the backdoor installed during authenticated admin sessions, force password resets and revoke sessions/API keys for all WordPress administrators of exposed properties. Assume admin session tokens were compromised.
  • Visitor-side impact: ClickFix overlays deliver credential-stealing malware to site visitors — if your organization operated an affected site, assess notification obligations and check whether any employees executed overlay "fix" commands (browser history + RunMRU correlation).
  • Rotate secrets in wp-config.php (database creds, auth keys/salts) on any host where the malicious plugin hashes are found.

Within 1 Week

  • Third-party script governance: Deploy Subresource Integrity (SRI) or CSP script-src restrictions for all externally hosted JavaScript widgets; this supply-chain vector only works because third-party JS executes with full page privileges.
  • CSP hardening: Implement Content-Security-Policy blocking inline script injection and restricting clipboard-write permissions (Permissions-Policy: clipboard-write=() where feasible) to blunt ClickFix clipboard hijacking.
  • CMS segmentation: Isolate WordPress hosts from internal networks; enforce least-privilege database accounts and disable plugin installation via DISALLOW_FILE_MODS where update workflows permit.
  • User awareness push: Brief staff specifically on ClickFix — no legitimate website will ever ask you to paste commands into Run/PowerShell/Terminal.
  • Tabletop exercise: Run a supply-chain scenario ("trusted vendor serves malicious JS") against your IR plan; most runbooks assume direct compromise, not vendor-mediated injection.

Related Resources

Security Arsenal Incident Response Managed SOC & MDR Services AlertMonitor Threat Detection From The Dark Side Intel Hub

Is your security operations ready?

Get a free SOC assessment or see how AlertMonitor cuts through alert noise with automated triage.