Kako pronaći backdoor na WordPress sajtu i ukloniti ga
Postoji jedan scenario koji se ponavlja toliko često da ga prepoznamo pre nego što nam čovek završi rečenicu. Sajt je bio zaražen. Neko ga je očistio, ili je vlasnik sam obrisao ono što je delovalo sumnjivo. Nedelju ili dve je sve bilo u redu. A onda se sve vratilo, isto kao pre.
Ukratko: ako se infekcija vraća, skoro uvek postoji backdoor ili otvoren ulaz. Nađite rezervni ulaz, zatvorite rupu, pa pratite sajt narednih dana.
Kad se infekcija vraća posle čišćenja, u devet od deset slučajeva razlog je isti: postoji backdoor na WordPress sajtu koji niko nije našao. Čišćenje je uklonilo ono što se videlo, a ostavilo ono što je omogućavalo napadaču da se vrati kad god poželi.
U ovom tekstu objašnjavamo šta backdoor na WordPress sajtu tačno radi, zašto ga je teško primetiti, gde se najčešće krije, kako izgleda kad ga otvorite, i kojim redom ima smisla tražiti ga.
Šta backdoor zapravo radi
Najlakše poređenje je sa ključem. Zamislite da vam neko uzme ključ od stana, napravi kopiju i vrati original tako da nikad ne primetite da je nedostajao. Možete promeniti bravu na ulaznim vratima koliko god puta hoćete. Kopija i dalje otvara sporedna vrata za koja ste zaboravili da postoje.

Tehnički gledano, svaki backdoor je fajl koji prima naredbe spolja i izvršava ih na vašem serveru. Neki su bukvalno par redova koda: uzmu sadržaj iz jednog parametra u adresi i izvrše ga. Drugi su razrađeniji, sa sopstvenom lozinkom i interfejsom koji liči na pravi fajl menadžer, dostupnim samo onome ko zna tačnu putanju.
Ono što ih sve povezuje jeste da vam pristup koji daju ne zavisi ni od čega što vi kontrolišete iz WordPress administracije. Možete promeniti lozinku, uključiti dvofaktorsku prijavu, obrisati sumnjiv administratorski nalog koji ste primetili. Ako backdoor fajl i dalje stoji negde na serveru, napadač i dalje ulazi kad hoće.
Ovo je razlika koju mnogi ne uoče pri prvom susretu sa infekcijom. Uklanjanje vidljivih posledica, spam sadržaja, čudne redirekcije, sumnjivog korisnika, nije isto što i uklanjanje uzroka.
Zašto ga je teško primetiti
Prosečna WordPress instalacija ima nekoliko hiljada fajlova. Jezgro, tema, desetine dodataka, svaki sa svojom strukturom foldera. Niko realno ne otvara svaki fajl da vidi šta u njemu piše. Napadači to znaju i pišu kod tako da preživi upravo onaj tip provere koji ćete verovatno uraditi.
Ime izgleda kao da pripada sistemu
Umesto očiglednog naziva, takav fajl se često zove nešto poput wp-cache-config.php, class-wp-utils.php ili admin-functions-backup.php. Kad prelistavate listu fajlova, takvo ime ne izazove nikakvu sumnju.
Kod je namerno nečitljiv
Sadržaj je često zapisan tako da se dekodira tek u trenutku izvršavanja. Ako otvorite takav fajl, videćete dugačak niz slova i brojeva bez ijedne prepoznatljive reči. To je istovremeno i način sakrivanja i najpouzdaniji znak da nešto nije u redu, jer legitiman kod nema razloga da bude nečitljiv.

Datum izmene je lažiran
Uobičajen prvi refleks je da se folder sortira po datumu izmene i pogleda šta je najskorije dodato. Napadači to očekuju, pa ponekad postave datum fajla tako da odgovara okolnim, legitimnim fajlovima. Taj trag time nestaje.
Fajl ne radi ništa dok ne dobije tačan poziv
Sofisticiraniji backdoor ne reaguje dok ne primi tačno određenu lozinku ili parametar. Ako ga samo otvorite u pretraživaču, prikazaće praznu stranicu ili grešku, pa deluje kao da je bezopasan. A on samo čeka poziv koji zna jedino onaj ko ga je postavio.
Ubačen je u postojeći, legitiman fajl
Ovo je najteža varijanta. Nema novog fajla koji bi upao u oči. Postoji samo jedan dodatni red u fajlu koji tu inače pripada, često na samom kraju, iza mnogo praznih redova, van onoga što vidite bez skrolovanja.
Gde se najčešće krije
Postoji nekoliko lokacija koje se ponavljaju iz slučaja u slučaj, i svaka ima svoj razlog.
Uploads folder
Folder wp-content/uploads je namenjen slikama i dokumentima. Tamo nikad ne bi trebalo da postoji fajl sa ekstenzijom .php. Napadači ga vole baš zato što većina ljudi tamo i ne pomisli da traži izvršni kod, jer „tamo ionako nema koda".
MU-plugins
Folder wp-content/mu-plugins WordPress učitava automatski, pre svih ostalih dodataka. Njegov sadržaj se ne prikazuje u listi dodataka na isti način kao obični dodaci, a veliki broj vlasnika sajtova ni ne zna da taj folder postoji. Idealno mesto za nešto što treba da radi tiho i preživi uklanjanje ostalog.
Unutar teme ili dodatka
Bilo kao poseban fajl među desetinama postojećih, bilo kao dodatna linija u fajlu koji već tu pripada. Posebno se često koristi fajl functions.php aktivne teme, jer se učitava na svakoj stranici.

