Pāriet uz saturu
BdThemes API piegādes ķēdes kompromitējums: ko pārbaudīt WordPress vietnē
Jānis Kalniņš
Jānis Kalniņš 2026. gamdam 9. August · 11 min lasīšana

BdThemes API piegādes ķēdes kompromitējums: ko pārbaudīt WordPress vietnē

BdThemes spraudņu ekosistēmā ir atklāts piegādes ķēdes kompromitējums, kur uzbrucēji neizmainīja nevienu failu WordPress.org repozitorijā. Tā vietā viņi ļaunprātīgi mainīja attālu JSON datu plūsmu, ko spraudņi izmantoja administrācijas reklāmas paziņojumiem, un ieguva iespēju izpildīt JavaScript autorizētu administratoru pārlūkos.

Skartie spraudņi WordPress spraudņu katalogā ir uz laiku slēgti, kamēr WordPress Plugins komanda tos pārbauda. Ja vietnē darbojas kāds no šiem spraudņiem, nepietiek ar failu integritātes pārbaudi: jāpārskata lietotāji, spraudņu direktoriji un datubāzes opcijas.

Kāpēc tas ir bīstami

Uzbrukums neprasa spraudņa atjauninājumu un nemaina failus servera diskā. Ļaunprātīgais kods ielādējas katrā wp-admin lapas atvēršanas reizē, ja administrators ir pieteicies.

Kā darbojas kompromitējums

BdThemes spraudņos ir iekļauts iekšējs komponents Biggopti. Tas no piegādātāja API ielādē reklāmas banerus un parāda tos WordPress administrācijas panelī. API nav dinamisks lietotņu serveris: tas apkalpo statiskus JSON failus no DigitalOcean Spaces objektu krātuves, kuru aizsargā Cloudflare.

Spraudņu autora JavaScript kodā bija XSS (cross-site scripting jeb starpvietņu skriptēšanas) ievainojamība. Uzbrucēji ieguva rakstīšanas piekļuvi šai objektu krātuvei, aizstāja leģitīmās JSON atbildes ar sagatavotiem datiem un izmantoja ievainojamību administratora sesijā.

Katrs BdThemes spraudnis, kas izmanto Biggopti, admin_init hook laikā piesaista klienta puses JavaScript. Tāpēc skripts darbojas bez nosacījumiem ikreiz, kad ielādē jebkuru wp-admin lapu. Tas saņem banera datus no API un ievieto attālā JSON lauka display_id vērtību HTML id atribūtā bez ekrānēšanas.

// display_id vērtību ievieto DOM bez ekrānēšanas
var f = t.display_id || t.id || "default";
var m = "bdt-admin-biggopti-api-biggopti-" + f;
A = 'id="' + m + '"';

Tajā pašā kodā data-display-id atribūtam bija atsevišķa ekrānēšanas funkcija. Tā aizstāj &, <, > un pēdiņas ar HTML entītijām, taču id atribūta veidošanā šo funkciju neizmantoja.

