BdThemes ellátásilánc-támadás: mérgezett API-válaszokon át fertőztek WordPress-oldalakat
A BdThemes több, a hivatalos WordPress-bővítménytárban elérhető bővítményét érintő ellátásilánc-támadás történt. A támadóknak nem kellett módosítaniuk a WordPress.org-on tárolt forráskódot: egy távoli, promóciós adminisztrációs bannerekhez használt JSON-adatfolyamot mérgeztek meg, majd azon keresztül futtattak kódot a bejelentkezett adminisztrátorok böngészőjében.
Az érintett bővítményeket 2026. augusztus 7-én ideiglenesen bezárták a WordPress-bővítménytárban a teljes átvizsgálás idejére. Ha BdThemes-bővítményt használsz, ne elégedj meg a fájlintegritás ellenőrzésével: vizsgáld át a felhasználókat, a bővítménykönyvtárakat és az adatbázis opciós tábláját is.
Miért különösen veszélyes?
A támadás sikeres lefutásakor illetéktelen adminisztrátori fiók, webshell és Must-Use (MU) bővítményként működő perzisztens hátsó kapu kerülhet a webhelyre. A bővítményfájlok változatlanok maradhatnak, ezért a kizárólag fájlmódosításokra építő ellenőrzések nem feltétlenül jeleznek.
Az érintett bővítmények és a sebezhetőség
A probléma a BdThemes-bővítményekben található Biggopti komponenshez kötődik. Ez a rendszer adminisztrációs promóciós bannereket kér le a szolgáltató API-járól, majd a WordPress vezérlőpultján megjeleníti őket. A háttér nem dinamikus alkalmazásszerver volt, hanem Cloudflare-rel védett DigitalOcean Spaces objektumtárolóból kiszolgált statikus JSON-fájlok gyűjteménye.
A Biggopti különböző verzióit egy közepes súlyosságú, CVSS 5.4-es, javítás nélküli XSS-sebezhetőség érinti. A hiba a Sigmative API-ból érkező display_id mező nem megfelelő kimeneti escape-eléséből ered. Aki írni tud a Sigmative API mögötti tárhelyre, tetszőleges webes scriptet helyezhet el olyan oldalakon, amelyeket később egy felhasználó megnyit.
Az érintett bővítmények:
- 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)
Így vált a promóciós feed támadási felületté
Minden Biggopti-t használó érintett bővítmény az admin_init hookon betölt egy kliensoldali JavaScript-fájlt. Emiatt a script feltétel nélkül lefut minden egyes wp-admin oldalletöltéskor, lekéri a banneradatokat a gyártó API-endpointjáról, majd összeállítja a megjelenítéshez szükséges DOM-elemeket.
A gondot az okozza, hogy a script a távoli JSON display_id értékét közvetlenül fűzi bele egy HTML id attribútumba, kliensoldali escape-elés nélkül. A sebezhető logika lényegében így működik:
// A távoli JSON-ból érkező érték nincs escape-elve.
var displayId = data.display_id || data.id || "default";
var elementId = "bdt-admin-biggopti-api-biggopti-" + displayId;
html = 'id="' + elementId + '"';Ugyanebben a kódban a data-display-id attribútumhoz már escape-elnek speciális karaktereket: az &, <, >, illetve idézőjelek HTML-entitásra cserélődnek. Ez azonban nem védi az id attribútumba kerülő értéket, ahol a hiba megmaradt.
function escapeAttribute(value) {
return (value || "")
.replace(/&/g, "&")
.replace(/</g, "<")
.replace(/>/g, ">")
.replace(/"/g, """);
}A nem escape-elt attribútum-injektálás 2026. március 1-jén került be a Prime Slider 4.1.9-es verziójába, majd más bővítményekbe is átkerült. A későbbi kiadások a banner content mezőjéhez DOMParser-alapú tisztítást vezettek be, amely eltávolította a veszélyes HTML-tageket és inline handlereket, de az id attribútum hibáját nem javították.
A támadó a tárolóhoz szerzett írási jogosultsággal a szabályos JSON-válaszokat manipulált rekordokra cserélte. A rosszindulatú display_id kitört az id attribútumból, majd egy CSS-animáció indulásához kötött onanimationstart eseménykezelőt szúrt be. Ez körülbelül 10 ezredmásodpercen belül, csendben aktiválódott, amikor egy adminisztrátor bármelyik vezérlőpultoldalt betöltötte.
A fertőzési folyamat több payloadot használ
Az injektált eseménykezelő külső scripteket töltött be. A támadás több lépcsőben és két eltérő payload útján dolgozott, attól függően, hogy az adott bővítmény melyik API-endpointot használta.
Elsődleges payload: w2.js
Az api-data-all-records endpointot használó bővítmények esetén a fő payload a w2.js volt. Ez a bejelentkezett adminisztrátor munkamenetében futott, és az alábbi lépéseket hajtotta végre:
- C2-ellenőrzés: a fertőzött webhely origin értékével kapcsolatba lépett az
ia-cdn[.]com/fz/cC2-endpointtal. Ha a válaszskipvagydoneállapotot adott, leállt. - Illetéktelen adminfiók létrehozása: az aktív adminisztrátori munkamenetben elérhető
X-WP-Noncesegítségével a WordPress REST API-n keresztül próbált új adminisztrátort felvenni. Sikertelenségkor a hagyományos űrlapbeküldésre állt át. - Webshell telepítése: a C2-szerverről letöltött egy hamis bővítmény-ZIP-et, majd a szokásos bővítményfeltöltő űrlapon telepítette. A csomag semlegesnek tűnő slugot kapott, például
wp-smart-thumbnailsnevet, és egy közvetlen URL-lel hívhatóemer-run.phpwebshellt tartalmazott. - MU-bővítményes perzisztencia: az
emer-run.phpkét modult telepített a Must-Use bővítmények könyvtárába. A minták fájlrendszer-időbélyegeit 2025 szeptemberére állították vissza, hogy beleolvadjanak a környezetbe; a fájlnevek fertőzésenként változhatnak. Az egyik modul URL-paraméterrel (?_wplogin=<token>) jelszó nélküli admin belépést tett lehetővé, és a legrégebben regisztrált adminfiókot célozta. A másik modul WordPress-adatbázis-lekérdezésekbe hookolva elrejtette a létrehozott fiókokat az admin felhasználólistájából, és a felhasználók összesített számát is ennek megfelelően csökkentette. - Adatszivárogtatás: minden végrehajtási fázis eredményét a
navigator.sendBeaconAPI-val küldte vissza a C2-szervernek.
Másodlagos payload: x.js
Az api-data-records endpointot használó áldozatok a BdThemes infrastruktúráján tárolt x.js scriptet kapták. Ez a webhely hostname-jéből számított, determinisztikus adminisztrátori hitelesítő adatokat generált: a felhasználónév bd_ előtagot és egy hat karakteres base36 hash-t kapott, a jelszó pedig Bd@26! előtagból, ugyanebből a hash-ből és egy x utótagból állt.
A hash a hostname karakterkódjait használó egyszerű matematikai számításból készült. Emiatt a támadóknak nem kellett központilag tárolniuk a feltört oldalak listáját: egy gyanús domain alapján később is kiszámíthatták a várható felhasználónevet és jelszót. A fiókhoz @wordpress.org végződésű e-mail-címet rendeltek.
A script a generált adatokkal a /wp-admin/user-new.php oldalon próbált adminfiókot létrehozni, a művelet kimenetelét pedig elküldte a C2-nek. Sikeres vagy már teljesített fertőzés után lehetőség szerint localStorage jelzőt mentett a böngészőbe, hogy ugyanabban a böngészőben ne futtassa le újra a folyamatot.
Hatókör és a támadói infrastruktúra
A C2-domain ugyanahhoz a támadói körhöz köthető, amely az előző két hónapban az Advanced Responsive Video Embedder és az OptinMonster ellátásilánc-támadásait is végrehajtotta. A kampány célja a széles körű, rejtett adminisztrátori hozzáférés fenntartása és a távoli kódfuttatás volt WordPress-környezetekben.
Ebben az esetben nem a célwebhelyekhez kellett hozzáférést szerezni. Elég volt a gyártó promóciós adatcsatornáját kompromittálni, majd a megbízhatónak tekintett adminisztrációs bannerből kártevőterjesztési csatornát csinálni. Az, hogy a rosszindulatú JSON-rekordok és a másodlagos x.js payload is közvetlenül a gyártó tárhelyére került, a BdThemes felhőtároló-hitelesítő adatainak vagy belső infrastruktúrájának súlyos kompromittálására utal.
Kompromittálódásra utaló jelek
Ellenőrizd az alábbi külső erőforrásokat, fájlokat, adatbázis-bejegyzéseket és felhasználói mintákat. A mérgezett gyártói API-endpointok 2026. augusztus 8-ára már tiszta JSON-t adtak vissza, de a korábban fertőzött webhelyeken a perzisztens elemek ettől még megmaradhattak.
Külső URL-ek
- Elsődleges payload:
ia-cdn[.]com/fz/w2.js - C2 beacon endpoint:
ia-cdn[.]com/fz/c - Korábban mérgezett API:
api[.]sigmative[.]io/prod/store/api/biggopti/api-data-all-records - Korábban mérgezett API:
api[.]sigmative[.]io/prod/store/api/biggopti/api-data-records - Korábban mérgezett másodlagos script:
api[.]sigmative[.]io/prod/store/api/biggopti/x.js
Fájlrendszer és adatbázis
- Webshell:
emer-run.php– MD5:1024732009983dd5e54b4cf5593f04d4 - MU-bővítményes magic-login hátsó kapu:
class-wp-token-validate.php– MD5:7719cd98a35ffad2771f26d1ceab7d27 - MU-bővítményes rejtőzködő modul:
class-wp-query-9d127ff3.php, illetve hasonlóclass-wp-query-*.phpnév – MD5:9aadc3e5c5242b273bd17c5bdc358845 - MU-bővítményes „Health Check” modul:
wp-cache-optimizer.php– MD5:e450ae5bc4bfc0d960dded06a76bb8e9 - Adatbázis-opció:
fz_emer_login_tokens, amely a magic-login tokeneket tárolja - Adatbázis-opció:
fz_emer_done_v1, amely a befejezett kompromittálást jelzi @wordpress.orgvagy@developer.wordpress.orge-mail-domainnel létrehozott fiókokbd_előtaggal kezdődő, azt követően hat alfanumerikus karakterből álló felhasználónevek
Idővonal
- 2026. március 1. – A Biggopti API JavaScript bekerült a Prime Slider 4.1.9-es verziójába (SVN
r3471891). Adisplay_idescape-elés nélkül került azidattribútumba, az API-endpoint pedig azapi-data-recordsvolt. - 2026. május 10. – Az endpoint
api-data-all-recordsértékre változott. Acontentmezőhöz bekerült a DOMParser-alapú tisztítás, azidattribútum azonban továbbra sem kapott escape-elést. - 2026. június 23. – A mérgezett API-kampány
start_dateértéke, amely egy „Summer Sale” értesítéshez kapcsolódott. Ez a legkorábbi lehetséges időpont, amikor az XSS aktív lehetett. - 2026. augusztus 6., 22:40 UTC – Az
api-data-recordsmérgezett válaszának utolsó módosítási ideje. - 2026. augusztus 7., 09:11 UTC – Az
api-data-all-recordsmérgezett válaszának utolsó módosítási ideje. - 2026. augusztus 7. – Értesítést kaptak az incidensről, és a támadást éles környezetben is megfigyelték.
- 2026. augusztus 7. – A bővítményeket a WordPress-bővítménytárban felülvizsgálatig bezárták.
- 2026. augusztus 7., 16:56 UTC – Rögzítették a vizsgálathoz szükséges artefaktumokat.
- 2026. augusztus 8. – Mindkét API-endpoint ismét tiszta JSON-választ adott.
Azonnali teendők érintett webhelyen
Azonnal nézd át a WordPress felhasználólistáját, de ne bízz kizárólag az adminfelületben: a hátsó kapu elrejtheti az illetéktelen fiókokat és módosíthatja a felhasználószámot. Vizsgáld meg közvetlenül az adatbázist is a bd_ mintájú felhasználónevekért, valamint @wordpress.org és @developer.wordpress.org e-mail-címekért.
Ellenőrizd a normál és az MU-bővítmények könyvtárát az felsorolt fájlnevek, hash-ek és hasonló class-wp-query-*.php fájlok után. Keresd meg az fz_emer_login_tokens és fz_emer_done_v1 opciókat az adatbázisban, majd minden talált kompromittálódási jel esetén kezeld az oldalt teljes körű fertőzésként: szüntesd meg az illetéktelen hozzáférést, távolítsd el a perzisztens komponenseket, és cseréld le az érintett hitelesítő adatokat.
A Wordfence Premium, Care, Response és fizetős Wordfence CLI ügyfelei 2026. augusztus 7-én megkapták a kompromittálás észleléséhez szükséges kártevő-aláírásokat és WAF-szabályokat. Az ingyenes Wordfence és Wordfence CLI felhasználók a szokásos 30 napos késleltetéssel kapják meg ezeket.
Hivatkozások / Források
- PSA: Supply Chain Compromise in BdThemes Ecosystem via Poisoned API Response
- Biggopti Library (Various Versions) – Cross-Site Scripting via display_id from Sigmative API
- Wordfence PRISM Detected Backdoored WordPress Plugin Within Two Hours of It Being Introduced
- Security Incident: Tampered Script Served via OptinMonster and TrustPulse
Szabó Péter
Full-stack fejlesztő, JavaScript és Vue.js rajongó. Cikkeimet a gyakorlati problémamegoldás inspirálja. Ha nem kódolok, akkor biztosan podcastot hallgatok.
Összes bejegyzés