U bazi podataka
Ovo mesto se najčešće previdi, jer nije fajl. Kod može biti upisan u tabelu wp_options, u polja koja se učitavaju pri svakom zahtevu. Ako čistite samo fajlove, sve se vraća čim se stranica ponovo otvori.
Kao zakazani zadatak
Napadač može da zakaže WordPress zadatak koji ponovo postavlja backdoor nekoliko dana posle brisanja. Ovo objašnjava slučajeve gde vlasnik obriše fajl, a fajl se sam vrati.
Kao skriveni administratorski nalog
Nije fajl, ali funkcioniše po istom principu. Dodatan nalog sa administratorskim pravima, često sa imenom koje deluje sistemski, daje pristup i posle svih promena lozinki.
Zašto obična provera dodataka nije dovoljna
Uobičajen refleks kad se posumnja na infekciju je da se otvori lista instaliranih dodataka i obriše ono što deluje sumnjivo. Problem je što backdoor skoro nikad ne postoji kao zaseban, imenovan dodatak u toj listi.

Fajl postavljen u uploads folder se tamo nikad neće pojaviti, jer WordPress tu listu gradi na osnovu strukture foldera i zaglavlja fajla koje backdoor namerno nema. Isto važi za kod ubačen unutar legitimnog dodatka koji nemate razloga da sumnjičite.
Zato scenario iz uvoda ovog teksta izgleda kao da nema objašnjenja. Vlasnik obriše par dodataka, sajt privremeno deluje čisto, pa se sve vrati. Stvarni ulaz nikad nije ni dirnut.
Kako se backdoor stvarno pronalazi
Pošto ručni pregled hiljada fajlova nije izvodljiv, pouzdano traženje počiva na tri pristupa koji rade zajedno.
Poređenje sa zvaničnim verzijama
WordPress jezgro i svaki dodatak iz zvaničnog repozitorijuma imaju poznatu, javno dostupnu verziju. Poređenje fajlova na sajtu sa tom verzijom odmah pokazuje dve stvari: koji je postojeći fajl izmenjen, i koji fajl uopšte ne pripada tom paketu. Ovo ne zavisi od prepoznavanja sadržaja, pa hvata i potpuno nove obrasce koje niko još ne poznaje.

Provera mesta gde izvršnog koda ne bi trebalo da bude
Svaki PHP fajl u uploads folderu je sumnjiv po definiciji, bez obzira na ime i sadržaj. Isto važi za neočekivane fajlove u mu-plugins folderu. Ova provera je jednostavna, a u praksi izuzetno efikasna.
Prepoznavanje obrazaca u kodu
Postoje kombinacije funkcija koje se u legitimnom WordPress kodu praktično ne pojavljuju, a koje su tipične za maliciozni kod. Njihovo prisustvo je gotovo uvek pouzdan signal, čak i kad se ne razume šta tačno dekodirani sadržaj radi.
Sve tri provere zajedno, urađene automatski i po rasporedu, daju mnogo pouzdaniji rezultat od bilo koje jednokratne ručne provere. Prosto zato što je obim posla, hiljade fajlova pri svakom skeniranju, nešto što se ne može raditi rukom.
Kako izgleda tipičan slučaj od početka do kraja
Da bi cela priča bila konkretnija, evo redosleda koji se u praksi ponavlja sa malim varijacijama.
Automatizovana skripta pronalazi ranjivost u dodatku koji nije ažuriran nekoliko meseci. Kroz nju postavlja backdoor fajl u uploads folder. To je prvi korak i, u tom trenutku, ništa se spolja ne vidi. Sajt radi normalno, brzina je ista, nema nijednog znaka.
Nekoliko dana kasnije, kroz taj backdoor, ubacuje se ono što stvarno donosi zaradu napadaču: spam sadržaj, preusmeravanje posetilaca, ili skripta za slanje pošte. To je prvi trenutak kad vlasnik sajta nešto primeti, najčešće preko tuđe prijave ili upozorenja u pretrazi.
Vlasnik reaguje na ono što vidi. Ažurira dodatak koji je bio ranjiv, čime zatvara originalnu rupu. Promeni lozinku. Ručno obriše spam stranice. Sajt ponovo izgleda uredno i deluje da je stvar rešena.
Backdoor fajl iz prvog koraka niko nije ni tražio, jer niko nije znao da postoji. Prolaze nedelje. Onda se, bez ikakvog novog napada, sve vrati. Ponekad zato što napadač ponovo pokrene istu kampanju, ponekad zato što je pristup u međuvremenu prodao nekom drugom.
Vlasnik u tom trenutku zaključi da čišćenje ne radi, ili da je hosting kriv, ili da je sajt „proklet". Nijedno nije tačno. Problem nikad nije ni bio rešen, samo je privremeno prestao da bude vidljiv.
Koliko dugo backdoor može da stoji neprimećen
Odgovor koji ljudi obično ne očekuju je: koliko god treba. Nema mehanizma koji bi ga sam otkrio.
Za razliku od spama ili redirekcije, backdoor sam po sebi ne pravi nikakav vidljiv efekat. Ne usporava sajt jer se ne izvršava dok ga niko ne pozove. Ne menja sadržaj. Ne šalje ništa. Ne pojavljuje se u pretrazi. Ne troši resurse koje bi hosting primetio.

