
Kāpēc WordPress vīruss atgriežas pēc dzēšanas un kā to notīrīt
Pie mums regulāri nonāk mājaslapas, kuru īpašnieki jau nedēļu cīnās paši. Stāsts gandrīz vienmēr ir viens: inficētais fails atrasts un izdzēsts, pēc pāris minūtēm tas atkal ir vietā. Pa vidu mediju bibliotēkā parādās ZIP faili, ko neviens nav augšupielādējis.
Es izdzēsu failu, pārlādēju lapu, un tas bija atpakaļ. Izdzēsu vēlreiz. Tas pats.
Ar dzēšanu šeit nepietiek, un tas nav nejauši. Ļaunatūra ir uzbūvēta tā, lai tieši šo darbību pārdzīvotu.
Īsumā
- Iekļūšanai ir divi ceļi: noplūduši piekļuves dati vai ievainojamība spraudnī, tēmā vai pašā WordPress. Pēc tam ļaunatūra pati pārceļas uz pārējām tā paša hostinga konta mājaslapām.
- Tā sastāv no vairākām daļām, kas cita citu atjauno. Viena faila dzēšana tāpēc neko nemaina.
- Reāllaika skenēšana notver lielāko daļu gadījumu, bet ne iekļūšanu ar īstām parolēm.
- Inficēta vietne uzbrucējam pelna naudu: slēptas saites, surogātpasts vai piekļuves pārdošana. Strādā tikai visu daļu noņemšana vienlaikus.
Kā ļaunatūra nokļūst mājaslapā
Praksē redzam divus ceļus: svešās rokās nonākušus piekļuves datus un ievainojamību spraudnī, tēmā vai pašā WordPress.
Piekļuves dati ir WordPress administratora parole, hostinga konta vai cPanel parole, FTP un SSH pieeja. Noplūst tie caur inficētu darba datoru, caur paroli, kas lietota vēl kādā vietnē un nozagta tur, vai no parolēm, kas glabājas pārlūkā vai kādā failā.
Otrs ceļš ir ievainojamības. Kļūda populārā spraudnī skar desmitiem tūkstošu vietņu uzreiz, un masveida skenēšana sākas dažu stundu vai dienu laikā pēc tās publiskošanas. Šis logs turklāt sarūk, jo ievainojamību meklēšanā tagad izmanto arī valodas modeļus. Laiks no labojuma iznākšanas līdz pirmajiem uzbrukumiem mēdz būt pavisam īss.
Tālākais abos gadījumos ir vienāds. Viena hostinga konta mājaslapām serverī ir kopīgas piekļuves tiesības, tāpēc ļaunatūra ierakstās arī blakus esošo mājaslapu failos un datubāzēs, un parole tam vairs nav vajadzīga. Inficēta gandrīz vienmēr ir nevis viena mājaslapa, bet viss konts.
Kāpēc dzēšana nelīdz
Pirms desmit gadiem inficēta mājaslapa nozīmēja dažus ļaunprātīgus failus. Antivīruss tos atrada, izdzēsa, un ar to pietika. Šis priekšstats ir noturīgs, tāpēc pirmā doma joprojām ir atrast failu un izdzēst.
Bet ļaunatūra, ko var apturēt ar vienu izdzēstu failu, uzbrucējam ir maz vērta. Tāpēc tā tagad tiek būvēta tā, lai pārdzīvotu tieši to, ko lietotājs visdrīzāk izdarīs.
Tā vienlaikus atrodas vairākās vietās, un katra daļa spēj atjaunot pārējās. Tipisks komplekts:
- Redzamais spraudnis Tas, ko atrod antivīruss. Izskatās pēc parasta spraudņa ar ticamu nosaukumu.
- Slēptais fails wp-content mapē Nosaukums no nejaušiem simboliem un sākas ar punktu, tāpēc failu pārvaldnieks to pēc noklusējuma nerāda.
- Kopija datubāzē Vairāki simti kilobaitu koda, saglabāti kā parasts uzstādījums. Failu dzēšana to neskar.
- Ieplānots uzdevums Regulāri, dažkārt pat reizi minūtē, pārbauda, vai viss ir vietā, un trūkstošo atjauno no datubāzes kopijas.
- Rezerves arhīvs ZIP fails ar pilnu kodu, parasti vairākās vietās uzreiz, tostarp attēlu mapē.
- Papildinājums tēmas failā Pāris rindas tēmas
functions.phpfailā, kas ielādē pārējo. - Slēptais administrators Konts, kuru ļaunatūra izfiltrē no WordPress lietotāju saraksta, tāpēc tur tas nav redzams.
- Kopija servera atmiņā Daži paveidi rezerves kopiju glabā arī servera operatīvajā atmiņā, ne failos. Failu dzēšana to neskar; tā pazūd tikai tad, kad tiek apturēti procesi.
Neviena daļa nav neaizstājama. Kamēr palikusi kaut viena, pārējās atjaunojas.
Fails atgriežas ātrāk, nekā to var izdzēst
Lapā ar apmeklētājiem PHP kods darbojas nepārtraukti, un katrs apmeklējums ļaunatūrai ir izdevība pārbaudīt, vai viss ir vietā. Izdzēsts fails atgriežas dažu sekunžu laikā, bieži ātrāk, nekā paspējat pārlādēt failu pārvaldnieku.
Daļēja dzēšana rezultātu nedod
Daži paveidi seko līdzi arī faila izmēram. Ja fails kļūst mazāks vai pazūd, tas ir signāls atjaunoties. Daļēja dzēšana tāpēc neko nemaina un reizēm pilnu atjaunošanos tikai paātrina.
Datubāze paliek neskarta
Var izdzēst visus failus un uzstādīt WordPress no nulles, bet, ja datubāzē paliek kopija un ieplānotais uzdevums, dažu stundu laikā viss ir atpakaļ. Šī iemesla dēļ nepalīdz arī pilna pārinstalēšana.
Kāpēc ZIP faili parādās mediju bibliotēkā
Daži paveidi uzstāda Service Worker, nelielu programmu, kas darbojas nevis serverī, bet administratora pārlūkā. Pati par sevi tā ir parasta tīmekļa tehnoloģija; pateicoties tai, piemēram, Gmail strādā arī bez interneta savienojuma.
Būtiski, ka šī programma pārdzīvo gan cilnes aizvēršanu, gan pārlūka aizvēršanu, gan datora restartu. Praksē tas izskatās šādi: mājaslapa inficē administratora pārlūku, serveris tiek pilnībā iztīrīts, no rīta administrators atver wp-admin pārbaudīt, vai viss kārtībā, un programma ar viņa paša pieteikšanās sesiju uzstāda spraudni atpakaļ. No malas izskatās, ka tīrīšana nav nostrādājusi, lai gan ļaunatūra atgriezās no administratora datora.
Kā noņemt Service Worker no pārlūka
Katrā pārlūkā, profilā un ierīcē, no kuras esat pieteicies mājaslapas administrācijā, tostarp telefonā, atveriet izstrādātāja rīkus (F12), sadaļu Application, tad Service Workers un nospiediet Unregister. Pēc tam sadaļā Application, Storage nospiediet Clear site data.
Ierastā funkcija „Notīrīt pārlūkošanas datus” Service Worker ne vienmēr noņem. Tas jādara tieši caur Application sadaļu.
Svarīga ir secība: vispirms serveris, tikai pēc tam pārlūks. Ja notīrīsiet pārlūku, kamēr mājaslapa vēl ir inficēta, tā uzstādīs programmu no jauna. Tā paša iemesla dēļ pirms tīrīšanas nepalīdz arī pāreja uz citu pārlūku.
Un vēl: šī programma pārtver arī pieteikšanās formā ievadītos datus. Ja paroli nomaināt no vēl neiztīrīta pārlūka, jaunā parole uzreiz nonāk pie uzbrucēja. Paroles mainiet tikai no tīras ierīces vai iztīrīta pārlūka.
Kāpēc reāllaika skenēšana to var nepamanīt
Ja serverī darbojas reāllaika ļaunatūras skenēšana, loģisks jautājums ir, kā ļaunatūra tika cauri. Skenēšana notver lielāko daļu gadījumu; simtprocentīgu aizsardzību nedod neviena sistēma.
Ja uzbrucējs ienāk ar īstiem piekļuves datiem, formāli nekāda uzbrukuma nav. No servera puses tā ir parasta administratora pieteikšanās un parasta faila augšupielāde, un nav notikuma, uz ko reaģēt. Šādus gadījumus pamana vēlāk nekā citus.
Otrs iemesls: šie paveidi ir rakstīti tā, lai izvairītos no atpazīšanas. Kods saliekas kopā tikai izpildes brīdī, faili ir slēpti un maskēti, daļa ļaunatūras glabājas datubāzē un servera atmiņā, nevis failos. Jaunu paveidu skeneri kādu laiku vienkārši nepazīst.
Skenēšana tāpēc ir viens aizsardzības slānis no vairākiem, līdzās unikālām parolēm, regulāriem atjauninājumiem, rezerves kopijām un iespējai vajadzības gadījumā notīrīt visu līdz galam.
Ļaunatūru izstrādā un uztur kā produktu
Aiz šādas inficēšanās vairumā gadījumu nesēž cilvēks, kas manuāli rakņājas pa serveri. Tā ir programmatūra, ko izstrādā un uztur kā jebkuru citu produktu: ar versiju numuriem, funkciju plānu un iespēju atkāpties uz iepriekšējo versiju, ja jaunā nestrādā. Šomēnes publicētās Monarx un MD Pabel analīzes, kā arī Seven Labs gadījuma izpēte SC 4.0.3 paveidu apraksta kā savstarpēji saistītu, sevi atjaunojošu daļu tīklu: izdzēšot vienu daļu, pārējās to uzbūvē no jauna jau nākamā lapas pieprasījuma laikā.
Ar to arī skaidrojams, kāpēc pašrocīga tīrīšana bieži neizdodas. Pretī nav viens fails, bet aktīvi uzturēta programma, kas būvēta pārdzīvot noņemšanas mēģinājumus.
Tehniskās detaļas
- Ielādes ķēde:
.user.iniarauto_prepend_filenorāda uz slēptu ielādētāju ar heksadecimālu nosaukumu (piem.,.d1b67b3b.php), kas galveno kodu katrā PHP pieprasījumā atarhivē no ZIP faila. - Datubāzē: saspiests kods glabājas
wp_optionsierakstos, kuru nosaukumi tiek atvasināti pēc formulassubstr(md5(realpath(ABSPATH).'93819'.'<atslēgvārds>'),0,12), tāpēc katrā vietnē tie izskatās citādi. - WP-Cron: vairāki uzdevumi ar nejaušiem nosaukumiem (piem.,
w6yhmxe5vkco9gy), kas ik pēc ~60 sekundēm pārbauda un atjauno trūkstošās daļas. - Maskēšanās: funkciju nosaukumi tiek ģenerēti tikai izpildes brīdī ar rakstzīmju aizvietošanas tabulu, tāpēc statiska meklēšana ar
grepneko neatrod. - Bezfailu kopija: rezerves eksemplārs System V koplietojamajā atmiņā (shared memory), kas pārdzīvo visu failu dzēšanu.
- Vadības serveris: C2 adrese tiek noskaidrota caur Ethereum viedā līguma izsaukumu, saziņa notiek ar XOR maskētu JSON.
- Slēptie konti: administratori ar ģenerētiem vārdiem (piem.,
api_handler8c7ca775), kas izfiltrēti no lietotāju saraksta vaicājumiem, un slēpti REST API maršruti.
Kāpēc inficēta tieši jūsu mājaslapa
Vairumā gadījumu neviens jūs nav izvēlējies. Inficēšana notiek automātiski un masveidā; mājaslapa uzbrucējam nav mērķis, bet līdzeklis.
Šeit aprakstītajā gadījumā ieņēmumus dod slēptas saites. Ļaunatūra jūsu lapās, reizēm arī parastās HTML mājaslapās tajā pašā kontā, ievieto saites, ko apmeklētājs neredz, bet Google redz. Tās ved uz uzbrucēja klientu vietnēm un pārnes uz tām daļu jūsu vietnes reputācijas. Šādas saites tirgo tāpat kā jebkuru citu SEO pakalpojumu, tikai vietnes īpašnieks par to nezina.
Saites ir tikai viens izmantojums. Inficētas mājaslapas izmanto arī surogātpasta sūtīšanai, apmeklētāju pāradresēšanai no meklētājiem uz krāpnieciskām lapām, pikšķerēšanas lapu glabāšanai un failu izplatīšanai; ja lapā ir norēķini, mērķis mēdz būt maksājumu dati. Piekļuvi mēdz arī pārdot tālāk, un nākamais to izmanto savam mērķim.
Ekonomika visos variantos ir līdzīga, un tā izskaidro pārējo ļaunatūras uzvedību:
- Vairāk vietņu nozīmē vairāk ieņēmumu. Katra mājaslapa ir vēl viena vieta, ko izmantot vai pārdot, tāpēc ļaunatūra pārceļas uz visām konta mājaslapām un izveido tur slēptus kontus.
- Rezultāts tiek mērīts. Daļa paveidu skaita, cik reižu Google robots apmeklējis inficētās lapas, un sūta šos datus operatoram.
- Nemanāmība ir vērtība. Jo ilgāk vietne paliek inficēta un nepamanīta, jo vairāk tā ienes, tāpēc ļaunatūra slēpjas un redzamus traucējumus nerada.
- Pašatjaunošanās sargā ieņēmumus. Vietne, ko var notīrīt ar vienu dzēšanu, neko neienes, tāpēc lielākais darbs ieguldīts tieši spējā izdzīvot.
Dzēšot vienu failu, jūs aizskarat vienu daļu no mehānisma, kas būvēts tieši šādiem mēģinājumiem. Strādā tikai visu daļu noņemšana vienlaikus.
Kā notīrīt
Secība ir svarīga.
- Apturēt izpildi. Kamēr mājaslapa apkalpo apmeklētājus, ļaunatūra darbojas un dzēšanu atsauc atpakaļ. Apturēšana izdzēš arī kopiju, ko tā glabā servera atmiņā.
- Noņemt visu vienlaikus. Failus un datubāzi vienā paņēmienā, nevis pa daļām, jo viena palikusi daļa atjauno pārējās. Svarīga ir arī secība: vispirms jāatvieno klusie ielādētāji (
.user.ini, mu-plugins), citādi viss atjaunojas jau minūtes laikā. - Nomainīt visas paroles. WordPress administratora, datubāzes, FTP un hostinga konta. Ja tā pati parole lietota citur, jāmaina arī tur.
- Atjaunināt WordPress, spraudņus un tēmas. Ja iekļūts caur ievainojamību, bez atjauninājuma tas pats ceļš paliek atvērts.
- Pārbaudīt pēc 72 stundām. Ja kaut kas ir palicis, tas parādās pirmajās dienās.
Pirmajiem diviem soļiem nepietiek ar WordPress vadības paneli vai failu pārvaldnieku. Vajadzīga vismaz SSH piekļuve kontam. Ar to var apturēt savus PHP procesus, ar ipcs un ipcrm noņemt kopiju koplietojamajā atmiņā un strādāt ar datubāzi ārpus mājaslapas; root piekļuve parasti nav nepieciešama. Ja hostings SSH piekļuvi nedod vai šādas pieredzes nav, tīrīšanu dara hostinga sniedzējs vai speciālists, kuram tā ir.
Ko darīt tagad
Ja ir rezerves kopija no laika pirms inficēšanās un saturs kopš tā laika nav būtiski mainījies, atjaunošana no tās ir labs sākumpunkts. Atjaunot vajag gan failus, gan datubāzi vienlaikus. Ja atjauno tikai failus, kā bieži sanāk ar JetBackup un līdzīgiem rīkiem, datubāzē paliek kopija, no kuras viss atjaunojas.
Tomēr ar atjaunošanu vien nepietiek. Rezerves kopija satur failus un datubāzi, bet tā ir diska momentuzņēmums, ne darbojošās sistēmas. Trīs lietas paliek ārpus tās un pēc atjaunošanas var inficēt no jauna: kopija servera atmiņā (tā pazūd tikai pēc procesu restartēšanas vai servera pārstartēšanas), Service Worker administratora pārlūkā un pati ievainojamība vai noplūdusī parole, caur ko notika iekļūšana. Ja tā pati parole ir arī citām konta mājaslapām, tās inficē atjaunoto dažu stundu laikā.
Tāpēc pēc atjaunošanas jārestartē servera procesi, jāiztīra pārlūks, jānomaina visas paroles un jāatjaunina ievainojamais spraudnis. Ar wp-admin vien to izdarīt nevar: vajadzīga vismaz SSH piekļuve kontam vai hostinga sniedzēja palīdzība. Ja kopijas nav vai tā jau ir inficēta, vajadzīga pilna tīrīšana.
Līdz tam divas lietas. Neatveriet wp-admin bez vajadzības, jo katra pieteikšanās var inficēt no jauna. Un nedzēsiet failus pa vienam: tas neko nemaina un mēdz izraisīt pilnu atjaunošanos.
Mājaslapas tīrīšana
Tīrām uzlauztas WordPress mājaslapas serverī: failus, datubāzi, slēptos kontus un ieplānotos uzdevumus, ar paroļu nomaiņu un atkārtotu pārbaudi pēc darba. Ja pārbaudē izrādās, ka mājaslapa nav inficēta, maksa netiek piemērota.
Biežākie jautājumi
Kā ļaunatūra nokļūst WordPress mājaslapā?
Pa diviem ceļiem. Pirmais ir piekļuves dati, kas nonākuši svešās rokās: WordPress administratora, hostinga konta, cPanel, FTP vai SSH parole. Otrais ir ievainojamība spraudnī, tēmā vai pašā WordPress. Publiskotas ievainojamības skenēšana sākas dažu stundu vai dienu laikā, un šis logs sarūk, jo ievainojamību meklēšanā tagad izmanto arī valodas modeļus. Kad ļaunatūra ir vienā mājaslapā, uz pārējām tā paša hostinga konta mājaslapām tā pārceļas pati, parole tam vairs nav vajadzīga.
Kāpēc vīruss atgriežas pēc dzēšanas?
Tāpēc, ka tas nav viens fails. Ir vairākas savstarpēji saistītas daļas: kopijas failos, ieraksti datubāzē, ieplānoti uzdevumi un slēpti administratora konti. Katra daļa spēj atjaunot pārējās, tāpēc pēc vienas izdzēšanas atlikušās to atliek atpakaļ, bieži dažu sekunžu laikā.
Ja serverim ir reāllaika skenēšana, kā ļaunatūra tika cauri?
Skenēšana notver lielāko daļu gadījumu, bet simtprocentīgu aizsardzību nedod neviena sistēma. Ja iekļūšana notiek ar īstiem piekļuves datiem, no servera puses tā izskatās pēc parastas administratora darbības, un nav notikuma, uz ko reaģēt. Turklāt šie paveidi ir rakstīti tā, lai izvairītos no atpazīšanas, un jaunu paveidu skeneri kādu laiku vienkārši nepazīst. Skenēšana tāpēc ir viens aizsardzības slānis no vairākiem, ne vienīgais.
Vai antivīruss to nevar notīrīt automātiski?
Tikai daļēji. Antivīruss atrod un noņem atsevišķus failus, bet datubāzi, ieplānotos uzdevumus un slēptos lietotāju kontus tas neaiztiek. Fails tiek noņemts un drīz atgriežas. Tā nav antivīrusa kļūda, bet tā darbības robeža.
Cik ilgi ļaunatūra var palikt nepamanīta?
Mēnešiem. Ja mērķis ir slēptas saites vai surogātpasts, uzbrucējam izdevīgi, lai mājaslapa strādā kā parasti. Bieži pirmā pazīme ir hostinga sniedzēja brīdinājums vai Google paziņojums, nevis kaut kas redzams pašā lapā.
Vai rezerves kopija ir droša?
Tikai tad, ja tā taisīta pirms inficēšanās, un pat tad atjaunošana ir tikai daļa risinājuma. Ja mājaslapa jau bija inficēta, kad kopija tapa, kopijā ir arī ļaunatūra, un atjaunošana visu atgriež sākotnējā stāvoklī. Pirms atjaunošanas tāpēc jānoskaidro, kad inficēšanās notikusi. Bieži tas ir agrāk, nekā šķiet. Turklāt atjaunot vajag gan failus, gan datubāzi, un pēc tam vēl restartēt servera procesus, iztīrīt pārlūku un nomainīt paroles: rezerves kopija neietver ne atmiņā palikušo kopiju, ne pārlūka Service Worker.
Kā saprast, ka tīrīšana ir izdevusies?
Pēc tīrīšanas jāveic atkārtota pārbaude un mājaslapa jāpavēro vismaz 72 stundas. Ja kāda daļa palikusi, tā izpaužas pirmajās dienās: parādās jauni faili vai atkārtojas brīdinājumi. Ja trīs dienās nekas neatgriežas, tīrīšana visdrīzāk ir bijusi pilnīga.
Kāpēc inficēta tieši mana mājaslapa?
Vairumā gadījumu neviens jūs nav izvēlējies. Inficēšana notiek automātiski un masveidā, un mājaslapa uzbrucējam ir līdzeklis, nevis mērķis. Šeit aprakstītajā gadījumā pelna ar slēptām saitēm, kas Google acīs pārnes vietnes reputāciju uz uzbrucēja klientu vietnēm. Citos gadījumos inficētu mājaslapu izmanto surogātpastam, pāradresācijām uz krāpnieciskām lapām, pikšķerēšanas lapu glabāšanai vai vienkārši pārdod tālāk. Jo vairāk vietņu un jo ilgāk tās paliek nepamanītas, jo lielāki ieņēmumi.