{"id":95,"date":"2026-01-13T00:00:00","date_gmt":"2026-01-12T23:00:00","guid":{"rendered":"https:\/\/helloblog.io\/fi\/wordpress-haittaohjelma-kohdistaa-sisallon-googlebotille-asn-cidr-tarkistus\/"},"modified":"2026-01-20T06:33:15","modified_gmt":"2026-01-20T05:33:15","slug":"wordpress-haittaohjelma-kohdistaa-sisallon-googlebotille-asn-cidr-tarkistus","status":"publish","type":"post","link":"https:\/\/helloblog.io\/fi\/wordpress-haittaohjelma-kohdistaa-sisallon-googlebotille-asn-cidr-tarkistus\/","title":{"rendered":"WordPress-haittaohjelma kohdistaa sis\u00e4ll\u00f6n Googlebotille: User-Agent ei en\u00e4\u00e4 riit\u00e4, mukaan tulee ASN- ja CIDR-tarkistus"},"content":{"rendered":"\n<p>WordPressin haittaohjelmissa on pitk\u00e4\u00e4n n\u00e4hty yksinkertaisia uudelleenohjauksia ja n\u00e4kyvi\u00e4 roskasivuja. Nyt trendi on selv\u00e4sti hienovaraisempi: hy\u00f6kk\u00e4\u00e4j\u00e4 tekee sivustosta portinvartijan, joka p\u00e4\u00e4tt\u00e4\u00e4 vierailijan perusteella, mit\u00e4 sis\u00e4lt\u00f6\u00e4 palautetaan. Tavalliselle k\u00e4ytt\u00e4j\u00e4lle kaikki n\u00e4ytt\u00e4\u00e4 siistilt\u00e4 \u2014 mutta hakukoneen indeksoijalle (crawler) sy\u00f6tet\u00e4\u00e4n aivan eri payload.<\/p>\n\n\n\n<p>Sucurin tapauskuvauksessa vastaan tuli poikkeuksellisen \u201chuolellinen\u201d cloaking (sis\u00e4ll\u00f6n peitt\u00e4minen): botin tunnistus ei perustu pelkk\u00e4\u00e4n <code>User-Agent<\/code>-headeriin, vaan liikenne varmistetaan Googlen oman IP-infrastruktuurin kautta. T\u00e4m\u00e4 tekee hy\u00f6kk\u00e4yksest\u00e4 vaikean havaita k\u00e4sin selailemalla tai peruscheckeill\u00e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Mit\u00e4 t\u00e4ss\u00e4 l\u00f6yd\u00f6ksess\u00e4 oli pieless\u00e4?<\/h2>\n\n\n\n<p>Tutkittu infektio oli tehty WordPress-sivuston juureen, p\u00e4\u00e4asialliseen <code>index.php<\/code>-tiedostoon. Idea oli yksinkertainen mutta tehokas: <code>index.php<\/code> ei aina k\u00e4ynnist\u00e4 WordPressi\u00e4 normaalisti, vaan tarkistaa ensin, kuka on tulossa sis\u00e4\u00e4n.<\/p>\n\n\n\n<p>Jos tulija n\u00e4ytt\u00e4\u00e4 \u201coikealta\u201d Googlelta, sivu hakee ulkopuolista sis\u00e4lt\u00f6\u00e4 ja tulostaa sen suoraan vastaukseen. Jos tulija on tavallinen k\u00e4ytt\u00e4j\u00e4 (tai botti, joka yritt\u00e4\u00e4 esitt\u00e4\u00e4 Googlebotia), k\u00e4vij\u00e4 ohjataan tai p\u00e4\u00e4tyy normaaliin, puhtaaseen sivuun.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Miksi t\u00e4m\u00e4 on kehitt\u00e4j\u00e4lle kiinnostava (ja ik\u00e4v\u00e4) muutos?<\/h2>\n\n\n\n<p>Moni cloaking-skripti tekee vain t\u00e4m\u00e4n: <code>if (strpos($_SERVER['HTTP_USER_AGENT'], 'Googlebot') !== false) { ... }<\/code>. Se on helppo kiert\u00e4\u00e4 ja my\u00f6s helppo l\u00f6yt\u00e4\u00e4.<\/p>\n\n\n\n<p>T\u00e4ss\u00e4 kampanjassa haittakoodi sis\u00e4lsi suuren, kovakoodatun listan Googlen ASN:\u00e4\u00e4n (Autonomous System Number) liittyvist\u00e4 IP-alueista CIDR-muodossa ja tarkisti k\u00e4vij\u00e4n IP:n matemaattisesti (bitwise-operaatioilla). Lis\u00e4ksi mukana oli IPv6-tuki, joka puuttuu monista vanhemmista toteutuksista.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">ASN ja CIDR p\u00e4hkin\u00e4nkuoressa<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><strong>ASN (Autonomous System Number)<\/strong>: k\u00e4yt\u00e4nn\u00f6ss\u00e4 organisaation \u201cverkkoidentiteetti\u201d internetiss\u00e4. Kun liikenne tulee Googlen ASN:n IP-alueilta, se on todenn\u00e4k\u00f6isemmin oikeasti Googlen infrastruktuuria eik\u00e4 pelkk\u00e4 feikki User-Agent.<\/li>\n\n\n<li><strong>CIDR<\/strong>: tiivis tapa kuvata IP-osoiteblokkeja (esim. <code>192.168.1.0\/24<\/code>). Suffixi <code>\/24<\/code> kertoo verkon koon ja rajaa osoiteavaruuden.<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Mit\u00e4 haittaohjelma k\u00e4yt\u00e4nn\u00f6ss\u00e4 tekee sivustolle?<\/h2>\n\n\n\n<p>T\u00e4m\u00e4n infektion \u201cp\u00e4\u00e4vahinko\u201d kohdistuu n\u00e4kyvyyteen ja hakukonemaineriskiin. Koska Google n\u00e4kee eri sis\u00e4ll\u00f6n kuin k\u00e4ytt\u00e4j\u00e4, seurausketju voi olla ruma: indeksiin ilmestyy roskasivuja, sivuston luottamus heikkenee, hakutulokset voivat muuttua, ja pahimmillaan seurauksena on deindeksointi tai jonkinlainen blacklistaus.<\/p>\n\n\n\n<p>Lis\u00e4ongelma on viive: koska omistaja selaa sivustoa normaalina k\u00e4ytt\u00e4j\u00e4n\u00e4, h\u00e4n ei v\u00e4ltt\u00e4m\u00e4tt\u00e4 n\u00e4e mit\u00e4\u00e4n poikkeavaa. Ongelma huomataan vasta Search Consolesta, SERP:ist\u00e4 tai ulkopuolisesta h\u00e4lytyksest\u00e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Tyypilliset varoitusmerkit (joita kannattaa oikeasti katsoa)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Hakutuloksissa n\u00e4kyy outoja otsikoita\/kuvauksia tai sivuja, joita et tunnista<\/li>\n\n\n<li>Ydintiedostoissa (erityisesti <code>index.php<\/code>) on \u00e4killisi\u00e4 muutoksia tai ep\u00e4selvi\u00e4 lis\u00e4yksi\u00e4<\/li>\n\n\n<li>Lokissa n\u00e4kyy ep\u00e4ilytt\u00e4vi\u00e4 pyynt\u00f6j\u00e4 tai uudelleenohjauksia, joita et ole konffannut<\/li>\n\n\n<li>Sivustolta l\u00f6ytyy kutsuja ulkoisiin URL-osoitteisiin, joita koodipohjassa ei pit\u00e4isi olla<\/li>\n\n<\/ul>\n\n\n\n<p>Tapauksessa et\u00e4sis\u00e4lt\u00f6\u00e4 haettiin domainista <code>amp-samaresmanor[.]pages[.]dev<\/code> (kirjoitan sen tarkoituksella \u201crikottuna\u201d). Sucurin mukaan URL oli analyysihetkell\u00e4 VirusTotalissa useamman toimijan blocklistalla, ja samaa endpointia l\u00f6ytyi k\u00e4yt\u00f6ss\u00e4 useammalta infektoidulta sivustolta.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Miten hy\u00f6kk\u00e4ys oli rakennettu: portinvartija <code>index.php<\/code>:ss\u00e4<\/h2>\n\n\n\n<p>Alla on konseptitasolla se logiikka, jonka vuoksi t\u00e4m\u00e4 hy\u00f6kk\u00e4ys on hankala havaita. En ole kiinnostunut kopioimaan haittakoodia, vaan siit\u00e4, mit\u00e4 komponentteja se k\u00e4ytt\u00e4\u00e4 ja miksi.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1) Monikerroksinen tunnistus: ensin User-Agent, sitten IP-varmennus<\/h3>\n\n\n\n<p>Ensimm\u00e4inen suodatin on <code>HTTP_USER_AGENT<\/code>. Mutta koska User-Agent on helppo v\u00e4\u00e4rent\u00e4\u00e4, t\u00e4m\u00e4 on vain \u201cesisuodatin\u201d: sen j\u00e4lkeen tehd\u00e4\u00e4n varsinainen varmistus IP-osoitteesta.<\/p>\n\n\n\n<p>T\u00e4ss\u00e4 tapauksessa User-Agent-suodatus ei rajoittunut pelkk\u00e4\u00e4n <code>Googlebot<\/code>-merkkijonoon, vaan mukana oli my\u00f6s muita Googlen ty\u00f6kaluja ja crawler-tyyppisi\u00e4 tunnisteita, jotta roskasis\u00e4lt\u00f6 p\u00e4\u00e4tyisi indeksoiduksi ja \u201cn\u00e4kyisi\u201d Googlen eri prosesseille.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2) CIDR-alueen tarkistus bitwise-operaatioilla (IPv4)<\/h3>\n\n\n\n<p>Tunnistuksen ydin on IP-osoitteen sovittaminen CIDR-verkkoon matemaattisesti, ei merkkijonoja vertailemalla. IPv4:ss\u00e4 t\u00e4m\u00e4 tehd\u00e4\u00e4n tyypillisesti muuttamalla IP ja verkko desimaalimuotoon ja vertaamalla maskattuja arvoja. Sucurin esimerkiss\u00e4 logiikka on t\u00e4t\u00e4 tyyppi\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>\/\/ Konsepti: tarkistetaan, kuuluuko IP CIDR-verkkoon\n\/\/ (ip &amp; netmask) == (range &amp; netmask)\n\n$isMatch = (\n    ($ip_decimal &amp; $netmask_decimal) === ($range_decimal &amp; $netmask_decimal)\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\">\/\/ Konsepti: tarkistetaan, kuuluuko IP CIDR-verkkoon<\/span><\/span>\n<span class=\"line\"><span style=\"color:#6A737D\">\/\/ (ip &#x26; netmask) == (range &#x26; netmask)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">$isMatch <\/span><span style=\"color:#F97583\">=<\/span><span style=\"color:#E1E4E8\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">    ($ip_decimal <\/span><span style=\"color:#F97583\">&#x26;<\/span><span style=\"color:#E1E4E8\"> $netmask_decimal) <\/span><span style=\"color:#F97583\">===<\/span><span style=\"color:#E1E4E8\"> ($range_decimal <\/span><span style=\"color:#F97583\">&#x26;<\/span><span style=\"color:#E1E4E8\"> $netmask_decimal)<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">);<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Keskeinen pointti: hy\u00f6kk\u00e4\u00e4j\u00e4 ei luota siihen, ett\u00e4 \u201cn\u00e4ytt\u00e4\u00e4 Googlelta\u201d, vaan siihen ett\u00e4 tulee Googlen IP-avaruudesta (ASN\/CIDR). Lis\u00e4ksi IPv6 huomioitiin, mik\u00e4 nostaa hy\u00f6kk\u00e4yksen onnistumisprosenttia nykyverkossa.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3) Et\u00e4-payload sis\u00e4\u00e4n cURLilla ja tulostus suoraan vastaukseen<\/h3>\n\n\n\n<p>Kun k\u00e4vij\u00e4 on varmennettu aidoksi botiksi, haittakoodi hakee ulkoisesta palvelusta sis\u00e4ll\u00f6n (payload) cURLilla ja <code>echo<\/code>-tyyppisesti tulostaa sen sivulle. Hakukoneen n\u00e4k\u00f6kulmasta n\u00e4ytt\u00e4\u00e4 silt\u00e4, ett\u00e4 sivusto itse hostaa sis\u00e4ll\u00f6n.<\/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>\/\/ Konsepti: hae et\u00e4sis\u00e4lt\u00f6 ja tulosta se botille\n\/\/ (URL j\u00e4tetty t\u00e4ss\u00e4 tarkoituksella esimerkkitasolle)\n\n$remote = 'hxxps:\/\/amp-samaresmanor[.]pages[.]dev';\n\n\/\/ cURL:lla haetaan sis\u00e4lt\u00f6 ja tulostetaan se vastaukseen\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\">\/\/ Konsepti: hae et\u00e4sis\u00e4lt\u00f6 ja tulosta se botille<\/span><\/span>\n<span class=\"line\"><span style=\"color:#6A737D\">\/\/ (URL j\u00e4tetty t\u00e4ss\u00e4 tarkoituksella esimerkkitasolle)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">$remote <\/span><span style=\"color:#F97583\">=<\/span><span style=\"color:#9ECBFF\"> 'hxxps:\/\/amp-samaresmanor[.]pages[.]dev'<\/span><span style=\"color:#E1E4E8\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color:#6A737D\">\/\/ cURL:lla haetaan sis\u00e4lt\u00f6 ja tulostetaan se vastaukseen<\/span><\/span>\n<span class=\"line\"><span style=\"color:#6A737D\">\/\/ ...<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">4) Ehdollinen logiikka + lokitus: \u201connistumisen\u201d seuranta<\/h3>\n\n\n\n<p>T\u00e4m\u00e4n kampanjan ik\u00e4vin piirre oli p\u00e4\u00e4t\u00f6ksenteko ja virheenk\u00e4sittely. Haittaohjelma ei vain palvele sis\u00e4lt\u00f6\u00e4, vaan my\u00f6s ohjaa tilanteissa, joissa jokin menee pieleen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Jos botin User-Agent ja IP t\u00e4sm\u00e4\u00e4v\u00e4t: palvellaan et\u00e4payload ja kirjataan onnistuminen; jos haku ep\u00e4onnistuu, botti ohjataan esim. <code>\/home\/<\/code>-polkuun, ettei Google n\u00e4e rikkin\u00e4ist\u00e4 sivua.<\/li>\n\n\n<li>Jos User-Agent v\u00e4itt\u00e4\u00e4 olevansa Google, mutta IP ei t\u00e4sm\u00e4\u00e4: kirjataan \u201cFake GoogleBot detected\u201d -tyyppinen tapahtuma ja ohjataan normaaliin etusivuun.<\/li>\n\n\n<li>Kaikki muut: ohjataan suoraan normaaliin sis\u00e4lt\u00f6\u00f6n.<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Miksi juuri WordPressin ydintiedostot ovat t\u00e4ss\u00e4 hy\u00f6kk\u00e4yksess\u00e4 avainasemassa?<\/h2>\n\n\n\n<p>Kun muutos tehd\u00e4\u00e4n <code>index.php<\/code>:hen, hy\u00f6kk\u00e4\u00e4j\u00e4 p\u00e4\u00e4see kiinni kaikkeen liikenteeseen heti sis\u00e4\u00e4ntulossa. Sucurin kuvauksen mukaan haittakoodi hy\u00f6dynsi my\u00f6s WordPressin ydintiedostoja pit\u00e4\u00e4kseen sivuston \u201ctoimivana\u201d omistajalle:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><code>wp-load.php<\/code>: t\u00e4m\u00e4n lataaminen bootstrappaa WordPress-ymp\u00e4rist\u00f6n (asetukset, tietokantayhteys ym.), mik\u00e4 helpottaa hy\u00f6kk\u00e4\u00e4j\u00e4\u00e4 rakentamaan logiikkaa tutun WP-runtime:n p\u00e4\u00e4lle.<\/li>\n\n\n<li><code>wp-blog-header.php<\/code>: normaali <code>index.php<\/code> p\u00e4\u00e4tyy lopulta t\u00e4h\u00e4n. Haittakoodi voi tehd\u00e4 tarkistuksensa ennen normaalia WP-ketjua ja antaa \u201cpuhtaan\u201d polun jatkua tavallisille k\u00e4ytt\u00e4jille.<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Korjaus ja torjunta: mit\u00e4 tekisin ensimm\u00e4isen\u00e4 tuotantoymp\u00e4rist\u00f6ss\u00e4?<\/h2>\n\n\n\n<p>Jos ep\u00e4ilet vastaavaa, t\u00e4rkeint\u00e4 on katkaista hy\u00f6kk\u00e4\u00e4j\u00e4n kontrolli ja palauttaa luotettava koodipohja. Sucurin suositukset ovat k\u00e4yt\u00e4nn\u00f6nl\u00e4heiset ja sopivat hyvin incident response -checklistiksi:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n\n<li>Poista tuntemattomat tiedostot ja hakemistot (erityisesti juuresta ja <code>wp-includes<\/code>\/<code>wp-admin<\/code>-alueilta).<\/li>\n\n\n<li>Auditoin k\u00e4ytt\u00e4j\u00e4t: poista apu-\/huoltotilit ja ep\u00e4ilytt\u00e4v\u00e4t adminit.<\/li>\n\n\n<li>Nollaa tunnukset: WP-admin, FTP\/SFTP, hosting-paneeli ja tietokanta.<\/li>\n\n\n<li>Skannaa oma ty\u00f6asema (haitta voi olla my\u00f6s kehitt\u00e4j\u00e4n koneessa varastettujen tunnusten kautta).<\/li>\n\n\n<li>P\u00e4ivit\u00e4 kaikki: WordPress core, teemat, lis\u00e4osat.<\/li>\n\n\n<li>Ota k\u00e4ytt\u00f6\u00f6n WAF (Web Application Firewall): se voi est\u00e4\u00e4 yhteyksi\u00e4 tunnettuun C2-\/payload-infraan ja my\u00f6s vaikeuttaa alkuper\u00e4ist\u00e4 uploadia\/eksploitointia.<\/li>\n\n<\/ol>\n\n\n\n<div class=\"wp-block-group callout callout-warning is-style-warning 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\">Erityinen huomio: file integrity<\/h4>\n\n\n<p>T\u00e4ss\u00e4 hy\u00f6kk\u00e4yksess\u00e4 \u201cpaha\u201d asuu ydintiedostossa (<code>index.php<\/code>), ei v\u00e4ltt\u00e4m\u00e4tt\u00e4 pluginissa. Siksi File Integrity Monitoring (tiedostojen eheyden valvonta) on k\u00e4yt\u00e4nn\u00f6ss\u00e4 paras tapa huomata muutos nopeasti.<\/p>\n\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Yhteenveto: hiljainen SEO-kaappaus on uusi normaali<\/h2>\n\n\n\n<p>T\u00e4m\u00e4 tapaus on hyv\u00e4 muistutus siit\u00e4, ett\u00e4 moderni WordPress-haittaohjelma ei aina yrit\u00e4 huijata ihmist\u00e4 \u2014 se yritt\u00e4\u00e4 huijata hakukonetta. Kun tunnistus tehd\u00e4\u00e4n ASN\/CIDR-IP-alueiden avulla ja payload tarjoillaan vain aidoille indeksoijille, manuaalinen \u201cn\u00e4ytt\u00e4\u00e4k\u00f6 sivu oudolta\u201d -tarkistus ei riit\u00e4.<\/p>\n\n\n\n<p>K\u00e4yt\u00e4nn\u00f6n puolustus on yhdistelm\u00e4: ydintiedostojen eheyden seuranta, s\u00e4\u00e4nn\u00f6llinen k\u00e4ytt\u00e4j\u00e4- ja lis\u00e4osauditointi, sek\u00e4 n\u00e4kyvyyden tarkkailu (erityisesti Google Search Console) silt\u00e4 varalta, ett\u00e4 indeksiin ilmestyy sivuja, joita et ole koskaan julkaissut.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1360\" height=\"636\" src=\"https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/IP-Verified-Conditional-Logic.png\" alt=\"Kaavio IP-varmennetusta ehdollisesta logiikasta, jossa botti tunnistetaan ja sille n\u00e4ytet\u00e4\u00e4n eri sis\u00e4lt\u00f6 kuin k\u00e4ytt\u00e4j\u00e4lle\" class=\"wp-image-87\" srcset=\"https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/IP-Verified-Conditional-Logic.png 1360w, https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/IP-Verified-Conditional-Logic-300x140.png 300w, https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/IP-Verified-Conditional-Logic-1024x479.png 1024w, https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/IP-Verified-Conditional-Logic-768x359.png 768w, https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/IP-Verified-Conditional-Logic-400x187.png 400w\" sizes=\"auto, (max-width: 1360px) 100vw, 1360px\" \/><figcaption class=\"wp-element-caption\">Hy\u00f6kk\u00e4yslogiikka: tunnista botti, varmista IP-alue, palvele et\u00e4payload. \u2014 <em>Forr\u00e1s: Sucuri Blog<\/em><\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1270\" height=\"936\" src=\"https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/What-Google-sees.png\" alt=\"Esimerkki siit\u00e4, miten Google n\u00e4kee roskasis\u00e4lt\u00f6\u00e4 samalla kun k\u00e4ytt\u00e4j\u00e4 n\u00e4kee normaalin sivun\" class=\"wp-image-88\" srcset=\"https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/What-Google-sees.png 1270w, https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/What-Google-sees-300x221.png 300w, https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/What-Google-sees-1024x755.png 1024w, https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/What-Google-sees-768x566.png 768w, https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/What-Google-sees-400x295.png 400w\" sizes=\"auto, (max-width: 1270px) 100vw, 1270px\" \/><figcaption class=\"wp-element-caption\">Cloaking n\u00e4kyy usein vasta hakukoneen n\u00e4kym\u00e4ss\u00e4. \u2014 <em>Forr\u00e1s: Sucuri Blog<\/em><\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1332\" height=\"620\" src=\"https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/CIDR-format.png\" alt=\"Kuvitus CIDR-muotoisesta IP-alueesta ja verkkomaskista\" class=\"wp-image-89\" srcset=\"https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/CIDR-format.png 1332w, https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/CIDR-format-300x140.png 300w, https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/CIDR-format-1024x477.png 1024w, https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/CIDR-format-768x357.png 768w, https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/CIDR-format-400x186.png 400w\" sizes=\"auto, (max-width: 1332px) 100vw, 1332px\" \/><figcaption class=\"wp-element-caption\">CIDR tiivist\u00e4\u00e4 IP-alueen m\u00e4\u00e4rittelyn muotoon verkko\/prefix. \u2014 <em>Forr\u00e1s: Sucuri Blog<\/em><\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1880\" height=\"498\" src=\"https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/Multi-Layer-Identity-Verification.png\" alt=\"Kaavio monikerroksisesta identiteetin varmistuksesta: User-Agent ja IP-tarkistus\" class=\"wp-image-90\" srcset=\"https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/Multi-Layer-Identity-Verification.png 1880w, https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/Multi-Layer-Identity-Verification-300x79.png 300w, https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/Multi-Layer-Identity-Verification-1024x271.png 1024w, https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/Multi-Layer-Identity-Verification-768x203.png 768w, https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/Multi-Layer-Identity-Verification-1536x407.png 1536w, https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/Multi-Layer-Identity-Verification-400x106.png 400w\" sizes=\"auto, (max-width: 1880px) 100vw, 1880px\" \/><figcaption class=\"wp-element-caption\">User-Agent on vain ensimm\u00e4inen kerros; varsinainen varmistus tehd\u00e4\u00e4n IP-alueella. \u2014 <em>Forr\u00e1s: Sucuri Blog<\/em><\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1420\" height=\"734\" src=\"https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/Bitwise-IP-Range-Validation.png\" alt=\"Kuvitus bitwise-pohjaisesta IP-alueen validoinnista CIDR-verkkoon\" class=\"wp-image-91\" srcset=\"https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/Bitwise-IP-Range-Validation.png 1420w, https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/Bitwise-IP-Range-Validation-300x155.png 300w, https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/Bitwise-IP-Range-Validation-1024x529.png 1024w, https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/Bitwise-IP-Range-Validation-768x397.png 768w, https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/Bitwise-IP-Range-Validation-400x207.png 400w\" sizes=\"auto, (max-width: 1420px) 100vw, 1420px\" \/><figcaption class=\"wp-element-caption\">Bitwise-tarkistus varmistaa, ett\u00e4 IP todella kuuluu haluttuun verkkoon. \u2014 <em>Forr\u00e1s: Sucuri Blog<\/em><\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1444\" height=\"836\" src=\"https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/Remote-Payload-Execution-via-cURL.png\" alt=\"Kaavio et\u00e4payloadin hakemisesta cURLilla ja sis\u00e4ll\u00f6n tulostamisesta botille\" class=\"wp-image-92\" srcset=\"https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/Remote-Payload-Execution-via-cURL.png 1444w, https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/Remote-Payload-Execution-via-cURL-300x174.png 300w, https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/Remote-Payload-Execution-via-cURL-1024x593.png 1024w, https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/Remote-Payload-Execution-via-cURL-768x445.png 768w, https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/Remote-Payload-Execution-via-cURL-400x232.png 400w\" sizes=\"auto, (max-width: 1444px) 100vw, 1444px\" \/><figcaption class=\"wp-element-caption\">Et\u00e4content tuodaan sis\u00e4\u00e4n dynaamisesti ja esitet\u00e4\u00e4n hakukoneelle. \u2014 <em>Forr\u00e1s: Sucuri Blog<\/em><\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1682\" height=\"554\" src=\"https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/User-Agent-Filtering.png\" alt=\"Kuvitus User-Agent-suodatuksesta, jossa tunnistetaan useita Googlen botteja ja ty\u00f6kaluja\" class=\"wp-image-93\" srcset=\"https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/User-Agent-Filtering.png 1682w, https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/User-Agent-Filtering-300x99.png 300w, https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/User-Agent-Filtering-1024x337.png 1024w, https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/User-Agent-Filtering-768x253.png 768w, https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/User-Agent-Filtering-1536x506.png 1536w, https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/User-Agent-Filtering-400x132.png 400w\" sizes=\"auto, (max-width: 1682px) 100vw, 1682px\" \/><figcaption class=\"wp-element-caption\">Suodatus voi kattaa useita Googlen crawler- ja tarkistusty\u00f6kaluja. \u2014 <em>Forr\u00e1s: Sucuri Blog<\/em><\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1694\" height=\"680\" src=\"https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/Conditional-Logic-and-Error-Logging.png\" alt=\"Kaavio ehdollisesta logiikasta ja lokituksesta, jossa erotellaan oikea botti, feikkibotti ja tavallinen k\u00e4ytt\u00e4j\u00e4\" class=\"wp-image-94\" srcset=\"https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/Conditional-Logic-and-Error-Logging.png 1694w, https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/Conditional-Logic-and-Error-Logging-300x120.png 300w, https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/Conditional-Logic-and-Error-Logging-1024x411.png 1024w, https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/Conditional-Logic-and-Error-Logging-768x308.png 768w, https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/Conditional-Logic-and-Error-Logging-1536x617.png 1536w, https:\/\/helloblog.io\/app\/uploads\/sites\/15\/2026\/01\/Conditional-Logic-and-Error-Logging-400x161.png 400w\" sizes=\"auto, (max-width: 1694px) 100vw, 1694px\" \/><figcaption class=\"wp-element-caption\">P\u00e4\u00e4t\u00f6ksenteko + lokitus tekee hy\u00f6kk\u00e4yksest\u00e4 luotettavamman hy\u00f6kk\u00e4\u00e4j\u00e4lle. \u2014 <em>Forr\u00e1s: Sucuri Blog<\/em><\/figcaption><\/figure>\n\n\n<div class=\"references-section\">\n                <h2>Viitteet \/ L\u00e4hteet<\/h2>\n                <ul class=\"references-list\"><li><a href=\"https:\/\/blog.sucuri.net\/2026\/01\/malware-intercepts-googlebot-via-ip-verified-conditional-logic.html\" target=\"_blank\" rel=\"noopener noreferrer\">Malware Intercepts Googlebot via IP-Verified Conditional Logic<\/a><\/li><li><a href=\"https:\/\/blog.sucuri.net\/2026\/01\/google-sees-spam-you-see-your-site-a-cloaked-seo-spam-attack.html\" target=\"_blank\" rel=\"noopener noreferrer\">Google Sees Spam, You See Your Site: A Cloaked SEO Spam Attack<\/a><\/li><li><a href=\"https:\/\/blog.sucuri.net\/2025\/01\/japanese-spam-on-a-cleaned-wordpress-site-the-hidden-sitemap-problem.html\" target=\"_blank\" rel=\"noopener noreferrer\">Japanese Spam on a Cleaned WordPress Site: The Hidden Sitemap Problem<\/a><\/li><\/ul>\n            <\/div>","protected":false},"excerpt":{"rendered":"<p>Yh\u00e4 useampi hy\u00f6kk\u00e4ys ei n\u00e4y sivuston omistajalle lainkaan: ihmisille n\u00e4ytet\u00e4\u00e4n normaali etusivu, mutta Googlebotille tarjoillaan et\u00e4palvelusta haettu roskasis\u00e4lt\u00f6. T\u00e4ss\u00e4 puretaan auki, miten IP-alueisiin (ASN\/CIDR) perustuva \u201cvalikoiva injektointi\u201d toimii ja mit\u00e4 se tarkoittaa WordPress-sivuston yll\u00e4pidolle.<\/p>\n","protected":false},"author":57,"featured_media":86,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9],"tags":[56,57,54,55,53],"class_list":["post-95","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tietoturva","tag-googlebot","tag-incident-response","tag-malware","tag-seo-cloaking","tag-wordpress-security"],"_links":{"self":[{"href":"https:\/\/helloblog.io\/fi\/wp-json\/wp\/v2\/posts\/95","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\/57"}],"replies":[{"embeddable":true,"href":"https:\/\/helloblog.io\/fi\/wp-json\/wp\/v2\/comments?post=95"}],"version-history":[{"count":1,"href":"https:\/\/helloblog.io\/fi\/wp-json\/wp\/v2\/posts\/95\/revisions"}],"predecessor-version":[{"id":122,"href":"https:\/\/helloblog.io\/fi\/wp-json\/wp\/v2\/posts\/95\/revisions\/122"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/helloblog.io\/fi\/wp-json\/wp\/v2\/media\/86"}],"wp:attachment":[{"href":"https:\/\/helloblog.io\/fi\/wp-json\/wp\/v2\/media?parent=95"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/helloblog.io\/fi\/wp-json\/wp\/v2\/categories?post=95"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/helloblog.io\/fi\/wp-json\/wp\/v2\/tags?post=95"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}