Izmikanje protivirusnim programom - za zabavo (in korist)
Ali zaupate protivirusnim programom? Večina uporabnikov jim zaupa. Brezpogojno. Dajejo jim (lažen) občutek varnosti in neranljivosti. Vendar danes ni prav nobena umetnost napisati trojanca, ki se jim bo izmaknil ali jih vsaj delno prelisičil.
Če želimo preprečiti, da bi protivirusni program zaznal naš program (recimo, da smo pisci virusa ali trojanca), moramo najprej razumeti njihov način delovanja. Protivirusni programi škodljivo kodo (malware) večinoma odkrivajo po načelu preverjanja podpisov kode. Povprečen protivirusni program mora med delom preveriti silno veliko datotek, zato bi preprosto vzelo preveč časa, če bi odkrival škodljivo kodo na podlagi specifičnih podrobnosti, opazovanja delovanja in "obnašanja" oziroma s kombinacijo omenjenih prijemov. Natančno odkrivanje je (bilo vsaj do pred kratkim) nefunkcionalno in časovno potratno.
Vsak protivirusni program ima zbirko podpisov, ki se redno posodabljajo. Podpis je delček binarne kode in je unikaten vsakemu primerku škodljive kode. Kot nekakšen prstni odtis. Protivirusni program preprosto podpise vseh datotek primerja s podpisi v svoji "zbirki virusov".
Številni protivirusni programi uporabljajo t. i. "hevristično" preverjanje. Čeprav izraz zveni zelo "hi-tech", hevristična detekcija pomeni le to, da protivirusnik kot nevarne označi tudi tiste datoteke, ki imajo soroden ali podoben podpis.
In končno je tu še sprotno preverjanje vsebine pomnilnika. Popoln in podroben pregled pomnilnika je zaradi časovne potrate nefunkcionalen. Standarden (na zahtevo) pregled pomnilnika se najpogosteje izvaja na naslednji način: protivirusnik pregleda vse procese v izvajanju in nato vse pripadajoče izvršilne datoteke za znanimi podpisi. Poenostavljeno, protivirusnik dejansko preveri le izvršilno datoteko, ki je izvedla proces. Le redki protivirusni programi dejansko izvajajo popoln, v realnem času izveden pregled pomnilnika.
Zdaj, ko poznamo osnovne načine delovanja protivirusne programske opreme, je postopek izmikanja več kot očiten - noben delček škodljive kode ne sme vsebovati znanih podpisov.
To lahko dosežemo na naslednje načine:
- napišemo namensko kodo,
- uporabimo "stiskalnik" (packer) ali "šifrirnik" (crypter),
- uporabimo pogon za mutacijo kode (code mutator engine).
Pisanje lastne, namenske kode je seveda optimalna rešitev, kajti ni ga protivirusnika, ki bi jo lahko odkril (v zadnjem času to ni več popolnoma res - beri okvir o tem), dokler se program ne razširi po medmrežju in lahko protivirusni razvijalci vnesejo njen podpis v zbirko virusov. Seveda pa ljudje večinoma niso programerji...
Uporaba stiskalnika ali šifrirnika je naslednja uporabna rešitev. Oglejmo si pobliže delovanje teh programov. Šifrirniki delujejo tako, da na kodi in podatkih v izvršljivi datoteki uporabijo specifičen šifrirni algoritem, s katerim prikrijejo sicer znani podpis. Novo nastala izvršljiva datoteka vsebuje šifrirane podatke in t. i. "stub". Stub je delček kode, ki vsebuje navodila oziroma ukaze, kako dešifrirati in rekonstruirati originalno datoteko. Proces rekonstrukcije se izvede dinamično, ob izvedbi šifriranega programa. Preprosto povedano, zašifrirana datoteka na disku je za protivirusne programe "varna in čista", ko pa jo zaženemo, deluje enako kakor originalen, nešifriran program.
Stiskalniki so enaki šifrirnikom, le da namesto šifrirnega uporabljajo stiskalni algoritem. S tem dosežemo dvoje. Poleg tega, da je "stisnjena" datoteka za protivirusnik neprepoznavna, je tudi manjše velikosti. Program UPX je le eden izmed mnogih, vendar najbolj znanih stiskalnikov.
S perspektive izdelovalcev protivirusne opreme so ti programi seveda velika grožnja. Na srečo je število splošno znanih ali komercialnih stiskalnikov in šifrirnikov razmeroma majhno, tako da podjetja ažurno dodajajo podpise odkritih primerkov v svoje zbirke. Nekateri protivirusniki za podrobnejše iskanje uporabljajo odkrite algoritme za dešifriranje in raztezanje.
Tu je treba omeniti pomembno dejstvo: vsi zasebni stiskalniki/šifrirniki so za protivirusne programe popolnoma neprepoznavni! Dokler se algoritem ne razširi po medmrežju in protivirusna podjetja njegovega podpisa ne vnesejo v virusno bazo, je datoteka, na kateri je bil algoritem uporabljen, za protivirusnik popolnoma nedolžna. Odličen program za odkrivanje šifriranih ali stisnjenih datotek je PEiD - v najnovejši različici prepozna več kakor 600 podpisov različnih stiskalnikov in šifrirnikov.
PEiD odkrije stiskalnik MEW (packer)
Najznamenitejši šifrirnik se imenuje Morphine, napisal pa ga je zloglasni heker Holy Father. Morphine vsebuje nalagalnik PE (PE loader), ki mu omogoča, da celotno izvorno sliko programa vnese v segment .text novo nastale izvršljive datoteke. Segment .text oz. .code je del pomnilniškega prostora izvršljive datoteke, v katerem so ukazi v strojnem jeziku. Segment .code je po definiciji namenjen le za branje. Če segment .text ni označen samo za branje, omogoča izvajanje kode, ki lahko med delom modificira lastne ukaze (self-modifying code). Ta šifrirnik vsebuje tudi polimorfičen mehanizem, s katerim generira naključni šifrirni algoritem. Morphine je prišel v javnost pomladi 2004, protivirusnim programerjem pa ni uspelo razviti generične odkrivanja zanj vse do jeseni 2005. Kot zanimivost, zasebna različica Morphina je še vedno neprepoznavna za vse protivirusne programe.
Zadnji način izmikanja, seveda le, če bo nekoč dokončno implementiran, bo najverjetneje pomenil konec protivirusnih programov z načinom delovanja, kakršnega poznamo danes. Zamisel je preprosta, a zelo zapletena. Mutator programske kode (code mutator) deluje po načelu zamenjave določenih ukazov (opcode) z drugimi, enakovrednimi ukazi. Na primer ukaz:
mov edx, eax (prekopira vrednost registra EAX v register EDX)
lahko mirno nadomestimo z ukazoma
push eax in pop edx
ZPervertor
CCryptor
Težava nastane, ko se sicer enakovredni ukazi razlikujejo po številu bajtov. S tem se spremeni t. i. offset ali relativni pomnilniški naslov. Ali, drugače, vsak nadaljnji ukaz za skok ali vejitev (jmp ali call) bo v najboljšem primeru zamaknjen za vsaj en bajt. Prav zaradi kompleksnosti procesa (zaenkrat) ni znanih mutatorjev kode, ki bi popolnoma in v celoti izvedli ta zapleteni postopek. Trenutno sta znani dve orodji: ZPervertor in CCryptor. Razvoj prvega je zamrl, razvoj drugega pa se približuje beta fazi. Čeprav sta obe javno dostopni različici le delno funkcionalni, je njun učinek na učinkovitost protivirusnih programov katastrofalen.
ZPervertor je prvi javno znani mutator programske kode. Napisal ga je nadarjeni ruski heker z0mbie. Optimalno delujoč mutator kode mora izvesti naslednje operacije:
- zamenjavo ukazov z enakovrednimi,
- preračun ukazov jmp in call; glede na število dodanih ali odvzetih zlogov,
- premet prej omenjenega "stuba".
Čeprav ZPervertor dejansko izvaja le prvi del, zamenjavo ukazov, le redki protivirusniki prepoznajo njegove modifikacije in odkrijejo prirejeno škodljivo kodo. Vsakdo, ki je po duši vsaj malo programerja, lahko požene disassembler ali urejevalnik šestnajstiškega zapisa (hex editor) in celoten postopek izvede ročno. Protivirusni programi postanejo nemočni. Neverjetno, a resnično.
Naslednja stopnja v razvoju mutatorjev kode je CCryptor. Ta izvaja tudi drugo opravilo našega idealnega mutatorja - preračunavanje ukazov jmp in call. Program je bil prvotno zamišljen kakor šifrirnik, a je s časom zrasel v najnaprednejši mutator kode. CCryptor trenutno ni javno dostopen, vendar je bil avtor zelo prijazen in nam je kodo poslal v preizkus. Rezultati so presegli vsa pričakovanja, kot se vidi s slik od 1 do 3.
Rezultati preizkusa mutiranja kode. Na prvi sliki rezultati protivirusnega preverjanja originalne datoteke, na drugi datoteke, spremenjene z ZPervertorjem, in na tretji datoteke, spremenjene s CCryptorjem.
Za redke uspehe protivirusnih programov je po avtorjevih besedah kriv nepremetani OEP (Offset of Entry Point, referenčna točka, v kateri se začne izvajanje programa) in statični "stub". Avtor zatrjuje, da je večino težav že odpravil in s posodobljenim mutacijskim algoritmom popolnoma porazil protivusnike. Zaenkrat ni znano, kdaj (če sploh) bo avtor izdal končno različico. Sicer pa se lahko (skoraj) vsem detekcijam izognemo že danes, s kombinirano uporabo obeh mutatorjev kode, kot je razvidno s slike 4.
Kombinacija obeh mutatorjev kode daje najboljše rezultate.
Kako lahko heker izkoristi arhaično iskanje protivirusnih programov, mutatorje kode in naš lažni občutek varnosti? Scenarijev je veliko. Programi, ki jih sodobni protivirusniki odkrivajo "z zaprtimi očmi", na primer BO2K, Sub7, Hacker Defender in podobni, zanje naenkrat postanejo neznanka. Še več, postanejo nenevarni in posledično neodkriti. Lično "zapakirani" s simpatično ikono in z imenom zabavne igrice pa preslepijo večino uporabnikov. Če uporabimo malce domišljije, je črni scenarij tak: nekaj mutatorjev kode naredi iz enega destruktivnega virusa v sorazmerno kratkem času nešteto funkcionalno enakovrednih, a "gensko" drugačnih virusov. Kaos!
Ko se bomo naslednjič počutili superiorno in neranljivo, saj nas bo varoval najnovejši in posodobljen protivirusni program, za trenutek postojmo in pomislimo znova...
Kaj pravijo izdelovalci protivirusnih programov
Članek smo še pred objavo poslali v vednost slovenskemu zastopniku za protivirusne programe Panda, ta pa ga je poslal strokovnemu uredniku za stike z javnostjo Pande - g. Fernandu de la Cuadru.
Ta pravi, da so protivirusniki v preteklosti dejansko gledali le podpise datotek, vendar že dalj časa ni več tako. Tudi šifriranje so menda že pred časom zelo dobro zaobšli in napisali svoj algoritem Generic Decryption Engine, katerega naslednik v njihovih protivirusnikih deluje tudi v 32-bitnih sistemih. Za brskanje po programski kodi uporabljajo celo svoj dekompiler, saj številni virusi preprečujejo dostop z običajnimi, znanimi dekompilerji. Pravi tudi, da znajo odpakirati večino virusov, ki so stisnjeni, za nekatere pa imajo razvite posebne, ločene programe. Kar zadeva mutacije, priznava, da so z njimi težave. Zaenkrat menda res ni skoraj nobenega virusa, ki bi uporabljal ta sistem, a imajo zanje razvit poseben sistem odkrivanja. Ta ni generičen za vse viruse, saj bi bil prezahteven in bi terjal preveč procesorskega časa.
Predvsem pa trdi, da se protivirusna podjetja počasi preusmerjajo na preprečevanje okužbe na podlagi opazovanja delovanja programov. Kakorkoli že je virus stisnjen, zašifriran ali mutiran, ob zagonu se vede kot vsak drug program, vendar "z zlimi nameni". Morda bo poskušal odpreti kakšna omrežna vrata IP, morda se bo poskušal namestiti v sistemski imenik, popraviti ključni del registra ali podobno. Tehnologije, ki jih pri Pandi imenujejo TruPrevent, naj bi take programe izsledile.
Uporabne povezave:
www.microsoft.com/whdc/system/platform/firmware/PECOFF.mspx
www.intel.com/design/pentium/manuals