function escapeAttribute(value) {
  return (value || "")
    .replace(/&/g, "&amp;")
    .replace(/</g, "&lt;")
    .replace(/>/g, "&gt;")
    .replace(/"/g, "&quot;");
}

SVN vēsture rāda, ka neekranēto atribūta ievietošanu Prime Slider spraudņa bdthemes-prime-slider-lite versijā 4.1.9 pievienoja 2026. gada 1. martā, pēc tam to pārnesa uz citiem spraudņiem. Vēlākās versijās banera content laukam pievienoja uz DOMParser balstītu sanitizētāju, kas izmet bīstamus HTML tagus un inline apstrādātājus, bet id atribūts palika neaizsargāts.

Ļaunprātīgais display_id aizver id atribūtu un pievieno onanimationstart notikuma apstrādātāju. CSS animācija to aktivizē aptuveni 10 milisekundēs, tādēļ kods klusi nostrādā, administratoram atverot jebkuru paneļa lapu. Ļaunprātīgajā API ierakstā bija arī šķietami parasts banera virsraksts “Build more. Pay less. This Summer”.

Ievainojamība un skartie spraudņi

Biggopti bibliotēkā display_id parametrs no Sigmative API ļauj izraisīt XSS, jo izvade nav pietiekami ekrānēta. Uzbrucējs, kas kompromitē Sigmative API serveri, var ievietot patvaļīgu tīmekļa skriptu lapās, kurās ielādē inficēto ierakstu.

Ievainojamībai piešķirts CVSS vērtējums 5,4 (vidējs), un tai nav labojuma. Tā skar šādu programmatūru:

Divi ļaunprātīgie izpildes ceļi

Ievadītais notikuma apstrādātājs ielādē ārējus skriptus vairākos posmos. Tas izvēlas pieejamo uzbrucēju infrastruktūru, tādēļ kampaņā bija divi atšķirīgi payload ceļi.

Primārais payload: w2.js

Spraudņi, kas izmanto api-data-all-records endpoint, ielādēja galveno w2.js payload. Tas darbojās jau autorizēta administratora sesijā un izpildīja šādas darbības:

  1. Pārbauda C2 serveri. Skripts sūta vietnes origin uz ia-cdn[.]com/fz/c, lai saņemtu norādes par mērķēšanu. Ja serveris atbild ar statusu skip vai done, skripts pārtrauc darbu.
  2. Izveido neatļautu administratoru. Tas izmanto aktīvajā administratora sesijā pieejamo X-WP-Nonce, lai caur WordPress REST API pievienotu administratoru. Ja tas neizdodas, skripts mēģina nosūtīt parastu administrācijas formas pieprasījumu.
  3. Instalē webshell. Skripts no C2 servera lejupielādē viltota spraudņa ZIP arhīvu un augšupielādē to caur standarta spraudņu instalēšanas formu. Viltus spraudnis maskējas ar slug wp-smart-thumbnails vai līdzīgu neitrālu nosaukumu, bet tajā ir webshell emer-run.php, ko izsauc tieši ar URL.
  4. Izveido Must-Use (MU) spraudņu aizmugures piekļuves. emer-run.php Must-Use spraudņu direktorijā instalē divus noturības moduļus. Abi iegūtie paraugi bija datēti ar 2025. gada septembri, lai saplūstu ar leģitīmiem failu laika zīmogiem, tomēr failu nosaukumi dažādās infekcijās var atšķirties. Pirmais modulis izveido maģiskās pieteikšanās aizmugures piekļuvi: ar URL parametru ?_wplogin=<token> var bez autentifikācijas iegūt administratora piekļuvi vietnes visilgāk reģistrētā administratora vārdā. Otrais modulis slēpj uzbrukumu analīzes laikā: tas piesaistās WordPress datubāzes vaicājumiem, paslēpj izveidotos neatļautos kontus administrācijas lietotāju sarakstā un atbilstoši samazina kopējo lietotāju skaitu.
  5. Nosūta izpildes rezultātus. Skripts katra posma rezultātus nodod C2 serverim ar navigator.sendBeacon.

Alternatīvais payload: x.js

Spraudņi, kas izmanto api-data-records endpoint, saņēma sekundāro x.js skriptu, kas bija izvietots tieši BdThemes infrastruktūrā. Tas no vietnes hosta nosaukuma matemātiski atvasina deterministiskus administratora piekļuves datus.

function makeCreds() {
  var host = siteKey();
  var hash = 0;

  for (var i = 0; i < host.length; i++) {
    hash = ((hash << 5) - hash + host.charCodeAt(i)) | 0;
  }

  var n = Math.abs(hash).toString(36).slice(0, 6);
  return {
    user: "bd_" + n,
    pass: "Bd@26!" + n + "x"
  };
}

Algoritms veido lietotājvārdu bd_ un sešu rakstzīmju base36 hash kombinācijā, kā arī paroli Bd@26!, hash un burtu x. Tam piesaista e-pasta adresi ar domēnu @wordpress.org. Tā kā šie dati ir deterministiski, uzbrucējiem nav centrāli jāglabā kompromitēto vietņu saraksts; incidenta izmeklētājs var aprēķināt meklējamo lietotājvārdu un paroli aizdomīgai vietnei.

Pēc tam x.js ar šiem datiem izveido neatļautu administratoru, nosūta iznākumu uz C2 serveri ar navigator.sendBeacon vai rezerves fetch POST pieprasījumu un, ja iespējams, pārlūkā saglabā localStorage karodziņu. Skripts vispirms ielādē /wp-admin/user-new.php, atrod nonce, nosūta administratora izveides formu un ziņo statusu created, exists, fail, nonce_missing vai err; tas vairs nemēģina darbību, ja atrod jau saglabātu pabeigšanas karodziņu.

Kampaņas tvērums un iespējamā izcelsme

C2 domēns ir saistīts ar tiem pašiem uzbrucējiem, kuri pēdējo divu mēnešu laikā veica Advanced Responsive Video Embedder un OptinMonster piegādes ķēdes uzbrukumus.

Kampaņas mērķis ir klusi un plaši iegūt noturīgu administratora piekļuvi un attālinātas koda izpildes iespēju WordPress vidēs. Šajā gadījumā uzbrucējiem nevajadzēja piekļūt pašām vietnēm: pietika kompromitēt uzticamu reklāmas datu plūsmu, lai ievainojamais attēlošanas kods pārvērstu administrācijas paziņojumu par ļaunprogrammatūras piegādes kanālu.

Fakts, ka ļaunprātīgie JSON ieraksti un sekundārais x.js payload tika augšupielādēti piegādātāja krātuvē, norāda uz nopietnu BdThemes mākoņkrātuves piekļuves datu vai iekšējās infrastruktūras kompromitējumu.

Kompromitējuma indikatori

Pārbaudi servera pieprasījumu žurnālus, failu sistēmu, datubāzi un WordPress lietotājus pēc šiem indikatoriem. Indikatori aptver gan sākotnējo skriptu ielādi, gan noturības mehānismus pēc administratora piekļuves iegūšanas.

Ārējie resursi

  • Primārā payload adrese: ia-cdn[.]com/fz/w2.js
  • C2 beacon endpoint: ia-cdn[.]com/fz/c
  • Kompromitētais piegādātāja API endpoint, kas tagad atdod tīru JSON: api[.]sigmative[.]io/prod/store/api/biggopti/api-data-all-records
  • Kompromitētais piegādātāja API endpoint, kas tagad atdod tīru JSON: api[.]sigmative[.]io/prod/store/api/biggopti/api-data-records
  • Kompromitētā piegādātāja skripta adrese: api[.]sigmative[.]io/prod/store/api/biggopti/x.js

Faili, datubāze un lietotāji

  • Webshell fails emer-run.php, MD5: 1024732009983dd5e54b4cf5593f04d4.
  • MU spraudņa maģiskās pieteikšanās aizmugures piekļuves fails class-wp-token-validate.php, MD5: 7719cd98a35ffad2771f26d1ceab7d27.
  • MU spraudņa slēpšanas modulis class-wp-query-9d127ff3.php vai līdzīgs nosaukums class-wp-query-*.php, MD5: 9aadc3e5c5242b273bd17c5bdc358845.
  • MU spraudņa “Health Check” modulis wp-cache-optimizer.php, MD5: e450ae5bc4bfc0d960dded06a76bb8e9.
  • Datubāzes opcija fz_emer_login_tokens, kas glabā maģiskās pieteikšanās tokenus.
  • Datubāzes opcija fz_emer_done_v1, kas norāda uz pabeigtu kompromitējumu.
  • Lietotāju konti ar e-pasta domēnu @wordpress.org vai @developer.wordpress.org.
  • Lietotājvārdi formātā bd_ un sešas burtciparu rakstzīmes.

Notikumu laika līnija

  • 2026. gada 1. marts: Prime Slider 4.1.9 versijai pievieno Biggopti API JavaScript (SVN r3471891). display_id nonāk id atribūtā bez ekrānēšanas, un spraudnis izmanto api-data-records endpoint.
  • 2026. gada 10. maijs: endpoint nomaina uz api-data-all-records. content laukam pievieno DOMParser sanitizētāju, bet id atribūts paliek neekranēts.
  • 2026. gada 23. jūnijs: kompromitētās API kampaņas ieraksta start_date ir “Summer Sale” paziņojumam. Šis ir agrākais iespējamais datums, kad XSS varēja būt aktīvs.
  • 2026. gada 6. augusts, 22:40 UTC: pēdējās izmaiņas laiks kompromitētajam api-data-records endpoint.
  • 2026. gada 7. augusts, 09:11 UTC: pēdējās izmaiņas laiks kompromitētajam api-data-all-records endpoint.
  • 2026. gada 7. augusts: par uzbrukumu paziņo draudu izlūkošanas komandai un uzbrukumu novēro reālā vidē.
  • 2026. gada 7. augusts: skartos spraudņus WordPress katalogā slēdz līdz pārbaudes pabeigšanai.
  • 2026. gada 7. augusts, 16:56 UTC: saglabā izmeklēšanas artefaktus.
  • 2026. gada 8. augusts: abi API endpoint atkal atdod tīru JSON.

Ko darīt skarto vietņu uzturētājiem

Nekavējoties noskaidro, vai vietnē darbojas kāds no septiņiem skartajiem BdThemes spraudņiem. Pēc tam pārskati WordPress lietotāju sarakstu, īpaši kontus ar bd_ prefiksu un @wordpress.org vai @developer.wordpress.org e-pasta adresēm, kā arī pārbaudi MU spraudņu direktoriju, parasto spraudņu direktoriju un datubāzes opciju tabulu pēc visiem norādītajiem indikatoriem.

Neuzticies tikai failu integritātes skenerim vai WAF: šis uzbrukums sākotnēji izmantoja attālu API atbildi, tāpēc spraudņu faili diskā var palikt nemainīti. Ja atrodi indikatorus, apstrādā vietni kā pilnībā kompromitētu, noņem neatļautos kontus un ļaunprātīgos failus, iztīri datubāzes opcijas un pārbaudi visas noturības pēdas.

Wordfence Premium, Care un Response lietotāji, kā arī maksas Wordfence CLI klienti saņēma ļaunprogrammatūras signatūras un WAF noteikumus šī kompromitējuma noteikšanai 2026. gada 7. augustā. Wordfence bezmaksas un Wordfence CLI bezmaksas lietotāji šīs signatūras un noteikumus saņems pēc standarta 30 dienu aizkaves.

Pievienojieties HelloWP kopienai!

Tērzējiet ar mums par WordPress, tīmekļa izstrādi un dalieties pieredzē ar citiem izstrādātājiem.

- biedri
- tiešsaistē
Pievienoties

Mēs izmantojam sīkdatnes, lai uzlabotu jūsu pieredzi. Turpinot, jūs piekrītat mūsu Sīkdatņu politikai.