Один украденный API-ключ Cloudflare превратил инфраструктуру маркетинговой платформы Brevo в раздатчик вредоносного кода для порядка 100 тысяч сторонних сайтов.
Атакующие получили долгоживущий Cloudflare API-ключ с полными правами, который Brevo хранила прямо в исходном коде приложения. Доступ позволял создавать Cloudflare Workers, менять маршруты и DNS-записи во всех зонах компании. 14 сентября злоумышленник развернул собственный Worker, а затем подключил его к сайтам и клиентским компонентам Brevo.
Главная особенность атаки скрывалась на уровне CDN. Worker переписывал ответы уже после выхода с серверов Brevo и удалял защитные заголовки Content-Security-Policy. Исходные страницы и JavaScript-файлы оставались неизменными, поэтому стандартные проверки целостности не видели подмену. Посетителям выборочно показывали поддельную проверку Cloudflare с техникой ClickFix.
Фальшивая страница просила нажать Win+R, вставить содержимое буфера обмена и выполнить команду. После Enter компьютер загружал вредоносное ПО. На сайтах WordPress сценарий становился опаснее: если страницу открывал авторизованный администратор, скрипт пытался незаметно установить вредоносный плагин.
Плагин маскировался под Web Media Optimizer, исчезал из обычного списка расширений и копировал себя в каталог обязательных плагинов для закрепления. Модуль периодически получал новый JavaScript с управляющего сервера, а встроенный ключ позволял сформировать действующую администраторскую сессию без знания пароля. Похожая атака на WordPress в июне распространилась через доверенную инфраструктуру сразу на 1,2 млн ресурсов.
По оценке Sansec, заражённые компоненты Brevo могли загружаться примерно на 100 тысячах сайтов. Клиентские JavaScript-файлы подменялись с 16:07 до 20:30 UTC 14 сентября, хотя сам вредоносный Worker работал около пяти с половиной часов.
Приложение Brevo, API, почтовая инфраструктура и хранящиеся в сервисе данные клиентов, по результатам расследования компании, не пострадали. За несколько дней до атаки Brevo уже столкнулась с отдельным инцидентом, после которого фишинговые письма через инфраструктуру Trezor получили 347 тысяч адресатов.
Хотя SanSec не удалось получить архив, его обнаружили загруженным на VirusTotal и подтвердили, что архив выдает себя за плагин WordPress под названием "Web Media Optimizer", но на самом деле является постоянным бэкдором и загрузчиком JavaScript.
Среди других доменов, распространяющих вредоносный плагин и скрипты для WordPress, значатся https://yelahaye[.]surf и https://boiseno[.]club.
После обнаружения вторжения Brevo удалила Worker и созданные атакующим домены, отозвала ключ и связанные учётные данные, очистила кэши CDN и убрала секрет из исходного кода. Компания собирается хранить ключи Cloudflare в HashiCorp Vault, автоматически менять их и отслеживать операции с Workers, DNS и правами доступа. Официальный разбор инцидента рекомендует администраторам WordPress, которые были авторизованы на своих сайтах 14 сентября, проверить установленные в тот день плагины и сменить пароли.
Дополнительный анализ плагина показал, что вредонос сохранял резервный адрес JavaScript на случай отключения управляющего сервера. Пользователям, выполнившим команду из фальшивой проверки Cloudflare, рекомендуют считать компьютер скомпрометированным, отключить его от сети, провести полную проверку и сменить использовавшиеся на машине пароли.
Механика уже встречалась в других атаках на цепочку поставок. В июне злоумышленники заразили виджет сервиса отзывов Okendo Reviews, после чего ClickFix-код мог появляться на сайтах более 18 тысяч брендов.
Поддельные проверки Cloudflare тоже давно превратились в самостоятельную приманку. В июле специалисты разобрали случай, когда такая фальшивая CAPTCHA убедила сотрудника российской промышленной компании самостоятельно запустить команду, установившую инфостилер.
