BdThemes zasiahla supply-chain kompromitácia cez otrávené JSON API
Útočníci kompromitovali ekosystém pluginov BdThemes bez toho, aby zmenili jediný súbor v oficiálnom repozitári WordPress.org. Stačilo im prepísať vzdialený JSON feed s propagačnými bannermi: zraniteľný JavaScript ho na každom načítaní wp-admin vložil do DOM a spustil škodlivý kód v relácii prihláseného administrátora.
Incident zasahuje sedem pluginov dostupných v oficiálnom adresári. Tím WordPress Plugins ich 7. augusta 2026 dočasne uzavrel, kým ich preveruje. Keďže útok nevyžadoval aktualizáciu pluginu ani zápis škodlivého súboru na disk, bežný kontrolný súčet súborov ho nemusel zachytiť.
Čo urob teraz
Ak na webovej stránke beží ktorýkoľvek z dotknutých pluginov, okamžite skontroluj účty administrátorov, adresáre pluginov vrátane mu-plugins a tabuľku možností vo WordPress databáze. Čistý JSON na API endpointoch od 8. augusta 2026 neodstráni stopy z už napadnutého webu.
Ako sa útok dostal do administrácie
Pluginy BdThemes obsahujú interný komponent Biggopti. Ten na hooku admin_init vždy pripojí klientský JavaScript, takže sa spustí pri každom načítaní ľubovoľnej stránky vo wp-admin. Skript načíta propagačné bannery z API dodávateľa a zostaví z nich HTML upozornenie v Document Object Model (DOM), teda stromovej reprezentácii stránky v prehliadači.
API nebežalo na dynamickom aplikačnom serveri. Obsluhovali ho statické JSON súbory v DigitalOcean Spaces, pred ktorými stál Cloudflare. Neoprávnený aktér získal prístup na zápis do tohto storage bucketu alebo do súvisiacej internej infraštruktúry BdThemes a nahradil legitímne odpovede upraveným JSON-om.
Chyba vznikla pri spracovaní poľa display_id. Kód použil vzdialenú hodnotu bez escapovania pri zostavení HTML atribútu id. V tom istom skripte sa atribút data-display-id escapoval, takže problém nebol v samotnom feede, ale v nekonzistentnom spracovaní jeho hodnôt na klientovi.
// Hodnota display_id prichádza zo vzdialeného JSON-u.
var f = t.display_id || t.id || "default";
var m = "bdt-admin-biggopti-api-biggopti-" + f;
A = 'id="' + m + '"'; // bez escapovaniaÚtočník vložil do display_id ukončenie atribútu a handler onanimationstart. CSS animácia ho spustila približne do 10 ms po vykreslení bannera, bez viditeľnej interakcie administrátora. Handler potom načítal ďalší JavaScript z externej infraštruktúry.
História SVN ukazuje, že neescapované vloženie do id pribudlo 1. marca 2026 v plugine Prime Slider vo verzii 4.1.9 (revízia r3471891). Neskôr sa dostalo aj do ďalších pluginov. V neskorších vydaniach pribudol sanitizér postavený na DOMParser, ktorý odstránil nebezpečné HTML značky a inline handlery z poľa obsahu bannera, no atribút id zostal zraniteľný.
Ktoré pluginy útok zasiahol
Zraniteľnosť Biggopti je cross-site scripting (XSS) cez parameter display_id zo Sigmative API. Má CVSS skóre 5,4, teda strednú závažnosť, a v čase incidentu neexistovala oprava. Útočník však musí najprv kompromitovať server API, čo sa v tomto prípade stalo.
- Element Pack Addons for Elementor (
bdthemes-element-pack-lite) - Prime Slider Addons for Elementor (
bdthemes-prime-slider-lite) - Pixel Gallery Addons for Elementor (
pixel-gallery) - Ultimate Post Kit Addons for Elementor (
ultimate-post-kit) - Ultimate Store Kit – Addon For WooCommerce, EDD and Elementor (
ultimate-store-kit) - Live Copy Paste for Elementor (
live-copy-paste) - Smart Admin Assistant (
smart-admin-assistant)
Dve vetvy škodlivého payloadu
Napadnutý feed spúšťal viacfázový útok a volil payload podľa dostupnosti infraštruktúry útočníka. Primárny w2.js dostávali pluginy, ktoré používali endpoint api-data-all-records. Sekundárny x.js bol priamo uložený v infraštruktúre BdThemes a obslúžil pluginy s endpointom api-data-records.
Primárny payload w2.js
Skript najprv kontaktoval C2 endpoint ia-cdn[.]com/fz/c a poslal mu origin napadnutej webovej stránky. Ak C2 vrátilo stav skip alebo done, útok skončil. V opačnom prípade skript použil X-WP-Nonce z aktívnej relácie administrátora, aby cez WordPress REST API vytvoril nový účet administrátora; ak API cesta zlyhala, prešiel na klasické odoslanie formulára.
Potom stiahol ZIP, ktorý sa tváril ako plugin, a nahral ho štandardným formulárom na nahrávanie pluginov. Používal nenápadný slug wp-smart-thumbnails alebo podobné názvy. Falošný plugin obsahoval webshell emer-run.php, ktorý útočník vyvolal priamo cez URL.
Webshell nainštaloval do adresára Must-Use pluginov dva perzistentné moduly. Vzorky mali časové pečiatky upravené na september 2025, aby splývali s legitímnymi súbormi; názvy súborov sa medzi infekciami môžu meniť. Prvý modul umožnil prihlásenie administrátora bez autentifikácie cez parameter ?_wplogin=<token> a cielil na najdlhšie registrovaného administrátora. Druhý modul sa napojil na databázové dotazy WordPressu, skryl vytvorené účty zo zoznamu používateľov v administrácii a primerane znížil aj celkový počet používateľov.
Výsledky jednotlivých fáz payload odosielal na C2 pomocou navigator.sendBeacon. Takýto prenos prehliadač typicky dokáže odoslať aj pri opúšťaní stránky.
Sekundárny payload x.js
Sekundárny skript vytváral predvídateľné prihlasovacie údaje z hostname napadnutej webovej stránky. Prešiel znaky hostname jednoduchým 32-bitovým hashom, absolútnu hodnotu previedol do base36 a použil prvých šesť znakov. Používateľské meno malo tvar bd_ nasledovaný šesťznakovým hashom, heslo tvar Bd@26! + hash + x a e-mail končil na @wordpress.org.
Útočníci preto nemuseli centrálne ukladať zoznam kompromitovaných webov: z domény si vedeli údaje vždy nanovo odvodiť. Skript následne cez formulár /wp-admin/user-new.php vytvoril administrátora, výsledok vrátane používateľského mena, hesla, originu webu, URL stránky a odkazovej časti na odhlásenie odoslal na C2. Ak to prehliadač dovolil, uložil aj príznak dokončenia do localStorage, aby operáciu neopakoval.
Indikátory kompromitácie
Pri incidente hľadaj tieto externé zdroje, súbory, možnosti a vzory účtov. Endpointy Sigmative už 8. augusta 2026 vracali čistý JSON, no pri forenznej kontrole zostávajú relevantné ako dôkaz predchádzajúceho napadnutia.
- Primárny payload:
ia-cdn[.]com/fz/w2.js - C2 beacon endpoint:
ia-cdn[.]com/fz/c - Napadnutý endpoint:
api[.]sigmative[.]io/prod/store/api/biggopti/api-data-all-records - Napadnutý endpoint:
api[.]sigmative[.]io/prod/store/api/biggopti/api-data-records - Sekundárny payload:
api[.]sigmative[.]io/prod/store/api/biggopti/x.js
- Webshell
emer-run.phps MD51024732009983dd5e54b4cf5593f04d4 - MU-plugin magic-login backdoor
class-wp-token-validate.phps MD57719cd98a35ffad2771f26d1ceab7d27 - MU-plugin stealth modul
class-wp-query-9d127ff3.phpalebo podobný názov podľa vzoruclass-wp-query-*.php, s MD59aadc3e5c5242b273bd17c5bdc358845 - MU-plugin „health check“ modul
wp-cache-optimizer.phps MD5e450ae5bc4bfc0d960dded06a76bb8e9 - Databázová možnosť
fz_emer_login_tokens, ktorá ukladá tokeny magic loginu - Databázová možnosť
fz_emer_done_v1, ktorá označuje dokončenú kompromitáciu - Účty s e-mailovou doménou
@wordpress.orgalebo@developer.wordpress.org - Používateľské mená podľa vzoru
bd_+ šesť alfanumerických znakov
Časová os incidentu
- 1. marca 2026: Biggopti API JavaScript pribudol do Prime Slider 4.1.9 v SVN revízii
r3471891. Poledisplay_idsa vložilo do atribútuidbez escapovania a plugin používal endpointapi-data-records. - 10. mája 2026: Endpoint sa zmenil na
api-data-all-records. Pole obsahu bannera začal čistiťDOMParser, no atribútidzostal neescapovaný. - 23. júna 2026: Začal sa dátum kampane v napadnutom API, označenej upozornením „Summer Sale“. Od tohto dňa mohol byť XSS najskôr aktívny.
- 6. augusta 2026, 22:40 UTC: Napadnutý
api-data-recordsmal poslednú zmenu. - 7. augusta 2026, 09:11 UTC: Napadnutý
api-data-all-recordsmal poslednú zmenu. - 7. augusta 2026: Bezpečnostný tím dostal hlásenie a pozoroval útok vo voľnej prírode. V ten istý deň WordPress uzavrel pluginy v adresári, kým ich preveruje.
- 7. augusta 2026, 16:56 UTC: Vyšetrovatelia zachytili artefakty útoku.
- 8. augusta 2026: Oba API endpointy začali vracať čistý JSON.
Prečo je tento útok odlišný
Kampaň súvisí s rovnakými aktérmi, ktorí stáli za nedávnymi supply-chain útokmi na Advanced Responsive Video Embedder a OptinMonster. Cieľom bolo ticho získať perzistenciu administrátora a vzdialené spúšťanie kódu na veľkom počte WordPress prostredí.
Tento prípad ukazuje, že hranica dôvery nekončí pri súboroch pluginu. Ak plugin v administrácii bezpečne nespracuje vzdialený obsah, kompromitovaný dátový kanál dokáže z legitímneho banneru spraviť doručovací mechanizmus malvéru. Skontroluj všetky uvedené indikátory, odstráň neoprávnené účty a súbory a prever databázové možnosti skôr, než plugin znova aktivuješ alebo aktualizuješ.
Detekčné pravidlá
Platené varianty Wordfence Premium, Care, Response a Wordfence CLI dostali signatúry malvéru a pravidlá WAF na detekciu tejto kompromitácie 7. augusta 2026. Bezplatné Wordfence a bezplatné Wordfence CLI ich dostanú po štandardnom 30-dňovom odklade.
Referencie / Zdroje
Jana Szabová
Technická spisovateľka a špecialistka na dokumentáciu. Tvorba API dokumentácie a vývojárskych príručiek je moja vášeň. Dobrá dokumentácia má cenu zlata.
Všetky príspevkyViac od Jana Szabová
WordPress v roku 2026 opäť mieri na tri veľké vydania: prvé kontúry 7.0, AI Client, redizajn administrácie a tlak na PHP 7.4
WordPress Studio 1.7.0 prináša Studio CLI v2: lokálne weby, preview a WP-CLI priamo z terminálu
HelloBlog.io je spustený: 22 jazykov, bez reklám a s dôrazom na open source webový vývoj