Documente Academic
Documente Profesional
Documente Cultură
Limbajele Java i .Net care la ora actual sunt cele mai folosite platforme de dezvoltare de noi aplica ii informatice se folosesc de o ma in virtual care interpreteaz i execut cod la run-time. Codul executat de aceste ma ini virtuale nu este cod ma in ca la limbajele clasice, ci un cod intermediar foarte flexibil. n Java i .Net, prin compilare se ob ine acest cod intermediar ce con ine i foarte multe dintre informa iile existente n codul surs . Acest fapt face ca opera ia de decompilare s fie relativ u oar , n orice caz, mai u oar dect n cazul codului ma in . Firmele produc toare de aplica ii software trebuie s se confrunte acum cu riscul de a cheltui multe resurse pentru dezvoltarea unui proiect i de a accepta posibilitatea ca un competitor s fac reverseengineering i s ob in f r mare efort biblioteci, algoritmi sau ntregi aplica ii la care pot schimba doar interfa a. n acela i timp, utilizatori, sau alte persoane r u-voitoare pot folosi acelea i tehnici de reverse-engineering pentru a modifica aplica iile respective n sensul elimin rii protec iilor la copiere, verific rilor de licen e, etc. n ambele cazuri se ajunge la pierderi financiare mari i deci se impun m suri de protec ie. Vom examina cteva tehnici de protec ie care pot ngreuna opera iile de reverseengineering iar n capitolele din partea a doua a acestei lucr ri ne vom opri mai mult asupra tehnicii obfusc rii i a protej rii prin polimorfism.
general, reverse-engineeringul urm re te analiza unui sistem existent (nu este important pentru tehnic cine este proprietarul acestui sistem). n sine, tehnicile de reverseengineering nu sunt ilegale sau imorale, ele fiind folosite pe scar larg pentru a mbun t ii produsele proprii. n urma folosirii acestor tehnici se pot descoperi gre eli n designul original al sistemului, se pot detecta redundan e sau se pot urm ri fluxuri de efectuare a unor opera ii. n domeniul ingineriei, reverse-engineeringul ia un produs finit i reconstituie cuno tin ele necesare pentru a re-crea acest produs. Procesele de fabrica ie i uneltele nu sunt deloc u or de reprodus, n contrast cu reproducerea unui program din domeniul software unde tot ce trebuie f cut este s se reproduc o secven de octe i ce alc tuiesc programul respectiv. Partea dificil a opera iei de reverse-engineering este ns crearea unei baze de cuno tin e despre programul analizat care s fie suficient pentru ca acesta s poat fi modificat, s se poat adapta p r i din el sau s poat fi interfa at cu diverse alte module. nsu i faptul c este mult mai u or s se copieze software dec t alte produse cu existen a fizic oblig produc torii din acest domeniu s pun un accent pe protejarea drepturilor legale de copyright asupra aplica iilor. Pentru a putea ncepe o analiza de reverse-engineering asupra unei aplica ii software trebuie ca nti acea aplica ie s fie accesibil fizic. Folosind dezasambloare i decompilatoare se poate ob ine codul surs i se poate analiza fluxul programului i structurile de date. Aceast analiz se poate face cu ajutorul unor unelte suplimentare. Una dintre cele mai importante utiliz ri legitime ale tehnicilor de reverseengineering este recuperarea informa iilor pierdute despre un sistem. Spre exemplu, multe companii folosesc nc programe foarte vechi pentru c respectivul sistem este func ional i ofer acces la un anumit volum de date importante. Este i cazul aplica iilor care au fost scrise n COBOL care uneori mai sunt p strate numai pentru c sunt singurele care pot accesa nregistr ri vechi. n multe cazuri, sursele acestor programe nu mai sunt disponibile ntr-o form utilizabil (n unele cazuri ele exist dar pot fi stocate pe un suport care azi este aproape imposibil de accesat: cartele perforate). Un efort important a fost f cut naintea anului 2000 cnd un mare num r de aplica ii vechi au fost supuse procesului de reverse-engineering pentru a putea ob ine codul surs i a-l modifica astfel nct s poat face fa a problemei anului 20001. Prin extragerea algoritmilor proprietari i a structurilor de date dintr-o aplica ie competitoare i prin incorporarea acestora n propria aplica ie se reduce n mod dramatic costul proiectului i timpul petrecut pentru faza de analiz , dezvoltare i chiar teste deoarece algoritmii prelua i sunt deja verifica i. n plus, dovedirea faptului c un algoritm sau anumite par i dintr-o aplica ie au fost furate este infinit mai dificil dect n cazul furtului ntregii aplica ii. Aceasta nseamn c ob inerea unor compensa ii pentru veniturile pierdute este foarte dificil n aceste cazuri iar micile companii sau dezvoltatorii independen i nu i vor permite s poarte procese lungi cu o companie puternica ce are n spate avoca i puternici. De la apari ia limbajului Java i, mai trziu, a limbajelor care func ioneaz pe platforma .Net amenin area asupra aplica iilor a devenit mult mai serioas . Aceste limbaje sunt proiectate s compileze codul surs ntr-un limbaj independent de platform care folose te bytecodes. Codul intermediar este un limbaj puternic, spre deosebire de codul ma ina i, din aceast cauz , o cantitate mare din informa ia care este prezent n codul surs trece n codul intermediar f cnd decompilarea mult mai facil . Se folosesc de asemenea foarte multe func ii de libr rie care fac programele s fie mici i u or de
1
Problema anului 2000 = bug al sistemelor informatice provenit din faptul ca pentru campuri ce stocau anul dintr-o dat calendaristic erau prevazute doar doua cifre.
33
urm rit. Aceasta pe lng faptul c limbajul intermediar fiind puternic deja necesit un num r redus de instruc iuni pentru implementarea unui program.
(b) este prezentat schematic i aceast configura ie cu execu ie par ial pe server a codului.
Figura 3.2.1. Protejarea aplica iilor prin execu ie server side (a) i par ial server-side (b) Executarea par ial pe server va avea acelea i beneficii ca i executarea total pe server, beneficii ce vin din faptul c partea ce se dore te a fi protejat nu este accesibil fizic. n plus se va beneficia i de performan e mai bune atunci cnd se vor executa p r ile din program care au r mas locale pe ma ina utilizatorului. n construirea arhitecturii acestui gen de aplica ii trebuie avut mereu n vedere volumul de informa ii ce va fi transferat ntre client i server. De asemenea trebuie considerat i frecven a comunica iilor efectuate ntre cele doua p r i ale aplica iei. Se fac de obicei compromisuri ntre nivelul de protec ie i viteza de excecu ie. n afar de protec ia aplica iilor, arhitecturile client-server mai au multe alte avantaje pe care ns nu le vom discuta aici nefiind relevante pentru domeniul nostru de studiu.
35
Protejarea prin criptare. Pentru a se elimina dezavantajele relative la performan ele aplica iilor care au fost sparte ntr-o arhitectur client-server din motive de protec ie a codului trebuiesc folosite metode care s protejeze codul direct accesibil unui utilizator pe ma ina pe care acesta ruleaz . Criptarea codului distribuit este una dintre aceste metode (n figura 3.2.2. este o reprezentare schematic ). Interceptarea i decriptarea codului compilat sunt posibile ns cu excep ia cazului n care decriptarea se face la nivel hardware. Sisteme hardware de decriptare exist i sunt descrise n diverse lucr ri precum cea a lui Amir Herzberg i Shlomit S. Pinter - Public Protection of Software [90] sau O. G. Wilhelm Criptographically Protected Objects [91]. Ideea este existen a unui procesor suplimentar (un cip dedicat) care s decripteze instruc iunile nainte ca acestea s fie executate de c tre procesorul principal al calculatorului pe care se execut aplica ia. Codul decriptat nu va fi niciodat p strat n memoria ce este accesibil utilizatorului sau altor programe ce ruleaz n paralel deci gradul de protec ie depinde de schema de criptare folosit pentru codul programului.
Figura 3.2.2. Protejarea prin criptare. Aplica iile protejate prin criptare pot fi programate s nu se execute dect dac cipul componenta hardware de decriptare este conectat la ma ina pe care se ncearc lansarea. n consecin , pentru a putea rula aplica ia pe orice ma in , cel ce va ncerca s o copieze i s o foloseasc va trebui s reu easc doua opera ii: S sparg schema de criptare; S modifice codul n a a fel nct verificarea existen ei cipului de decriptare s fie anulat . Problemele folosirii unui sistem de criptare care se bazeaz pe existen a unui cip de decriptare hardware vin din varietatea mare de procesoare folosite la ora actual pe pia a IT. Procesoarele acestea diferite vor avea nevoie de circuite de interfa are diferite pentru comunica ia cu cipul de decriptare. n consecin , acest mod de protec ie este aplicabil numai n cazul aplica iilor care sunt destinate s ruleze numai pe un set redus de procesoare sau pe un singur procesor pentru care exist deja interfa are cu cipul de decriptare folosit. De asemenea, ad ugarea unui cip de criptare oblig utilizatorii s pl teasc o sum suplimentar care nu le aduce nici o plus-valoare direct ci aduce beneficii numai produc torului aplica iei respective.
36
Protejarea cu ajutorul codului nativ semnat (Signed Native Code). Aplica iile Java i .Net sunt executate de c tre o ma in virtual care implementeaz un interpretor. Aceasta nseamn c aplica iile scrise folosind aceste tehnologii se vor executa ceva mai ncet dect aplica iile clasice scrise n limbaje ce se compileaz direct n cod ma in . Pe de alt parte vor avea avantajul portabilit ii. Pentru a mbun t ii viteza de execu ie n cazul aplica iilor Java au fost dezvoltate compilatoare just-in-time (JIT) ce traduc bytecodes Java n cod nativ exact la momentul rul rii aplica iei. Codul nativ ob inut este apoi executat n locul acelor bytecodes ce au fost tradu i. Exist un num r destul de mare de compilatoare just-in-time disponibile pentru o varietate de sisteme de operare. Anumite companii au inclus compilatorul JIT direct n kitul lor pentru platforma de dezvoltare, exemple fiind Borland Jbuilder [92] i Microsoft Visual J++ [93]. Pentru a evita consumarea de timp pentru compilare de fiecare dat cnd aceea i bucat de cod este executat pe aceea i ma in este posibil p strarea codului ma in deja compilat. Tehnologia care permite acest lucru este cunoscut sub numele de compilare way-ahead-of-time (WAT compilation). Exist deja pe pia mai multe compilatoare WAT pentru Java cum ar fi NET [94] i Toba [95]. Compilatoarele JIT i WAT pot fi folosite pentru a transforma codul intermediar (Java bytecodes) n cod ma in care este mult mai greu de decompilat i urm rit. Aplica ia ce este distribuit este astfel nti compilat cu un compilator standard de Java i nc rcat pe un server. Clien ii care cump r acea aplica ie identific o combina ie de arhitectur i sistem de operare n care se va lucra iar serverul despre care am vorbit le va furniza o versiune a acelei aplica ii direct n cod nativ pentru mediul respectiv. Faptul de a putea accesa numai codul nativ rezultat va ngreuna foarte mult dar n nici un caz nu va face imposibil o opera ie de reverse-engineering. Exist multe decompilatoare foarte performante care traduc cod ma in n cod surs C [96]. Ca nivel de protec ie oferit , distribuirea aplica iei n cod nativ nu ofer acela i nivel precum dispozitivele hardware de criptare. n plus, este necesar cte un compilator JIT sau WAT care s compileze aplica ia n cod nativ pentru fiecare arhitectur / sistem de operare ce pot fi ntlnite la clien ii poten iali. Deja portabilitatea aplica iei va fi redus la sistemele pentru care compilatoarele JIT sau WAT disponibile pot genera cod.
Figura 3.2.3. Protejarea prin distribuire de cod nativ semnat. n cazul aplica iilor scrise n limbajul Java mai exist o problem suplimentar legat de distribuirea direct a codului nativ. Spre deosebire de Java bytecodes, codul nativ nu mai este supus opera iei de bytecode verification care se efectueaz naintea execu iei. Deci n cazul codului nativ nu mai putem avea garan ia c acesta se va executa 37
f r s efectueze ac iuni ilegale precum coruperea unor fi iere utilizator. Aceasta nu este o problema n cazurile n care firma produc toare a aplica iei este o cas de software cunoscut i este evident c nu se vor a tepta ac iuni r u inten ionate de la codul distribuit de aceasta. Pentru a evita confuziile, companiile dezvoltatoare i semneaz digital [97] codul transmis, garantnd astfel clien ilor sau utilizatorilor autoriza i c respectiva aplica ie este cea original (figura 3.2.3.). Protejarea prin obfuscarea codului (code obfuscation). Am l sat ca ultim metod de protec ie prezentat n aceast sec iune obfuscarea codului. Ideea este transformarea unei aplica ii astfel nct aceasta s fie func ional identic relativ la original dar s fie mult mai greu de n eles. Companiile dezvoltatoare folosesc utilitare numite obfuscatoare pentru protejarea aplica iei (figura 3.2.4.). n orice caz, trebuie avut n vedere faptul c , spre deosebire de execu ia server-side, obfuscarea nu ofer o protec ie complet mpotriva atacurilor mali ioase de tip reverse-engineering. Cheltuind o cantitate suficient de timp i efort va fi posibil recuperarea algoritmilor i a structurilor de date importante din aplica ia avut n vedere. De data aceasta se va folosi un utilitar numit de-obfuscator care va ncerca s inverseze transform rile la care a fost supus aplica ia pentru a fi protejat .
Figura 3.2.4.Protejarea prin obfuscarea codului. Nivelul de securitate oferit de un obfuscator mpotriva opera iilor de reverseengineering depinde de: Complexitatea transform rilor folosite de obfuscator; Puterea algoritmilor de de-obfuscare; Cantitatea de resurse (n principal timp) care sunt disponibile pentru deobfuscator. Obfuscarea codului face codul respectiv mult mai greu de n eles p strnd n acela i timp i independen a de platform a acestuia. Este inutil modificarea aplica iilor transformate astfel nct acestea s depind de diverse particularit i ale unui sistem de operare sau ale unor componente hardware n cazurile cnd aceste aplica ii au fost scrise n limbaje create special pentru a facilita portabilitatea. Spre deosebire de execu ia server-side, o aplica ie obfuscat nu va suferi n plus din cauza limit rilor traficului de re ea i a disponibilit ii acesteia. Obfuscarea nu va necesita hardware suplimentar precum n cazul protec iei prin criptare iar verificatorul din cazul lui Java va putea s i 38
fac treaba i s previna executarea unor opera ii ilegale de c tre codul executat. Spre deosebire de codul nativ, n cazul obfusc rii nu este necesar nici un fel de semnare digital a aplica iilor pentru a dovedi c respectivul cod provine dintr-o surs de ncredere.
Figura 3.3.1. Combinarea metodelor de protec ie. Aplicarea unui reverse-engineering asupra codului rezultat va fi considerabil mai dificil deoarece sunt mul i pa i care vor trebui inversa i pentru a ajunge la codul surs ini ial.
39