Preskočiť na obsah
BdThemes zasiahla supply-chain kompromitácia cez otrávené JSON API
Jana Szabová
Jana Szabová 9. August 2026 · 8 min čítania

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.

Zraniteľné zostavenie atribútu `id` biggopti.js
// 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.php s MD5 1024732009983dd5e54b4cf5593f04d4
  • MU-plugin magic-login backdoor class-wp-token-validate.php s MD5 7719cd98a35ffad2771f26d1ceab7d27
  • MU-plugin stealth modul class-wp-query-9d127ff3.php alebo podobný názov podľa vzoru class-wp-query-*.php, s MD5 9aadc3e5c5242b273bd17c5bdc358845
  • MU-plugin „health check“ modul wp-cache-optimizer.php s MD5 e450ae5bc4bfc0d960dded06a76bb8e9
  • 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.org alebo @developer.wordpress.org
  • Používateľské mená podľa vzoru bd_ + šesť alfanumerických znakov

Časová os incidentu

  1. 1. marca 2026: Biggopti API JavaScript pribudol do Prime Slider 4.1.9 v SVN revízii r3471891. Pole display_id sa vložilo do atribútu id bez escapovania a plugin používal endpoint api-data-records.
  2. 10. mája 2026: Endpoint sa zmenil na api-data-all-records. Pole obsahu bannera začal čistiť DOMParser, no atribút id zostal neescapovaný.
  3. 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.
  4. 6. augusta 2026, 22:40 UTC: Napadnutý api-data-records mal poslednú zmenu.
  5. 7. augusta 2026, 09:11 UTC: Napadnutý api-data-all-records mal poslednú zmenu.
  6. 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. 7. augusta 2026, 16:56 UTC: Vyšetrovatelia zachytili artefakty útoku.
  8. 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.

Pridajte sa ku komunite HelloWP!

Chatujte s nami o WordPresse, webovom vývoji a zdieľajte skúsenosti s ostatnými vývojármi.

- členovia
- online
Pridať sa

Používame súbory cookie na zlepšenie vášho zážitku. Pokračovaním súhlasíte s našimi Zásadami používania súborov cookie.