Ugrás a tartalomra
BdThemes ellátásilánc-támadás: mérgezett API-válaszokon át fertőztek WordPress-oldalakat
Szabó Péter
Szabó Péter 2026. augusztus 9. · 12 perc olvasás

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, "&amp;")
    .replace(/</g, "&lt;")
    .replace(/>/g, "&gt;")
    .replace(/"/g, "&quot;");
}

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:

  1. C2-ellenőrzés: a fertőzött webhely origin értékével kapcsolatba lépett az ia-cdn[.]com/fz/c C2-endpointtal. Ha a válasz skip vagy done állapotot adott, leállt.
  2. Illetéktelen adminfiók létrehozása: az aktív adminisztrátori munkamenetben elérhető X-WP-Nonce segí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.
  3. 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-thumbnails nevet, és egy közvetlen URL-lel hívható emer-run.php webshellt tartalmazott.
  4. MU-bővítményes perzisztencia: az emer-run.php ké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.
  5. Adatszivárogtatás: minden végrehajtási fázis eredményét a navigator.sendBeacon API-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-*.php né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.org vagy @developer.wordpress.org e-mail-domainnel létrehozott fiókok
  • bd_ 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). A display_id escape-elés nélkül került az id attribútumba, az API-endpoint pedig az api-data-records volt.
  • 2026. május 10. – Az endpoint api-data-all-records értékre változott. A content mezőhöz bekerült a DOMParser-alapú tisztítás, az id attribú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-records mérgezett válaszának utolsó módosítási ideje.
  • 2026. augusztus 7., 09:11 UTC – Az api-data-all-records mé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.

Csatlakozz a HelloWP közösséghez!

Beszélgess velünk a WordPressről, a webfejlesztésről, és oszd meg a tapasztalataidat más fejlesztőkkel.

- tag
- online
Csatlakozás

Sütiket használunk az élményed javítása érdekében. A folytatással elfogadod a Sütikre vonatkozó irányelveinket.