{"id":231,"date":"2026-08-09T10:43:01","date_gmt":"2026-08-09T08:43:01","guid":{"rendered":"https:\/\/helloblog.io\/fi\/bdthemes-api-toimitusketjuhyokkays\/"},"modified":"2026-08-09T10:43:01","modified_gmt":"2026-08-09T08:43:01","slug":"bdthemes-api-toimitusketjuhyokkays","status":"publish","type":"post","link":"https:\/\/helloblog.io\/fi\/bdthemes-api-toimitusketjuhyokkays\/","title":{"rendered":"BdThemesin API-hy\u00f6kk\u00e4ys: n\u00e4in tarkistat WordPress-sivustosi"},"content":{"rendered":"\n<p>BdThemesin lis\u00e4osien toimitusketjuhy\u00f6kk\u00e4ys ei muuttanut yht\u00e4k\u00e4\u00e4n tiedostoa WordPress.org:n SVN-repositoriossa. Hy\u00f6kk\u00e4\u00e4j\u00e4 myrkytti lis\u00e4osien hallintan\u00e4kym\u00e4ss\u00e4 hakeman JSON-sy\u00f6tteen, jolloin haittakoodi suoritettiin kirjautuneen yll\u00e4pit\u00e4j\u00e4n selaimessa jokaisella <code>wp-admin<\/code>-sivulatauksella. Se riitti luomaan v\u00e4\u00e4ri\u00e4 yll\u00e4pit\u00e4j\u00e4tunnuksia, asentamaan webshellin ja j\u00e4tt\u00e4m\u00e4\u00e4n sivustolle pysyvi\u00e4 takaportteja.<\/p>\n\n\n\n<p>Jos sivustollasi on yksikin t\u00e4ss\u00e4 artikkelissa luetelluista BdThemes-lis\u00e4osista, tarkista kompromissin indikaattorit v\u00e4litt\u00f6m\u00e4sti. Pelkk\u00e4 lis\u00e4osatiedostojen eheystarkistus ei riit\u00e4, koska hy\u00f6kk\u00e4ys toimi et\u00e4-API:n kautta eik\u00e4 vaatinut tiedostomuutoksia palvelimella.<\/p>\n\n\n\n<div class=\"wp-block-group callout callout-danger is-style-danger is-layout-flow wp-block-group-is-layout-flow\" style=\"border-width:1px;border-radius:8px;padding-top:1rem;padding-right:1.5rem;padding-bottom:1rem;padding-left:1.5rem\">\n\n<h4 class=\"wp-block-heading callout-title\">Toimi heti<\/h4>\n\n\n<p>Kaikki seitsem\u00e4n vaikutuksen piiriss\u00e4 olevaa lis\u00e4osaa suljettiin v\u00e4liaikaisesti WordPressin lis\u00e4osahakemistosta 7.8.2026 tarkistusta ja tutkintaa varten. Haavoittuvuus on luokiteltu korjaamattomaksi.<\/p>\n\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Mit\u00e4 hy\u00f6kk\u00e4yksess\u00e4 tapahtui?<\/h2>\n\n\n\n<p>Toimitusketjuhy\u00f6kk\u00e4ys tarkoittaa hy\u00f6kk\u00e4yst\u00e4 luotettuun ohjelmiston, p\u00e4ivityksen tai ulkoisen datan toimitusreittiin. T\u00e4ss\u00e4 tapauksessa kohteena oli BdThemesin <em>Biggopti<\/em>-komponentti, joka noutaa mainosbannereita toimittajan API:sta ja n\u00e4ytt\u00e4\u00e4 ne WordPressin hallintapaneelissa.<\/p>\n\n\n\n<p>API ei ollut dynaaminen sovelluspalvelin, vaan Cloudflaren suojaaman DigitalOcean Spaces -objektitallennuksen tarjoama staattinen JSON-tiedosto. Hy\u00f6kk\u00e4\u00e4j\u00e4 sai kirjoitusoikeuden tallennustilaan ja korvasi aidot JSON-vastaukset muokatuilla vastauksilla. T\u00e4m\u00e4 viittaa vakavaan murtoon BdThemesin pilvitallennuksen tunnuksissa tai sis\u00e4isess\u00e4 infrastruktuurissa.<\/p>\n\n\n\n<p>Hy\u00f6kk\u00e4ys hy\u00f6dynsi Biggoptin XSS-haavoittuvuutta. XSS eli cross-site scripting tarkoittaa, ett\u00e4 hy\u00f6kk\u00e4\u00e4j\u00e4 saa selaimen suorittamaan omaa JavaScripti\u00e4\u00e4n luotetulla sivustolla. Koska skripti suoritettiin valmiiksi kirjautuneen yll\u00e4pit\u00e4j\u00e4n istunnossa, sill\u00e4 oli yll\u00e4pit\u00e4j\u00e4n oikeuksien puitteissa p\u00e4\u00e4sy WordPressin toimintoihin.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Haavoittuvuus Biggopti-kirjastossa<\/h2>\n\n\n\n<p>Biggopti-kirjaston eri versioissa on <code>display_id<\/code>-kentt\u00e4\u00e4n liittyv\u00e4 XSS-haavoittuvuus Sigmative API:ssa. Sen CVSS-arvo on <strong>5,4 \/ 10 (keskitaso)<\/strong>, ja korjausta ei ollut saatavilla. Hy\u00f6kk\u00e4\u00e4j\u00e4, joka pystyy murtautumaan Sigmative API -palveluun, voi lis\u00e4t\u00e4 sivuille mielivaltaista JavaScripti\u00e4, joka suoritetaan, kun k\u00e4ytt\u00e4j\u00e4 avaa saastuneen sivun.<\/p>\n\n\n\n<p>Jokainen Biggoptia k\u00e4ytt\u00e4v\u00e4 BdThemes-lis\u00e4osa rekister\u00f6i client-side JavaScript -tiedoston <code>admin_init<\/code>-hookissa. Siksi selain lataa ja suorittaa skriptin ehdoitta jokaisella <code>wp-admin<\/code>-sivulla. Skripti noutaa bannerit API-endpointista ja kokoaa niiden HTML-rakenteen DOM:iin.<\/p>\n\n\n\n<p>Ongelma syntyy, kun koodi sijoittaa et\u00e4-JSON:n <code>display_id<\/code>-arvon suoraan HTML:n <code>id<\/code>-attribuuttiin ilman selaimessa teht\u00e4v\u00e4\u00e4 merkist\u00f6muunnosta. Haavoittuvan logiikan pelkistetty muoto on seuraava:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#24292e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/\/ display_id tulee et\u00e4isest\u00e4 JSON-vastauksesta eik\u00e4 sit\u00e4 muunnettu turvalliseksi.\nvar displayId = item.display_id || item.id || &quot;default&quot;;\nvar elementId = &quot;bdt-admin-biggopti-api-biggopti-&quot; + displayId;\nvar attributes = 'id=&quot;' + elementId + '&quot;';\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#6A737D\">\/\/ display_id tulee et\u00e4isest\u00e4 JSON-vastauksesta eik\u00e4 sit\u00e4 muunnettu turvalliseksi.<\/span><\/span>\n<span class=\"line\"><span style=\"color:#F97583\">var<\/span><span style=\"color:#E1E4E8\"> displayId <\/span><span style=\"color:#F97583\">=<\/span><span style=\"color:#E1E4E8\"> item.display_id <\/span><span style=\"color:#F97583\">||<\/span><span style=\"color:#E1E4E8\"> item.id <\/span><span style=\"color:#F97583\">||<\/span><span style=\"color:#9ECBFF\"> \"default\"<\/span><span style=\"color:#E1E4E8\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color:#F97583\">var<\/span><span style=\"color:#E1E4E8\"> elementId <\/span><span style=\"color:#F97583\">=<\/span><span style=\"color:#9ECBFF\"> \"bdt-admin-biggopti-api-biggopti-\"<\/span><span style=\"color:#F97583\"> +<\/span><span style=\"color:#E1E4E8\"> displayId;<\/span><\/span>\n<span class=\"line\"><span style=\"color:#F97583\">var<\/span><span style=\"color:#E1E4E8\"> attributes <\/span><span style=\"color:#F97583\">=<\/span><span style=\"color:#9ECBFF\"> 'id=\"'<\/span><span style=\"color:#F97583\"> +<\/span><span style=\"color:#E1E4E8\"> elementId <\/span><span style=\"color:#F97583\">+<\/span><span style=\"color:#9ECBFF\"> '\"'<\/span><span style=\"color:#E1E4E8\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Samassa koodissa <code>data-display-id<\/code>-attribuutti muunnettiin HTML-turvalliseen muotoon korvaamalla <code>&amp;<\/code>, <code>&lt;<\/code>, <code>&gt;<\/code>, ja lainausmerkit entiteeteill\u00e4. Rakenne oli tosin monimutkainen, todenn\u00e4k\u00f6isesti minifioinnin tai bundlauksen seurauksena. <code>id<\/code>-attribuutin kohdalla vastaava muunnos kuitenkin puuttui.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#24292e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>function escapeHtml(value) {\n  return (value || &quot;&quot;)\n    .replace(\/&amp;\/g, &quot;&amp;amp;&quot;)\n    .replace(\/&lt;\/g, &quot;&amp;lt;&quot;)\n    .replace(\/&gt;\/g, &quot;&amp;gt;&quot;)\n    .replace(\/&quot;\/g, &quot;&amp;quot;&quot;);\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#F97583\">function<\/span><span style=\"color:#B392F0\"> escapeHtml<\/span><span style=\"color:#E1E4E8\">(<\/span><span style=\"color:#FFAB70\">value<\/span><span style=\"color:#E1E4E8\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color:#F97583\">  return<\/span><span style=\"color:#E1E4E8\"> (value <\/span><span style=\"color:#F97583\">||<\/span><span style=\"color:#9ECBFF\"> \"\"<\/span><span style=\"color:#E1E4E8\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">    .<\/span><span style=\"color:#B392F0\">replace<\/span><span style=\"color:#E1E4E8\">(<\/span><span style=\"color:#9ECBFF\">\/<\/span><span style=\"color:#DBEDFF\">&#x26;<\/span><span style=\"color:#9ECBFF\">\/<\/span><span style=\"color:#F97583\">g<\/span><span style=\"color:#E1E4E8\">, <\/span><span style=\"color:#9ECBFF\">\"&#x26;amp;\"<\/span><span style=\"color:#E1E4E8\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">    .<\/span><span style=\"color:#B392F0\">replace<\/span><span style=\"color:#E1E4E8\">(<\/span><span style=\"color:#9ECBFF\">\/<\/span><span style=\"color:#DBEDFF\">&#x3C;<\/span><span style=\"color:#9ECBFF\">\/<\/span><span style=\"color:#F97583\">g<\/span><span style=\"color:#E1E4E8\">, <\/span><span style=\"color:#9ECBFF\">\"&#x26;lt;\"<\/span><span style=\"color:#E1E4E8\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">    .<\/span><span style=\"color:#B392F0\">replace<\/span><span style=\"color:#E1E4E8\">(<\/span><span style=\"color:#9ECBFF\">\/<\/span><span style=\"color:#DBEDFF\">><\/span><span style=\"color:#9ECBFF\">\/<\/span><span style=\"color:#F97583\">g<\/span><span style=\"color:#E1E4E8\">, <\/span><span style=\"color:#9ECBFF\">\"&#x26;gt;\"<\/span><span style=\"color:#E1E4E8\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">    .<\/span><span style=\"color:#B392F0\">replace<\/span><span style=\"color:#E1E4E8\">(<\/span><span style=\"color:#9ECBFF\">\/<\/span><span style=\"color:#DBEDFF\">\"<\/span><span style=\"color:#9ECBFF\">\/<\/span><span style=\"color:#F97583\">g<\/span><span style=\"color:#E1E4E8\">, <\/span><span style=\"color:#9ECBFF\">\"&#x26;quot;\"<\/span><span style=\"color:#E1E4E8\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>SVN-historia osoittaa, ett\u00e4 haavoittuva attribuutin lis\u00e4ys tuli Prime Sliderin (<code>bdthemes-prime-slider-lite<\/code>) versioon 4.1.9 1.3.2026, mink\u00e4 j\u00e4lkeen se p\u00e4\u00e4tyi muihin lis\u00e4osiin. My\u00f6hemmiss\u00e4 julkaisuissa bannerin <code>content<\/code>-kent\u00e4lle lis\u00e4ttiin DOMParser-pohjainen puhdistus, joka poistaa vaarallisia HTML-elementtej\u00e4 ja inline-event handlereita. Se ei kuitenkaan suojannut <code>id<\/code>-attribuuttia.<\/p>\n\n\n\n<p>Myrkytetty <code>display_id<\/code> katkaisi <code>id<\/code>-attribuutin ja lis\u00e4si <code>onanimationstart<\/code>-event handlerin. CSS-animaatio laukaisi sen noin 10 millisekunnissa, joten haittakoodi k\u00e4ynnistyi \u00e4\u00e4nett\u00f6m\u00e4sti, kun yll\u00e4pit\u00e4j\u00e4 avasi mink\u00e4 tahansa hallintapaneelin sivun. Saastuneessa API-vastauksessa oli esimerkiksi <code>SAFE&quot; onanimationstart=... style=animation:wrapperSlideInTop .01s ease-out both<\/code> -alkuinen <code>display_id<\/code>, jonka merkkikoodattu JavaScript nouti seuraavan vaiheen skriptin ulkoiselta palvelimelta.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Vaikutuksen piiriss\u00e4 olevat lis\u00e4osat<\/h2>\n\n\n\n<p>Seuraavat lis\u00e4osat k\u00e4yttiv\u00e4t haavoittuvaa Biggopti-komponenttia ja kuuluvat kompromissin piiriin:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><a href=\"https:\/\/www.wordfence.com\/threat-intel\/vulnerabilities\/wordpress-plugins\/bdthemes-element-pack-lite\">Element Pack Addons for Elementor<\/a> &#8211; <code>bdthemes-element-pack-lite<\/code><\/li>\n\n\n<li><a href=\"https:\/\/www.wordfence.com\/threat-intel\/vulnerabilities\/wordpress-plugins\/bdthemes-prime-slider-lite\">Prime Slider Addons for Elementor<\/a> &#8211; <code>bdthemes-prime-slider-lite<\/code><\/li>\n\n\n<li><a href=\"https:\/\/www.wordfence.com\/threat-intel\/vulnerabilities\/wordpress-plugins\/pixel-gallery\">Pixel Gallery Addons for Elementor<\/a> &#8211; <code>pixel-gallery<\/code><\/li>\n\n\n<li><a href=\"https:\/\/www.wordfence.com\/threat-intel\/vulnerabilities\/wordpress-plugins\/ultimate-post-kit\">Ultimate Post Kit Addons for Elementor<\/a> &#8211; <code>ultimate-post-kit<\/code><\/li>\n\n\n<li><a href=\"https:\/\/www.wordfence.com\/threat-intel\/vulnerabilities\/wordpress-plugins\/ultimate-store-kit\">Ultimate Store Kit &#8211; Addon For WooCommerce, EDD and Elementor<\/a> &#8211; <code>ultimate-store-kit<\/code><\/li>\n\n\n<li><a href=\"https:\/\/www.wordfence.com\/threat-intel\/vulnerabilities\/wordpress-plugins\/live-copy-paste\">Live Copy Paste for Elementor<\/a> &#8211; <code>live-copy-paste<\/code><\/li>\n\n\n<li><a href=\"https:\/\/www.wordfence.com\/threat-intel\/vulnerabilities\/wordpress-plugins\/smart-admin-assistant\">Smart Admin Assistant<\/a> &#8211; <code>smart-admin-assistant<\/code><\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Hy\u00f6kk\u00e4yksen kaksi toimituspolkua<\/h2>\n\n\n\n<p>Hy\u00f6kk\u00e4yksess\u00e4 k\u00e4ytettiin useaa vaihetta ja kahta eri payloadia. Ensisijainen <code>w2.js<\/code> toimitettiin lis\u00e4osille, jotka k\u00e4yttiv\u00e4t <code>api-data-all-records<\/code>-endpointia. Toissijainen <code>x.js<\/code> oli suoraan BdThemesin infrastruktuurissa ja toimitettiin lis\u00e4osille, jotka k\u00e4yttiv\u00e4t <code>api-data-records<\/code>-endpointia.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Ensisijainen payload: w2.js<\/h3>\n\n\n\n<p><code>w2.js<\/code> suoritettiin kirjautuneen yll\u00e4pit\u00e4j\u00e4n istunnossa. Se eteni seuraavasti:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n\n<li><strong>Varmisti C2-yhteyden.<\/strong> Skripti l\u00e4hetti kohdesivuston originin C2-palvelimelle <code>ia-cdn[.]com\/fz\/c<\/code> ja pyysi kohdistusohjeita. Jos vastaus oli <code>skip<\/code> tai <code>done<\/code>, skripti keskeytti toimintansa.<\/li>\n\n\n<li><strong>Loi v\u00e4\u00e4r\u00e4n yll\u00e4pit\u00e4j\u00e4tilin.<\/strong> Skripti k\u00e4ytti aktiivisesta istunnosta l\u00f6ytyv\u00e4\u00e4 <code>X-WP-Nonce<\/code>-arvoa ja loi yll\u00e4pit\u00e4j\u00e4n WordPress REST API:n kautta. Jos se ei onnistunut, skripti k\u00e4ytti tavallisia lomakepyynt\u00f6j\u00e4.<\/li>\n\n\n<li><strong>Asensi webshellin.<\/strong> Skripti latasi C2-palvelimelta v\u00e4\u00e4rennetyn lis\u00e4osan ZIP-paketin ja asensi sen WordPressin normaalin lis\u00e4osan latauslomakkeen kautta. Lis\u00e4osa naamioitiin esimerkiksi slugilla <code>wp-smart-thumbnails<\/code> tai muulla neutraalin kuuloisella slugilla. Paketissa oli URL-osoitteella suoraan kutsuttava <code>emer-run.php<\/code>-webshell.<\/li>\n\n\n<li><strong>Asensi MU-lis\u00e4osien takaportit.<\/strong> <code>emer-run.php<\/code> asensi kaksi pysyvyytt\u00e4 yll\u00e4pit\u00e4v\u00e4\u00e4 moduulia Must-Use plugins -hakemistoon. Tutkituissa n\u00e4ytteiss\u00e4 kummankin aikaleima oli muutettu syyskuuhun 2025, jotta tiedostot sulautuisivat normaaleihin tiedostoj\u00e4rjestelm\u00e4aikaleimoihin. Tiedostonimet voivat vaihtua tartuntojen v\u00e4lill\u00e4. Ensimm\u00e4inen moduuli mahdollisti todennuksettoman yll\u00e4pit\u00e4j\u00e4kirjautumisen URL-parametrilla <code>?_wplogin=&lt;token&gt;<\/code> ja kohdisti toiminnon sivuston pisimp\u00e4\u00e4n rekister\u00f6ityneeseen yll\u00e4pit\u00e4j\u00e4\u00e4n. Toinen moduuli piilotti luodut tilit yll\u00e4pidon k\u00e4ytt\u00e4j\u00e4listasta WordPressin tietokantakyselyihin kytkeytym\u00e4ll\u00e4 sek\u00e4 pienensi k\u00e4ytt\u00e4jien kokonaism\u00e4\u00e4r\u00e4\u00e4 vastaavasti.<\/li>\n\n\n<li><strong>Vuoti tulokset.<\/strong> Skripti l\u00e4hetti suoritusvaiheiden tulokset C2-palvelimelle <code>navigator.sendBeacon<\/code>-rajapinnalla.<\/li>\n\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Toissijainen payload: x.js<\/h3>\n\n\n\n<p><code>x.js<\/code> laski yll\u00e4pit\u00e4j\u00e4tunnuksen ja salasanan kohdesivuston hostname-arvosta. Se muodosti hostnimest\u00e4 32-bittisen hashin, muunsi sen base36-muotoon ja otti kuusi ensimm\u00e4ist\u00e4 merkki\u00e4. K\u00e4ytt\u00e4j\u00e4nimi oli <code>bd_<\/code> ja kuusimerkkinen hash, kun taas salasana oli <code>Bd@26!<\/code>, sama hash ja p\u00e4\u00e4te <code>x<\/code>. Tilille annettiin <code>@wordpress.org<\/code>-loppuinen s\u00e4hk\u00f6postiosoite.<\/p>\n\n\n\n<p>Tunnukset ovat deterministisi\u00e4 eli sama hostname tuottaa aina samat tunnukset. Hy\u00f6kk\u00e4\u00e4jien ei siksi tarvitse yll\u00e4pit\u00e4\u00e4 keskitetty\u00e4 listaa murretuista sivustoista. My\u00f6s incident response -tiimi voi laskea ep\u00e4illyn domainin tarkat tunnukset ja etsi\u00e4 niit\u00e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#24292e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/\/ Havainnollistaa tunnusten ennustettavuuden. \u00c4l\u00e4 k\u00e4yt\u00e4 t\u00e4t\u00e4 tuotantokoodissa.\nfunction makeCreds(host) {\n  let hash = 0;\n  for (let i = 0; i &lt; host.length; i++) {\n    hash = ((hash &lt;&lt; 5) - hash + host.charCodeAt(i)) | 0;\n  }\n  const suffix = Math.abs(hash).toString(36).slice(0, 6);\n  return { user: &quot;bd_&quot; + suffix, pass: &quot;Bd@26!&quot; + suffix + &quot;x&quot; };\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#6A737D\">\/\/ Havainnollistaa tunnusten ennustettavuuden. \u00c4l\u00e4 k\u00e4yt\u00e4 t\u00e4t\u00e4 tuotantokoodissa.<\/span><\/span>\n<span class=\"line\"><span style=\"color:#F97583\">function<\/span><span style=\"color:#B392F0\"> makeCreds<\/span><span style=\"color:#E1E4E8\">(<\/span><span style=\"color:#FFAB70\">host<\/span><span style=\"color:#E1E4E8\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color:#F97583\">  let<\/span><span style=\"color:#E1E4E8\"> hash <\/span><span style=\"color:#F97583\">=<\/span><span style=\"color:#79B8FF\"> 0<\/span><span style=\"color:#E1E4E8\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color:#F97583\">  for<\/span><span style=\"color:#E1E4E8\"> (<\/span><span style=\"color:#F97583\">let<\/span><span style=\"color:#E1E4E8\"> i <\/span><span style=\"color:#F97583\">=<\/span><span style=\"color:#79B8FF\"> 0<\/span><span style=\"color:#E1E4E8\">; i <\/span><span style=\"color:#F97583\">&#x3C;<\/span><span style=\"color:#E1E4E8\"> host.<\/span><span style=\"color:#79B8FF\">length<\/span><span style=\"color:#E1E4E8\">; i<\/span><span style=\"color:#F97583\">++<\/span><span style=\"color:#E1E4E8\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">    hash <\/span><span style=\"color:#F97583\">=<\/span><span style=\"color:#E1E4E8\"> ((hash <\/span><span style=\"color:#F97583\">&#x3C;&#x3C;<\/span><span style=\"color:#79B8FF\"> 5<\/span><span style=\"color:#E1E4E8\">) <\/span><span style=\"color:#F97583\">-<\/span><span style=\"color:#E1E4E8\"> hash <\/span><span style=\"color:#F97583\">+<\/span><span style=\"color:#E1E4E8\"> host.<\/span><span style=\"color:#B392F0\">charCodeAt<\/span><span style=\"color:#E1E4E8\">(i)) <\/span><span style=\"color:#F97583\">|<\/span><span style=\"color:#79B8FF\"> 0<\/span><span style=\"color:#E1E4E8\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">  }<\/span><\/span>\n<span class=\"line\"><span style=\"color:#F97583\">  const<\/span><span style=\"color:#79B8FF\"> suffix<\/span><span style=\"color:#F97583\"> =<\/span><span style=\"color:#E1E4E8\"> Math.<\/span><span style=\"color:#B392F0\">abs<\/span><span style=\"color:#E1E4E8\">(hash).<\/span><span style=\"color:#B392F0\">toString<\/span><span style=\"color:#E1E4E8\">(<\/span><span style=\"color:#79B8FF\">36<\/span><span style=\"color:#E1E4E8\">).<\/span><span style=\"color:#B392F0\">slice<\/span><span style=\"color:#E1E4E8\">(<\/span><span style=\"color:#79B8FF\">0<\/span><span style=\"color:#E1E4E8\">, <\/span><span style=\"color:#79B8FF\">6<\/span><span style=\"color:#E1E4E8\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color:#F97583\">  return<\/span><span style=\"color:#E1E4E8\"> { user: <\/span><span style=\"color:#9ECBFF\">\"bd_\"<\/span><span style=\"color:#F97583\"> +<\/span><span style=\"color:#E1E4E8\"> suffix, pass: <\/span><span style=\"color:#9ECBFF\">\"Bd@26!\"<\/span><span style=\"color:#F97583\"> +<\/span><span style=\"color:#E1E4E8\"> suffix <\/span><span style=\"color:#F97583\">+<\/span><span style=\"color:#9ECBFF\"> \"x\"<\/span><span style=\"color:#E1E4E8\"> };<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Skripti haki ensin <code>\/wp-admin\/user-new.php<\/code>-sivun, poimi sielt\u00e4 nonce-arvon ja logout-URL:n, ja l\u00e4hetti sitten lomakepyynn\u00f6n uuden k\u00e4ytt\u00e4j\u00e4n luomiseksi <code>administrator<\/code>-roolilla. Se ilmoitti C2-palvelimelle tilan, k\u00e4ytt\u00e4j\u00e4nimen, salasanan, sivuston originin, logout-URL:n ja nykyisen sivun URL:n. Ilmoitus k\u00e4ytti ensin <code>navigator.sendBeacon<\/code>-rajapintaa ja tarvittaessa <code>fetch<\/code>-pyynt\u00f6\u00e4 <code>no-cors<\/code>-tilassa. Selain tallensi onnistuneen yrityksen merkinn\u00e4n localStorageen, jos tallennustila oli k\u00e4ytett\u00e4viss\u00e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Kompromissin indikaattorit<\/h2>\n\n\n\n<p>Tarkista tiedostoj\u00e4rjestelm\u00e4, tietokanta ja k\u00e4ytt\u00e4j\u00e4tilit seuraavien indikaattorien varalta. Ulkoiset Sigmative-endpointit olivat puhdistuneet 8.8.2026 menness\u00e4, mutta aiempi sivustokompromissi voi j\u00e4\u00e4d\u00e4 palvelimelle API-vastausten puhdistamisesta huolimatta.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Ulkoiset palvelut<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Ensisijainen payload: <code>ia-cdn[.]com\/fz\/w2.js<\/code><\/li>\n\n\n<li>C2 beacon -endpoint: <code>ia-cdn[.]com\/fz\/c<\/code><\/li>\n\n\n<li>Myrkytetty API-endpoint, sittemmin puhdistettu: <code>api[.]sigmative[.]io\/prod\/store\/api\/biggopti\/api-data-all-records<\/code><\/li>\n\n\n<li>Myrkytetty API-endpoint, sittemmin puhdistettu: <code>api[.]sigmative[.]io\/prod\/store\/api\/biggopti\/api-data-records<\/code><\/li>\n\n\n<li>Toissijainen payload, sittemmin puhdistettu: <code>api[.]sigmative[.]io\/prod\/store\/api\/biggopti\/x.js<\/code><\/li>\n\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Tiedostot, tietokanta ja k\u00e4ytt\u00e4j\u00e4t<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Webshell: <code>emer-run.php<\/code>; MD5: <code>1024732009983dd5e54b4cf5593f04d4<\/code>.<\/li>\n\n\n<li>MU-lis\u00e4osan magic-login-takaportti: <code>class-wp-token-validate.php<\/code>; MD5: <code>7719cd98a35ffad2771f26d1ceab7d27<\/code>.<\/li>\n\n\n<li>MU-lis\u00e4osan piiloutumismoduuli: <code>class-wp-query-9d127ff3.php<\/code> tai vastaava <code>class-wp-query-*.php<\/code>; MD5: <code>9aadc3e5c5242b273bd17c5bdc358845<\/code>.<\/li>\n\n\n<li>MU-lis\u00e4osan health check -moduuli: <code>wp-cache-optimizer.php<\/code>; MD5: <code>e450ae5bc4bfc0d960dded06a76bb8e9<\/code>.<\/li>\n\n\n<li>Tietokantaoptio <code>fz_emer_login_tokens<\/code>, joka tallentaa magic-login-tokenit.<\/li>\n\n\n<li>Tietokantaoptio <code>fz_emer_done_v1<\/code>, joka merkitsee kompromissin valmistuneeksi.<\/li>\n\n\n<li>K\u00e4ytt\u00e4j\u00e4tilit, joiden s\u00e4hk\u00f6postiosoite p\u00e4\u00e4ttyy <code>@wordpress.org<\/code> tai <code>@developer.wordpress.org<\/code>.<\/li>\n\n\n<li>K\u00e4ytt\u00e4j\u00e4nimet, jotka vastaavat muotoa <code>bd_<\/code> ja kuusi aakkosnumeerista merkki\u00e4.<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Tarkistuslista ep\u00e4illylle sivustolle<\/h2>\n\n\n\n<p>Aloita tarkistus ennen kuin luotat siihen, ett\u00e4 lis\u00e4osan poistaminen tai API-vastauksen puhdistuminen ratkaisee tilanteen. Hy\u00f6kk\u00e4ys saattoi luoda pysyvi\u00e4 yll\u00e4pit\u00e4j\u00e4tunnuksia ja MU-lis\u00e4osia, jotka j\u00e4\u00e4v\u00e4t k\u00e4ytt\u00f6\u00f6n alkuper\u00e4isen lis\u00e4osan j\u00e4lkeenkin.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n\n<li>Selvit\u00e4, onko sivustolla nyt tai aiemmin ollut jokin seitsem\u00e4st\u00e4 vaikutuksen piiriss\u00e4 olevasta BdThemes-lis\u00e4osasta.<\/li>\n\n\n<li>Tarkista WordPressin k\u00e4ytt\u00e4j\u00e4lista ja tietokanta ep\u00e4ilytt\u00e4vien <code>bd_<\/code>-alkuisten tunnusten sek\u00e4 <code>@wordpress.org<\/code>&#8211; ja <code>@developer.wordpress.org<\/code>-osoitteiden varalta. Huomaa, ett\u00e4 piiloutumismoduuli voi peitt\u00e4\u00e4 tilit hallintan\u00e4kym\u00e4st\u00e4 ja muuttaa k\u00e4ytt\u00e4jien kokonaism\u00e4\u00e4r\u00e4\u00e4.<\/li>\n\n\n<li>Tarkista lis\u00e4osahakemisto, Must-Use plugins -hakemisto sek\u00e4 palvelimen muut tiedostot <code>emer-run.php<\/code>-, <code>class-wp-token-validate.php<\/code>-, <code>class-wp-query-*.php<\/code>&#8211; ja <code>wp-cache-optimizer.php<\/code>-tiedostojen varalta. Vertaile l\u00f6yd\u00f6sten MD5-tiivisteit\u00e4 annettuihin arvoihin.<\/li>\n\n\n<li>Etsi tietokannan optiotaulusta arvot <code>fz_emer_login_tokens<\/code> ja <code>fz_emer_done_v1<\/code>.<\/li>\n\n\n<li>Tarkista palvelin-, DNS-, proxy- ja sovelluslokit yhteyksien varalta domaineihin <code>ia-cdn[.]com<\/code> ja <code>api[.]sigmative[.]io<\/code> sek\u00e4 edell\u00e4 lueteltuihin polkuihin.<\/li>\n\n\n<li>Vaihda yll\u00e4pit\u00e4j\u00e4tilien salasanat ja istunnot, jos l\u00f6yd\u00e4t indikaattoreita. Tutki sivusto incident response -prosessissa, koska hy\u00f6kk\u00e4\u00e4j\u00e4 on voinut saada et\u00e4koodin suoritusmahdollisuuden.<\/li>\n\n\n<li>Ota k\u00e4ytt\u00f6\u00f6n korjattu versio vasta, kun sellainen on saatavilla ja lis\u00e4osa on j\u00e4lleen tarkistettuna saatavilla. \u00c4l\u00e4 oleta tiedostopohjaisen eheystarkistuksen yksin havaitsevan t\u00e4t\u00e4 hy\u00f6kk\u00e4yst\u00e4.<\/li>\n\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Aikajana<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><strong>1.3.2026:<\/strong> Biggoptin API-JavaScript lis\u00e4ttiin Prime Sliderin versioon 4.1.9 SVN-revisiossa <code>r3471891<\/code>. <code>display_id<\/code> sijoitettiin ilman merkist\u00f6muunnosta <code>id<\/code>-attribuuttiin, ja k\u00e4yt\u00f6ss\u00e4 oli <code>api-data-records<\/code>-endpoint.<\/li>\n\n\n<li><strong>10.5.2026:<\/strong> Endpoint vaihtui muotoon <code>api-data-all-records<\/code>. <code>content<\/code>-kent\u00e4lle lis\u00e4ttiin DOMParser-puhdistus, mutta <code>id<\/code>-attribuutti j\u00e4i haavoittuvaksi.<\/li>\n\n\n<li><strong>23.6.2026:<\/strong> Myrkytetyn API-kampanjan <code>start_date<\/code>-arvo oli Summer Sale -ilmoituksessa. T\u00e4m\u00e4 on aikaisin mahdollinen p\u00e4iv\u00e4, jolloin XSS on voinut olla aktiivinen.<\/li>\n\n\n<li><strong>6.8.2026 klo 22.40 UTC:<\/strong> Myrkytetyn <code>api-data-records<\/code>-vastauksen Last-Modified-aika.<\/li>\n\n\n<li><strong>7.8.2026 klo 09.11 UTC:<\/strong> Myrkytetyn <code>api-data-all-records<\/code>-vastauksen Last-Modified-aika.<\/li>\n\n\n<li><strong>7.8.2026:<\/strong> Hy\u00f6kk\u00e4ys havaittiin k\u00e4yt\u00e4nn\u00f6ss\u00e4, ja tietoturvatiimi sai ilmoituksen siit\u00e4.<\/li>\n\n\n<li><strong>7.8.2026:<\/strong> Vaikutuksen piiriss\u00e4 olevat lis\u00e4osat suljettiin WordPressin lis\u00e4osahakemistosta tarkistusta varten.<\/li>\n\n\n<li><strong>7.8.2026 klo 16.56 UTC:<\/strong> Tutkinnan artefaktit tallennettiin.<\/li>\n\n\n<li><strong>8.8.2026:<\/strong> Molemmat API-endpointit palauttivat j\u00e4lleen puhdasta JSON-dataa.<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Miksi t\u00e4m\u00e4 hy\u00f6kk\u00e4ys on poikkeuksellinen?<\/h2>\n\n\n\n<p>Hy\u00f6kk\u00e4\u00e4j\u00e4t eiv\u00e4t tarvinneet p\u00e4\u00e4sy\u00e4 yksitt\u00e4isille WordPress-sivustoille eiv\u00e4tk\u00e4 muuttaneet lis\u00e4osien source codea. He muuttivat toimittajan luotettuna pidetyn et\u00e4datan, ja puutteellinen render\u00f6intikoodi teki mainosbannerista haittaohjelman toimituskanavan.<\/p>\n\n\n\n<p>Tiedostopohjainen integrity scanner ei n\u00e4e hy\u00f6kk\u00e4yst\u00e4 silloin, kun lis\u00e4osatiedostot s\u00e4ilyv\u00e4t muuttumattomina. My\u00f6s WAF voi havaita tilanteen heikosti, koska haitallinen JavaScript tulee selaimeen luotetun toimittaja-API:n vastauksena ja toimii jo todennetun yll\u00e4pit\u00e4j\u00e4n selaimessa. Hy\u00f6kk\u00e4yksen ensisijainen tavoite oli laajamittainen, huomaamaton yll\u00e4pit\u00e4j\u00e4pysyvyys ja et\u00e4koodin suoritus WordPress-ymp\u00e4rist\u00f6iss\u00e4.<\/p>\n\n\n\n<p>Wordfence Premium-, Care- ja Response-asiakkaat sek\u00e4 maksullisen Wordfence CLI:n asiakkaat saivat hy\u00f6kk\u00e4yksen tunnistavat haittaohjelmatunnisteet ja WAF-s\u00e4\u00e4nn\u00f6t 7.8.2026. Maksuttomat Wordfence- ja Wordfence CLI -k\u00e4ytt\u00e4j\u00e4t saavat samat tunnisteet ja s\u00e4\u00e4nn\u00f6t normaalin 30 p\u00e4iv\u00e4n viiveen j\u00e4lkeen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Seuraava toimenpide<\/h2>\n\n\n\n<p>Tee ensin indikaattoritarkistus kaikille sivustoille, joilla k\u00e4yt\u00e4t tai olet k\u00e4ytt\u00e4nyt kyseisi\u00e4 BdThemes-lis\u00e4osia. Jos l\u00f6yd\u00e4t yksikin ep\u00e4ilytt\u00e4v\u00e4n tilin, MU-lis\u00e4osan, tietokantaoption tai C2-yhteyden, k\u00e4sittele sivusto kokonaan kompromettoituneena: erist\u00e4 se, s\u00e4ilyt\u00e4 lokit ja artefaktit tutkintaa varten sek\u00e4 poista hy\u00f6kk\u00e4\u00e4j\u00e4n pysyvyys ennen palautusta.<\/p>\n\n\n<div class=\"references-section\">\n                <h2>Viitteet \/ L\u00e4hteet<\/h2>\n                <ul class=\"references-list\"><li><a href=\"https:\/\/www.wordfence.com\/blog\/2026\/08\/psa-supply-chain-compromise-in-bdthemes-ecosystem-via-poisoned-api-response\/\" target=\"_blank\" rel=\"noopener noreferrer\">PSA: Supply Chain Compromise in BdThemes Ecosystem via Poisoned API Response<\/a><\/li><li><a href=\"https:\/\/www.wordfence.com\/blog\/2026\/07\/wordfence-prism-detected-backdoored-wordpress-plugin-within-two-hours-of-it-being-introduced\/\" target=\"_blank\" rel=\"noopener noreferrer\">Advanced Responsive Video Embedder: Wordfence Prism Detected Backdoored WordPress Plugin Within Two Hours of it Being Introduced<\/a><\/li><li><a href=\"https:\/\/optinmonster.com\/security-incident-tampered-script-served-via-optinmonster-and-trustpulse\/#what-to-check-and-do\" target=\"_blank\" rel=\"noopener noreferrer\">Security Incident: Tampered Script Served via OptinMonster and TrustPulse<\/a><\/li><\/ul>\n            <\/div>","protected":false},"excerpt":{"rendered":"<p>BdThemes-lis\u00e4osien hy\u00f6kk\u00e4ys tuli et\u00e4isest\u00e4 JSON-mainosvirrasta, ei WordPress.org:n lis\u00e4osatiedostoista. Tarkista sivustosi v\u00e4\u00e4rien yll\u00e4pit\u00e4jien, MU-lis\u00e4osien ja tietokantaindikaattorien varalta.<\/p>\n","protected":false},"author":2,"featured_media":230,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9],"tags":[144,33,143,10,135],"class_list":["post-231","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tietoturva","tag-lisaosat","tag-tietoturva","tag-toimitusketjuhyokkays","tag-wordpress","tag-xss"],"_links":{"self":[{"href":"https:\/\/helloblog.io\/fi\/wp-json\/wp\/v2\/posts\/231","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/helloblog.io\/fi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/helloblog.io\/fi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/helloblog.io\/fi\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/helloblog.io\/fi\/wp-json\/wp\/v2\/comments?post=231"}],"version-history":[{"count":0,"href":"https:\/\/helloblog.io\/fi\/wp-json\/wp\/v2\/posts\/231\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/helloblog.io\/fi\/wp-json\/wp\/v2\/media\/230"}],"wp:attachment":[{"href":"https:\/\/helloblog.io\/fi\/wp-json\/wp\/v2\/media?parent=231"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/helloblog.io\/fi\/wp-json\/wp\/v2\/categories?post=231"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/helloblog.io\/fi\/wp-json\/wp\/v2\/tags?post=231"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}