To znači da sajt može mesecima izgledati potpuno uredno, dok pristup i dalje postoji. Viđali smo slučajeve gde je fajl bio postavljen godinu dana pre nego što je iskorišćen, jednostavno zato što je napadaču tako odgovaralo.
Praktična posledica je da odsustvo simptoma nije dokaz da problema nema. To je i razlog zašto nadzor ima smisla i onda kad je sve mirno, jer se baš u tim mirnim periodima postavlja ono što se kasnije aktivira.
Šta uraditi kad ga pronađete
Prvo napravite kopiju
Puna kopija fajlova i baze pre bilo kakve izmene, čak i zaražena. To je jedina zaštita ako nešto pođe naopako, i jedini izvor podataka za kasniju rekonstrukciju.
Pogledajte fajl pre nego što ga obrišete
Datum nastanka i sadržaj vam često kažu kada je postavljen i kroz koju rupu je ušao. Bez toga rešavate posledicu i čekate ponavljanje.
Pitajte kako je dospeo tu
Ovo je važnije od samog uklanjanja. Ako originalna ranjivost ostane otvorena, zastareo dodatak, slaba lozinka, tema iz nezvaničnog izvora, sledeći backdoor je samo pitanje vremena.
Pretpostavite da nije jedini
Napadači po pravilu ostavljaju više od jednog ulaza, jer računaju da će prvi biti pronađen. Kad nađete jedan, to je razlog da tražite dalje, ne da prestanete.
Promenite sve lozinke
WordPress administracija, baza podataka, hosting panel, FTP i SSH pristup. Dok je backdoor bio aktivan, napadač je verovatno mogao da izvuče i te podatke, pa ih treba tretirati kao kompromitovane.
Poništite postojeće sesije
Promena lozinke ne poništava uvek već otvorene sesije. Ako je napadač ukrao kolačić prijave, a ne samo lozinku, i dalje je unutra. Poništavanje svih aktivnih sesija zatvara i taj put.
Pratite sajt narednih nedelju dana
Posle čišćenja vredi pojačano pratiti stanje bar sedam do deset dana. To je period u kom se najčešće vidi da li je nešto propušteno, jer zakazani zadaci i rezervni ulazi obično imaju odloženo dejstvo. Ako u tom roku ništa ne iskoči, šanse da je posao završen su znatno veće nego prvog dana.
Kako sprečiti da se ponovi
Najpouzdanija odbrana nije jednokratno čišćenje, nego kontinuiran nadzor. To proizlazi direktno iz svega opisanog gore: backdoor je namerno napravljen da prođe kroz jednu ručnu proveru. Jedini način da se uhvati na vreme jeste nešto što redovno, automatski poredi trenutno stanje fajlova i baze sa prethodnim.
Uz to idu i osnovne stvari koje zatvaraju većinu ulaza pre nego što se uopšte otvore. Redovno ažuriranje jezgra, teme i dodataka. Uklanjanje svega što se ne koristi, jer neaktivan dodatak sa ranjivošću je i dalje ranjiv. Jake i jedinstvene lozinke uz dvofaktorsku prijavu. Zabrana izvršavanja PHP fajlova u uploads folderu na nivou servera, čime cela jedna klasa backdoor fajlova prestaje da funkcioniše čak i ako se fajl nekako postavi.
Kako da proverite gde ste sada
Ako sumnjate na backdoor na WordPress sajtu, ili vam se infekcija već jednom vratila posle čišćenja, prvi korak ne mora ništa da košta. Besplatna brza analiza pregleda javno dostupan sadržaj sajta i traži poznate obrasce malvera, skrivene skripte i sumnjive redirekcije. Bez naloga, bez instalacije, obično ispod minuta.
Ograničenje te provere treba reći otvoreno, jer je kod ove teme presudno. Udaljena provera vidi samo ono što je javno dostupno preko interneta. Backdoor koji tiho stoji u fajlu i čeka poziv nije javno vidljiv, i takva provera ga po pravilu neće naći. Čist rezultat je dobar znak za površinski sloj, ali nije dokaz da backdoor ne postoji.
Za pouzdan odgovor potrebno je pogledati same fajlove i bazu na sajtu, jer je to jedino mesto gde se on nalazi. Ako želite taj uvid, ili ako vam se problem već vraćao i ne želite da pogađate, pišite nam. Pošaljite adresu sajta i kratak opis šta se dešavalo, i reći ćemo vam šta ima smisla kao sledeći korak.