Malware WordPress vetë-shërues fshihet në bazën e të dhënave dhe RAM
Analistët e sigurisë në Sucuri kanë dokumentuar një familje malware WordPress që e quajnë SC, një rrjet vetë-shërues që i mbijeton heqjes duke ruajtur kopje të vetvetes në të paktën tetë vende njëkohësisht dhe duke rindërtuar çdo komponent të fshirë brenda sekondash. Hulumtimi, i publikuar më 30 shtator 2026 nga analisti i sigurisë i Sucuri, Gabriel Barbosa, vjen nga një pastrim real ku i njëjti backdoor vazhdonte të kthehej pavarësisht se sa me kujdes fshiheshin skedarët e dukshëm. Emri SC vjen nga shënuesit 'SC_' të gjetur në përmbajtjen e injektuar.
Sipas Sucuri, çdo skedar SC i rikuperuar ndan të njëjtën skemë errësimi: nuk ka eval, nuk ka shënues në pjesët më të reja dhe nuk ka emra funksionesh të lexueshëm. Në vend të kësaj, çdo skedar mbart një tabelë me vargje të përziera dhe një dekodues të vogël që zgjidh një indeks numerik në një emër funksioni real përmes një kodi zëvendësimi pozicional.
Infeksioni ka tetë komponentë thelbësorë. I pari është një shkas .user.ini me një rresht të vetëm që vendos auto_prepend_file, një direktivë konfigurimi PHP që ekzekuton një skedar të caktuar para çdo kërkese në atë pemë direktorish, madje edhe kërkesa që nuk arrijnë kurrë në WordPress. PHP e ruan këtë vlerë në cache, prandaj fshirja e objektivit të prepend ndërsa cache është ende e ngrohtë bën që çdo kërkesë PHP në llogari të dështojë derisa cache të skadojë.
Komponenti i dytë është një skedar PHP shim i dukshëm. Në rastin e dokumentuar ai quhej c1b12371.php, por emri ndryshon nga faqja në faqe. .user.ini tregon te ky shim, dhe shim bën një gjë: nëse një skedar i fshehur me parashtesë pikë ekziston pranë tij, ai e përfshin atë skedar të fshehur. Nëse një mbrojtës heq vetëm skedarin e fshehur, shim në heshtje nuk bën asgjë dhe faqja mbetet në funksion, duke i blerë sulmuesit kohë ndërsa një komponent tjetër rikrijon skedarin e fshehur.
Komponenti i tretë është skedari i fshehur me parashtesë pikë, ngarkuesi i parë i vërtetë. Ai lokalizon shtojcën e rreme dhe e rindërton atë në direktorinë mu-plugins nga tre burime të provuara me radhë: një kopje ekzistuese në dosjen e shtojcave, një cung i koduar në direktorinë e cache, dhe një paketë rivendosjeje ZIP me një emër heksadecimal të rastësishëm. Ai shkruan përmes një skedari të përkohshëm, vendos lejet e skedarit në 0644 dhe thërret opcache_invalidate në mënyrë që skedari i sapo shkruar të ekzekutohet menjëherë. Ai gjithashtu përcakton një konstante të quajtur SC_AUTO_PREPEND, duke e lidhur atë me anën auto_prepend të familjes.
Komponenti i katërt është drop-in wp-content/db.php, një skedar i veçantë WordPress i ngarkuar shumë herët gjatë nisjes. Kjo kopje mbart të gjithë ngarkesën e backdoor brenda vetes si një blob gzip plus base64, dy formate të zakonshme kompresimi dhe kodimi. Në çdo kërkesë ku shtojca e rreme mungon ose është shumë e vogël, ai dekodon blob-in dhe e shkruan shtojcën përsëri në disk.
Komponenti i pestë është drop-in wp-content/advanced-cache.php, pozicioni më i hershëm dhe më i rrezikshëm nga të gjithë. Kur caching është i aktivizuar, WordPress ngarkon advanced-cache.php para shtojcave të zakonshme. Ndryshe nga db.php, ai nuk e mbart ngarkesën në mënyrë inline. Ai është një gjetës që mund të rindërtojë shtojcën nga pesë burime të pavarura me radhë: një mu-plugin ekzistues, një kopje ekzistuese e shtojcës, një segment memorie të përbashkët System V që mban kod PHP, një paketë ZIP e kërkuar në disa dosje, dhe së fundi vetë baza e të dhënave. Për rrugën e bazës së të dhënave, ai hap një lidhje direkte duke përdorur konstantet e kredencialeve të vetë faqes dhe lexon ngarkesën nga një rresht opsioni specifik, duke dekoduar të njëjtin format gzip. Pasi ka një kopje, ai lidh plugins_loaded dhe e përfshin atë.
Komponenti i gjashtë është një injeksion teme. Sulmuesi shtoi një bllok të kufizuar në fund të functions.php të temës aktive, i rrethuar nga shënues fillimi dhe fundi. Ai bllok është binjaku i db.php me banim në temë: ai rishkruan shtojcën sa herë që ajo zhduket.
Komponentët e shtatë dhe të tetë janë dy kopje identike të ngarkesës aktuale të backdoor, të instaluara si një shtojcë must-use (e cila ngarkohet automatikisht dhe në mënyrë të padukshme) dhe si një shtojcë normale. Dosja e shtojcës madje përfshin një faqe cilësimesh të rreme bindëse, një shortcode dhe një grep aktivizimi në pamje të qartë, kështu që një vështrim i shpejtë sugjeron një shtojcë caching të vërtetë. Dy kopjet janë qëllimisht të tepërta, dhe ngarkesa konkurruese përditëson njërën nga tjetra në mënyrë që të dyja të qëndrojnë në të njëjtin version.
Ngarkesa është arsyeja pse ekziston pjesa tjetër e rrjetit. Pasi funksionon, ajo kryen disa punë të dallueshme. Ajo fshihet duke filtruar listën e shtojcave, transientin e përditësimit dhe pamjet e shtojcave të faqes dhe rrjetit për të hequr hyrjen e vet, kështu që nuk shfaqet në ekranin e shtojcave të administratorit ose në kontrollet e përditësimit. Ajo gjithashtu lëshon JavaScript administratori për të fshirë veten nga tabela e shtojcave si një rezervë.
Për komandë dhe kontroll, ngarkesa komunikon mbi infrastrukturën blockchain. Ajo mbart një listë prej rreth njëzet portash publike Ethereum RPC dhe një grup selektorësh metodash të kontratave inteligjente. Në vend të një serveri të vetëm të koduar, ajo dërgon kërkesa te ato porta legjitime të palëve të treta për të lexuar udhëzime nga një kontratë inteligjente. Për shkak se këto porta janë legjitime, bllokimi vetëm i atij që shihet në trafik lë pjesën tjetër si rezervë, kështu që i gjithë grupi duhet të bllokohet së bashku.
Ngarkesa merr gjurmët e faqes dhe merr një ngarkesë. Ajo mbledh URL-në e faqes dhe hostin, versionet e WordPress dhe shtojcave, hash-et e shtigjeve, temat aktive, listën e mu-plugin dhe tokenat e sesionit të administratorit aktual, e kodon atë paketë dhe e poston në pikën përfundimtare të zgjidhur. Përgjigja mund të mbartë JavaScript të front-end për të injektuar, i cili në një dyqan online mundëson skimming në arkë, plus PHP të ri për të instaluar, dhe lista të shtojcave të sigurisë për të çaktivizuar dhe fshirë. Kur i thuhet të heqë një shtojcë sigurie, ajo mund ta çaktivizojë atë, të fshijë direktorinë e saj, dhe madje të ricaktojë ose ngrejë një llogari tjetër së pari.
Ngarkesa gjithashtu krijon një administrator të fshehur. Ajo ose adopton një administrator ekzistues të fshehur ose gjeneron një të ri, duke e shkruar llogarinë direkt në tabelat users dhe usermeta kur API normale e WordPress është e padisponueshme. Ajo ruan aftësitë nën çelësin meta të aftësive të paracaktuara, pastaj e fsheh llogarinë nga lista e përdoruesve, numërimet e përdoruesve dhe pamjet e roleve përmes filtrave të pyetjeve dhe numërimeve. Ajo gjithashtu falsifikon cookie autentikimi të vlefshme për atë llogari, në mënyrë që operatori të mund të hyjë pa fjalëkalim.
Ngarkesa ekspozon një fener të drejtpërdrejtë. Një parametër kërkese magjik, në formën e një parashtese të shkurtër të ndjekur nga një vlerë fikse, trajtohet para se WordPress të përfundojë ngarkimin. Ndërsa rrjeti është i pranishëm, ajo kërkesë kthen një përgjigje normale me përmbajtje dhe pastaj del.
Së fundi, ngarkesa rindërton të gjithë rrjetin. Ajo lidh një grup të madh veprimesh dhe filtrash WordPress qëllimi i vetëm i të cilëve është të rishkruajnë çdo komponent tjetër. Ajo rigjeneron drop-in-et db.php dhe advanced-cache.php, injeksionin e temës, ngarkuesin e fshehur dhe direktivat e tij .htaccess dhe .user.ini prepend, paketën e rivendosjes ZIP, segmentin e memories së përbashkët dhe kopjen e ngarkesës në bazën e të dhënave. Ajo madje hap një lidhje të papërpunuar me bazën e të dhënave për të futur opsionin e saj të ngarkesës direkt, duke anashkaluar WordPress.
Mësimi i vetëm më i rëndësishëm nga ky rast është se qëndrueshmëria nuk kufizohet vetëm te skedarët. Sucuri rikuperoi kopje të gjalla të ngarkesës në tre vende jo-skedarë, secila prej të cilave do të rindërtojë të gjithë grupin në kërkesën tjetër. Baza e të dhënave ruan ngarkesën e plotë në një rresht opsionesh nën një emër të rastësishëm, në të njëjtin format gzip dhe base64. Drop-in advanced-cache.php e lexon atë përsëri përmes një lidhjeje direkte me bazën e të dhënave. Kjo është arsyeja pse një pastrim i plotë dhe i saktë i skedarëve dështon: ngarkesa tjetër e faqes rikthen gjithçka nga rreshti. Në serverët që mbështesin memorien e përbashkët System V, një metodë për proceset për të ndarë të dhëna në RAM, ngarkesa shkruhet në një segment të identifikuar nga një çelës numerik fiks. Ai segment jeton në RAM, kështu që i mbijeton fshirjes së skedarëve dhe pastrimit të bazës së të dhënave, dhe në hostimin e përbashkët mund të jetë edhe në pronësi të një llogarie tjetër. Infeksioni gjithashtu regjistron grepa cron, duke përfshirë emra të rastësishëm së bashku me një grep të njohur fetch. Cron i sistemit ekzekuton skedarin cron të WordPress, jo trafikun e vizitorëve, pastaj shkakton rishpërndarjen sipas orarit. Së bashku me këto, Sucuri pa shkasë të bazës së të dhënave të përdorura nga variante të lidhura SC që rikrijojnë një administrator në insert. Një shkas ekzekutohet brenda bazës së të dhënave, kështu që i mbijeton një rivendosjeje të plotë të skedarëve dhe madje fshirjes së llogarisë që vazhdon të rikrijojë.
Treguesit e kompromisit të listuar nga Sucuri përfshijnë blloqe PHP të papritura brenda wp-content/db.php ose wp-content/advanced-cache.php që hapen me një shënues fillimi të stilit SC_ dhe një konstante mbrojtëse; një bllok i kufizuar në fund të functions.php të temës aktive i rrethuar nga shënues fillimi dhe fundi, ndonjëherë me shënuesin e fillimit të dyfishuar; një .user.ini, php.ini ose .htaccess që mbart një direktivë auto_prepend_file që tregon te një skedar PHP i fshehur me parashtesë pikë; një shtojcë e rreme e pranishme si në wp-content/mu-plugins ashtu edhe në wp-content/plugins me përmbajtje të përputhshme dhe një faqe cilësimesh të besueshme; një paketë rivendosjeje ZIP me një emër heksadecimal të rastësishëm në wp-content, wp-content/uploads ose një dosje teme; një rresht opsionesh me një emër të rastësishëm që mban një blob të madh gzip dhe base64 plus opsione kontrolli dhe transiente duke përdorur një parashtesë stili sc_; një segment memorie të përbashkët që mban PHP të lexueshëm që fillon me një etiketë hapëse; një administrator plotësisht i privilegjuar që mund të mos shfaqet në listën e përdoruesve me aftësi të ruajtura nën çelësin meta të aftësive të paracaktuara, dhe ndonjëherë një opsion jetim që tregon te ID-ja e asaj llogarie e lënë pas një pastrimi të pjesshëm; dhe kërkesa dalëse te portat publike Ethereum RPC nga serveri i uebit.
Udhëzimi i pastrimit i Sucuri këmbëngul se rendi i operacioneve ka më shumë rëndësi sesa fshirjet individuale. Heqja e skedarëve së pari, në rendin e gabuar, thjesht shkakton një rishkrim. Qasja që funksionon është të ndërpritet ekzekutimi, të pastrohen kopjet jashtë diskut para atyre në disk, dhe vetëm atëherë të hiqen skedarët në një kalim të vetëm. Së pari, neutralizoni prepend-in para se të fshini objektivin e tij. Për shkak se auto_prepend_file ruhet në cache nga PHP deri në 300 sekonda, zbrazni objektivin e prepend në një cung inert së pari, pastaj hiqni direktivën nga .user.ini, php.ini dhe .htaccess. Fshirja e objektivit ndërsa cache është ende e ngrohtë rrëzon çdo kërkesë PHP në llogari. Së dyti, pastroni kopjet e ngarkesës jashtë diskut. Hiqni rreshtin e ngarkesës nga tabela e opsioneve, pastroni segmentin e memories së përbashkët dhe fshini opsionet e kontrollit dhe transientet. Nëse ndonjë prej këtyre mbetet, kërkesa tjetër përmes advanced-cache.php do të rishkruajë të gjithë grupin përsëri në disk. Në hostimin e përbashkët, një segment memorie i përbashkët mund të jetë në pronësi të një llogarie tjetër, në të cilin rast vetëm ajo llogari ose hosti mund ta heqë atë, dhe bëhet i padëmshëm sapo drop-in-et që e lexojnë janë hequr. Së treti, hiqni detyrat e planifikuara dhe çdo shkas të bazës së të dhënave. Pastroni grepat e dëmshme cron në mënyrë që cron i sistemit të mos mund të rishpërndajë sipas orarit, dhe auditoni information_schema.TRIGGERS për çdo shkas që rikrijon një administrator në insert. Një shkas i mbijetuar do të rindërtojë aksesin edhe pas një rivendosjeje të plotë të skedarëve. Së katërti, hiqni administratorin e fshehur. Fshini llogarinë aftësitë e së cilës ruhen nën çelësin meta të aftësive të paracaktuara, dhe pastroni opsionin jetim që tregon te ID-ja e saj. Së pesti, pastroni skedarët në një kalim. Hiqni ngarkuesit e pavarur dhe shim-in, fshini të dy kopjet e shtojcës së rreme nga dosjet mu-plugins dhe plugins, fshini paketën e rivendosjes ZIP kudo që ishte fshehur, dhe hiqni drop-in-et e injektuara. Për db.php dhe advanced-cache.php, kjo do të thotë fshirja e skedarëve të dëmshëm. Për functions.php të temës, kjo do të thotë shkurtimi vetëm i bllokut të kufizuar midis shënuesve të fillimit dhe fundit në mënyrë që kodi legjitim i temës të mbetet i paprekur. Së gjashti, skanoni përsëri dhe shikoni për skedarë të rikrijuar. Kryeni një skanim të plotë, pastaj monitoroni shtigjet e prekura. Një komponent që kthehet do të thotë se një pikë qëndrueshmërie mbijetoi ose rruga origjinale e hyrjes është ende e hapur.
Këshilla e parandalimit e Sucuri fillon me mbajtjen e gjithçkaje të arnuar. Shumica e kompromiseve që ata trajtojnë shfrytëzojnë dobësi të njohura, tashmë të rregulluara në komponentë të vjetëruar, dhe përditësimet e shpejta shkurtojnë dritaren e sulmuesit. Përdorni një mur mbrojtës të aplikacionit ueb, i cili mund të bllokojë përpjekjet e shfrytëzimit para se të arrijnë aplikacionin, të kapë parametrin e fenerit dhe të ndihmojë në ndalimin e kërkesave dalëse te kanali i komandës. Auditoni vendet ku fshihet kjo familje: tabelën e opsioneve, detyrat e planifikuara, shkasët e bazës së të dhënave dhe llogaritë e përdoruesve sipas një orari. Trajtoni çdo rishfaqje si pastrim të papërfunduar. Nëse një skedar kthehet, një kopje e ngarkesës ende jeton diku jashtë diskut ose një detyrë e planifikuar është ende e armatosur, kështu që kthehuni te burimet jashtë diskut në vend që të fshini të njëjtin skedar përsëri. Pronarët e faqeve gjithashtu mund të zvogëlojnë ndikimin e riinfeksioneve të tilla të thella duke përdorur hostim të menaxhuar WordPress si AEU Hosting, i cili ofron kopje rezervë automatike, forcim sigurie dhe mbështetje ekspertësh për të ndihmuar në mbajtjen e një mjedisi të pastër dhe të monitoruar.
SC është një kujtesë se një infeksion modern WordPress mund të jetë një sistem dhe jo një skedar. Ky toolkit shpërndan kopje identike të një backdoor nëpër drop-in-e, temën, një shtojcë të rreme në dy vende, bazën e të dhënave dhe memorien e përbashkët, fsheh kanalin e tij të komandës brenda infrastrukturës legjitime blockchain, dhe rishkruan veten nga çdo kopje e mbijetuar në kërkesën tjetër. Një rregullim i qëndrueshëm i trajton skedarët, bazën e të dhënave dhe memorien e përbashkët si një problem, çaktivizon ekzekutimin para fshirjes, heq qëndrueshmërinë në çdo formë që merr, mbyll pikën origjinale të hyrjes dhe rrotullon çdo kredencial që sulmuesi mund të ketë prekur.