Mokėjai už saugumą — gavai backdoor’ą. Kaip ShapedPlugin surinkimo konvejerio kompromitavimas smogė mokiems WordPress klientams
Mokėjai už saugumą — gavai backdoor’ą. Kaip ShapedPlugin surinkimo konvejerio kompromitavimas smogė mokiems WordPress klientams
Sumokėjai už Pro plaginą, įjungei automatinius atnaujinimus ir miegi ramiai — nes esi komercinio produkto klientas, o ne vartotojas, naudojantis nemokamu šlamštu iš WordPress.org. Logiška? Lygiai taip galvojo tūkstančiai WordPress administratorių, naudojančių ShapedPlugin plaginų. Ir būtent jie gavo backdoor’ą per oficialų atnaujinimų kanalą — tą patį, kuriuo pasitikėjo.
2026 m. gegužės 21 d. užpuolikai įterpė kenkėjišką įkroviklį į trijų komercinių ShapedPlugin plaginų paketus: Product Slider Pro WooCommerce (iki versijos 3.5.4), Real Testimonials Pro (versija 3.2.5) ir Smart Post Show Pro (iki versijos 4.0.2). Nemokamos versijos WordPress.org nenukentėjo — ataka buvo tikslinė ir sąmoningai nukreipta prieš mokančius klientus. Incidentas registruojamas kaip CVE-2026-10735 su CVSS įvertinimu 9.8 — tai Critical, suteikiantis backdoor prieigą prie užkrėstų svetainių be jokio autentifikavimo. CVE-2026-49777 priimtas kaip dublikatas.
Wordfence Threat Intelligence komanda gavo signalą apie incidentą birželio 11 d., patvirtino kompromitavimą birželio 12 d. atsisiuntusi failus tiesiogiai iš ShapedPlugin svetainės, o birželio 16 d. tiekėjas pripažino pažeidimą. Jei jūsų svetainė naudojo bet kurį iš trijų Pro plaginų 2026 m. balandžio–birželio laikotarpiu — laikykite ją kompromituota, kol neįrodysite priešingai.
KAIP VEIKIA ATAKA
Atakos mechanizmas yra dviejų etapų ir sąmoningai daugiasluoksnis — kiekvienas etapas slepia kitą.
Pirmasis etapas — failas src/Includes/LicenseLoader.php, įterptas tiesiai į plagino diegimo paketą. Jis aktyvuojamas ant admin_init hook’o, tai yra paleidžiamas automatiškai tuo momentu, kai administratorius atidaro WordPress valdymo skydelį. Įkroviklis užmezga ryšį su C2 serveriu adresu 194[.]76[.]217[.]28:2871, atsisiunčia antrąjį etapą naudodamas standartinį WordPress Plugin_Upgrader — kad diegimas atrodytų kaip įprastas plagino atnaujinimas — po to ištrina save, fiziškai pašalindamas failą ir palikdamas minimalius forensinius pėdsakus.
Antrasis etapas įdiegiamas į direktoriją wp-content/plugins/woocommerce-subscription/ arba wp-content/plugins/woocommerce-notification/ — pavadinimai sąmoningai parinkti panašiai į teisėtus WooCommerce komponentus. Plaginas slepia save iš įdiegtų plaginų sąrašo per all_plugins filtrą, todėl administravimo skydelyje jo nematyti. Viduje — paruoštas užpuoliko arsenalo rinkinys: Tiny File Manager 2.6 (pilnavertis žiniatinklio failų tvarkyklė), Adminer 5.2.1 (duomenų bazės valdymas tiesiai per naršyklę), backdoor per REST API adresu /wp-json/wc/v3/settings/apply, URL-parametrinis webshell’as ir autentifikavimo apėjimas naudojant hardcoded MD5 maišą e268c35a06d85f672e70c9beecb4e5d1.
Grandinė trumpa: administratorius atidaro Dashboard — įkroviklis suveikia, įdiegia backdoor’ą, praneša aukos domeną į C2, išnyksta. Backdoor lieka nematomas ir laukia komandų.
KAS BUVO VOGTA
Išfiltruotų duomenų sąrašas — tai būtent tai, kas vertingiausia svetainėje su realiais pirkimais. Backdoor buvo specialiai sukurtas ištraukti vartotojų prisijungimus ir slaptažodžius, aktyvių sesijų cookie, vartotojų vaidmenis su akcentu į administratorius, WooCommerce užsakymų duomenis per paskutinius tris mėnesius įskaitant mokėjimo metodų informaciją, SMTP kredencialus, WordPress saugumo raktus iš wp-config.php ir pilną svetainės administratorių sąrašą.
Ypatingą dėmesį nusipelno dviejų veiksnių autentifikavimo paslapčių vagystė. Backdoor buvo specialiai sukurtas TOTP implementacijoms keturiuose populiariuose plaginuose: WP 2FA, Wordfence Login Security, Really Simple SSL ir Two-Factor. Jis ištraukia TOTP seed — tą patį sekretą, iš kurio generuojami vienkartiniai kodai. Gavęs seed’ą, užpuolikas pats generuoja galiojančius 2FA kodus ir visiškai apeina antrąjį faktorių — nepriklausomai nuo to, kaip atidžiai vartotojas jį nustatė.
Lygiagrečiai su duomenų rinkimu backdoor suteikė operatoriams galimybę rašyti bet kokius failus į serverį per Tiny File Manager arba webshell’ą. Praktiškai tai reiškia papildomų PHP shell’ų ir bet kokio kito kodo patalpinimą bet kurioje žiniatinklio serveriui prieinamoje failų sistemos vietoje. Duomenys pavogiami vieną kartą; failų tvarkyklė — tai nuolatinis įėjimo taškas.
KAIP BUVO KOMPROMITUOTAS SURINKIMO KONVEJERIS
Wordfence nerado įrodymų, kad plagino failai buvo pakeisti po publikavimo. Laiko žymių analizė parodė: keturi failai buvo pakeisti per dviejų valandų langą 2026 m. gegužės 21 d. — elgesys, būdingas automatizuotam injekcijos procesui, o ne rankiniam redagavimui. Pasak Wordfence, plagino metaduomenyse buvo rasti nuorodos į privačius Git saugyklas, o pakeitimų šablonas sutapo su ShapedPlugin leidimų darbo eiga.
Visa tai rodo kompromitavimą ne pačių plagino failų, o tiekėjo surinkimo ir platinimo konvejerio — infrastruktūros, kuri renka leidimų ZIP archyvus ir pristato juos mokiems klientams per oficialią svetainę. Todėl nemokamos versijos WordPress.org liko švarios: jos eina kitu publikavimo keliu. Užpuolikai turėjo prieigą prie abiejų kanalų ir sąmoningai lietė tik mokamąjį.
Tai klasikinė supply chain ataka per build pipeline. Ne konkrečios svetainės kompromitavimas, ne pažeidžiamumas plagino logikoje — o taško, iš kurio kodas vienu metu pasiekia tūkstančius klientų, kompromitavimas. Neseniai panašus incidentas buvo OptinMonster ataka per CDN raktą 2026 m. birželį. Skirtinga mechanika, tas pats rezultatas: kenkėjiškas kodas ateina iš patikimo adreso.
CHRONOLOGIJA
2026 m. gegužės 21 d. — kenkėjiškas kodas įterptas į Pro paketus per kompromituotą ShapedPlugin surinkimo konvejerį.
2026 m. birželio 10 d. — pirmieji klientų skundai dėl įtartinų atnaujinimų.
2026 m. birželio 11 d. — Wordfence Threat Intelligence gauna pranešimą apie galimą kompromitavimą.
2026 m. birželio 12 d. — Wordfence tyrėjai patvirtina pažeidimą atsisiuntę failus tiesiogiai iš ShapedPlugin svetainės. Užkrėstas Real Testimonials Pro versija 3.2.5 vis dar platinamas iš oficialaus atnaujinimų endpoint’o.
2026 m. birželio 16 d. — ShapedPlugin pripažįsta incidentą ir praneša apie tyrimo pradžią.
2026 m. birželio 17–18 d. — išleidžiamos pataisytos versijos: Product Slider Pro 3.5.4, Smart Post Show Pro 4.0.2, Real Testimonials Pro 3.2.6.
KODĖL TAI SVARBU
Mokami plaginai parduoda ne tik funkcionalumą — jie parduoda pasitikėjimą. Profesionali komanda, komercinė atsakomybė, oficialus atnaujinimų kanalas. ShapedPlugin parodė, kad pats atnaujinimų kanalas gali būti kompromituotas nepaliesiant produkto. Užpuolikai neišnaudojo pažeidžiamumo plagino kode ar logikoje — jie pateko į konvejerį, kuris renka ir platina leidimus, o toliau pats WordPress pasirūpino kenkėjiško kodo pristatymu.
Ypač reikšmingas atakos selektyvumas. Užpuolikai turėjo prieigą prie abiejų kanalų — mokamo ir nemokamo — ir sąmoningai lietė tik pirmąjį. Nemokamo WordPress.org vartotojai šį kartą buvo saugūs. Tie, kurie mokėjo — ne. Operaciniu požiūriu tai suprantama: mokami klientai su aktyviais WooCommerce parduotuvėmis reiškia kortelių duomenis, SMTP prieigą prie realaus domeno, paskyras su transakcijų istorija. Žymiai vertingiau nei bandomosios svetainės paskyra.
CVSS 9.8 čia nėra formalumas. Ataka nereikalauja jokio išankstinio autentifikavimo — backdoor jau viduje, laukia tik pirmojo administratoriaus vizito į Dashboard. Po to užpuolikas turi Adminer duomenų bazei, Tiny File Manager failų sistemai, webshell’ą komandų vykdymui ir visus kredencialus įskaitant TOTP seed’us. Visiškas svetainės valdymas be nė vieno nulaužto slaptažodžio.
KĄ DARYTI
Pirmiausia — ir tai skubiai: atnaujinkite paveiktus plaginus. Product Slider Pro — bent iki 3.5.4, Smart Post Show Pro — iki 4.0.2, Real Testimonials Pro — iki 3.2.6. Tačiau atnaujinimas tik uždaro pristatymo kanalą — jis nepašalina backdoor’o, jei jis jau buvo įdiegtas.
Patikrinkite failų sistemą dėl netikrų plaginų. Per Dashboard jų nematysite — backdoor slepia save per all_plugins filtrą. Žiūrėkite tiesiogiai: ieškokite direktorijų pavadintų woocommerce-subscription (vienaskaita, ne woocommerce-subscriptions) ir woocommerce-notification:
ls -la /var/www/html/wp-content/plugins/ | grep -E "woocommerce-subscription$|woocommerce-notification"
Jei direktorija rasta — svetainė buvo kompromituota. Ištrinkite ją, bet atminkite: iki šio momento per Tiny File Manager arba webshell’ą galėjo būti patalpinti papildomi backdoor’ai bet kurioje failų sistemos vietoje. Vienos direktorijos patikrinimas nesuteikia viso vaizdo.
Atstatykite visus kredencialus: WordPress vartotojų slaptažodžius, API raktus, SMTP slaptažodžius. Jei svetainė naudoja bet kurį iš keturių paveiktų 2FA plaginų — WP 2FA, Wordfence Login Security, Really Simple SSL arba Two-Factor — panaikinkite TOTP seed’us ir išduokite juos iš naujo visiems vartotojams. Laikykite senus QR kodus kompromituotais.
Atnaujinkite WordPress slaptuosius raktus wp-config.php — tai iš karto invaliduos visas aktyvias sesijas. Naujus aštuonių eilučių reikšmes nuo AUTH_KEY iki NONCE_SALT imkite iš oficialaus generatoriaus: https://api.wordpress.org/secret-key/1.1/salt/.
Patikrinkite administratorių sąrašą — šioje atakoje paskyros nebuvo kuriamos automatiškai (kitaip nei OptinMonster atveju, kur atsiradavo developer_api1), tačiau įrašai galėjo būti pridėti rankiniu būdu per gautą prieigą. Komanda išveda tik vartotojus su administratoriaus vaidmeniu, rodydama ID, prisijungimą, el. paštą ir registracijos datą. Paskutinis laukas — pagrindinis: nauja paskyra su registracijos data 2026 m. gegužės–birželio laikotarpiu yra raudonas signalas. Vėliavėlė --path nurodo WP-CLI kur ieškoti WordPress įdiegimo — be jos komanda kris su klaida „This does not seem to be a WordPress installation”:
wp user list --path=/var/www/html --role=administrator --fields=ID,user_login,user_email,user_registered
Jei komanda neveikia dėl open_basedir apribojimų — paleiskite kaip žiniatinklio vartotojas:
sudo -u www-data wp user list --path=/var/www/html --role=administrator --fields=ID,user_login,user_email,user_registered
Užblokuokite C2 adresą firewall lygmeniu. Taisyklė pridedama į output grandinę ir atmeta visus išeinančius paketus į IP 194.76.217.28 — atakos komandinio serverio adresą. Net jei serveryje liko neatrastas likutinis kodas, ryšys su C2 nebus užmegztas:
nft add rule inet filter output ip daddr 194.76.217.28 drop
PREVENCINĖ APSAUGA
Konkretaus C2 adreso blokavimas uždaro šią ataką, bet ne kitą. Tikroji apsauga — apriboti išeinančius ryšius iš PHP proceso apskritai. Įkroviklis kaip LicenseLoader.php veikia kaip žiniatinklio vartotojas (www-data Debian/Ubuntu sistemose) ir jungiasi prie C2 nestandartiniu portu — šiuo atveju 2871. nftables taisyklė pagal uid sunaikina visą šią atakų klasę: PHP galės daryti HTTP/HTTPS užklausas į išorę, bet savavališki TCP ryšiai su atsitiktiniais portais bus atmesti:
nft add rule inet filter output skuid www-data tcp dport != { 80, 443 } drop
Jei WordPress teisėtai reikia kitų išeinančių portų — pridėkite juos į išimčių sąrašą. Patikrinti žiniatinklio vartotojo uid: id www-data. Jei PHP-FPM pulas veikia kitu vartotoju — pakeiskite jo vardą.
PHP-FPM lygmeniu galima išjungti funkcijas, kurias įkroviklis naudoja tinklo ryšiams atidaryti. WordPress pulo konfigūracijos faile, pavyzdžiui /etc/php/8.3/fpm/pool.d/wordpress.conf, pridėkite:
php_admin_value[disable_functions] = fsockopen,pfsockopen,stream_socket_client
Tai pašalina galimybę atidaryti savavališkus TCP socket’us iš PHP kodo. Dauguma teisėtų WordPress plaginų naudoja cURL arba wp_remote_get() HTTP užklausoms — jie nenukentės. Po pakeitimo paleiskite PHP-FPM iš naujo: systemctl restart php8.3-fpm.
Failų sistemos stebėjimas — vienintelis būdas pagauti 2-ąjį etapą įrašymo momentu, kol įkroviklis dar nesitrinė. inotifywait iš inotify-tools paketo stebi plaginų direktoriją ir iš karto užrašo į žurnalą, kai atsiranda naujas failas ar direktorija:
inotifywait -m -r -e create,moved_to --format '%T %w%f' \
--timefmt '%Y-%m-%d %H:%M:%S' \
/var/www/html/wp-content/plugins/ >> /var/log/wp-plugins-monitor.log 2>&1 &
Nuolatiniam stebėjimui sukurkite systemd servisą — kitaip procesas dings po perkrovimo. AIDE suteikia gilesnę patikrą: ji įrašo failų sistemos baseline ir kiekvieno paleidimo metu lygina su juo. Nauja direktorija wp-content/plugins/ bus aptikta per kitą patikrinimą, net jei įkroviklis jau seniai ištrintas:
# Inicializuoti baseline švariai sistemai
aide --init
mv /var/lib/aide/aide.db.new /var/lib/aide/aide.db
# Patikrinti dabartinę būseną su baseline
aide --check
Paleiskite aide --check kasdien per systemd timer — bet koks nukrypimas nuo baseline pasirodys ataskaitoje. WordPress serveriui su realiais mokėjimais tai nėra pasirinktinė priemonė.
IŠVADOS
ShapedPlugin — ne išskirtinis atvejis. Tai antras didelis supply chain incidentas WordPress ekosistemoje per vieną mėnesį, po OptinMonster. Vektorius per build pipeline arba platinimo infrastruktūrą tampa standartiniu įrankiu — jis leidžia vienu metu pasiekti visus tiekėjo klientus, naudojant jų pačių pasitikėjimą tiekėju.
Praktinė išvada aiški: WordPress Dashboard nėra autoritetingas šaltinis apie tai, kas iš tikrųjų įdiegta serveryje. Plaginas gali nebūti sąraše ir vis tiek veikti. AIDE failų sistemoje, naujų failų stebėjimas wp-content/plugins/, auditas per WP-CLI — tai ne paranojos priemonės. Tai minimumas kiekvienai svetainei su realiais mokėjimais.
Kompromitavimo langas — apie mėnesį: gegužės 21 d. – birželio 16 d. Pataisytos versijos prieinamos. Jei naudojote bet kurį iš trijų Pro plaginų tuo laikotarpiu — traktuokite savo svetainę kaip kompromituotą ir dirbkite remiantis šia prielaida, o ne viltimi, kad jūsų nepalietė.
