Un ghid: Ingineria inversă a obscurării codului

Publicat: 2021-11-17

Cifrele de ofuscare a codului sunt una dintre cele mai populare abordări de securitate a aplicațiilor pentru prevenirea hacking-ului aplicațiilor. Este unul dintre cele mai frecvent sugerate eforturi AppSec de către specialiștii în securitate din întreaga lume și adesea se ocupă de cerințele minime de securitate ale aplicației dvs. Această strategie este folosită frecvent ca mecanism de apărare major împotriva tentativelor de hacking și protejează împotriva amenințărilor tipice, cum ar fi injectarea de cod, inginerie inversă și manipularea informațiilor personale ale clienților și utilizatorilor aplicației.

Ofucarea codului?

Practica de ofuscare a executabilelor astfel încât să nu mai fie de înțeles, inteligibil sau practic este cunoscută sub denumirea de ofuscare a codului. Codul sursă a fost ascuns în măsura în care este de neînțeles și greu de înțeles de către o terță parte, cu atât mai puțin de executat. Interfața utilizatorului final sau rezultatul dorit al codului nu sunt afectate de obscuritate. Este doar un pas de precauție pentru a face codul inutil oricărui potențial hacker care are acces la codul executabil al unui software.

De ce este necesar să ofuscați codul?

Ofucarea codului este deosebit de importantă pentru software-ul open-source, care au un dezavantaj semnificativ în ceea ce privește hackabilityul în beneficiul personal. Dezvoltatorii garantează că proprietatea intelectuală a produsului lor este protejată împotriva riscurilor de securitate, a accesului ilegal și a descoperirii defectelor aplicației, făcând un program dificil de reverse engineering.

Indiferent de tipul de tehnică de obturare utilizat, această abordare restricționează codul sursă periculos și asigură niveluri variate de securitate a programului. Motivele legate de timp, cost și resurse favorizează abandonarea codului atunci când acesta este înfundat, deoarece codul decompilat devine ilizibil.

Tehnici pentru ofuscarea codului

Obfuscarea funcționează la diferite niveluri: poate fi implementată la nivelul structurii codului semantic/lexical sau la nivelul structurii datelor/fluxului de control. Strategiile de ofuscare diferă și ele în funcție de acțiunea asupra codului. În esență, echipa de securitate determină tipul de ofuscare de utilizat pe cod în cooperare cu echipa de dezvoltare.

Obfuscarea ar trebui redenumită.

Această abordare presupune denumirea confuză a variabilelor, astfel încât scopul real al utilizării lor să fie ascuns inteligent. Decompilatorii înțeleg cu greu fluxul de control, deoarece metodele și variabilele sunt redenumite cu diferite notații și numere. Această metodă de ofuscare este folosită în mod obișnuit pentru a deghiza codul aplicației Java, .NET și Android. Acest lucru este clasificat ca ofuscarea aspectului, deoarece vizează direct codul sursă pentru a oferi un strat de protecție pentru aplicație.

Ofucarea datelor

Această metodă se concentrează pe structurile de date utilizate în cod, făcând imposibil ca hackerul să acceseze adevăratul scop al programului. Acest lucru poate implica modificarea modului în care datele sunt stocate în memorie de către software și a modului în care aceste date sunt procesate pentru a produce rezultatul final. Această procedură poate fi efectuată în mai multe moduri:

1. Obscurcarea agregării
Modul în care datele sunt salvate în software se modifică ca urmare a acestui fapt. Matricele, de exemplu, pot fi împărțite în mai multe sub-matrice care ar putea fi apoi referite în întregul program.

2. Obscurcarea stocării datelor
Acest lucru are un impact asupra modului în care datele sunt stocate în memorie. Dezvoltatorii pot, de exemplu, să amestece între stocarea variabilă locală și globală pentru a ascunde adevărata natură a comportamentului variabilelor.

3. Obținerea ofuscarii la cerere
Această abordare modifică ordinea datelor fără a modifica funcționalitatea programului/fragmentului de cod. Dezvoltatorii realizează acest lucru prin crearea unui modul distinct care este invocat pentru fiecare instanță a referinței variabilei.

4. Criptarea șirurilor
Această tehnică criptează toate șirurile care pot fi citite, rezultând un cod ilizibil. Când software-ul este rulat, acestea trebuie decriptate în timpul rulării.

5. Obfuzarea fluxului de control/cod
Modul în care controlul este transmis de la o parte a bazei de cod la alta este crucială în stabilirea scopului programului. Obscurcarea acestui flux este adesea cea mai profitabilă modalitate de a perverti fluxul jocului. Această strategie de înfundare îi ține pe hackeri la distanță, făcându-le dificil să-și dea seama cum și de ce codul urmează o anumită cale.

Includerea instrucțiunilor aleatoare și neașteptate, precum și a instrucțiunilor inutile de comutare a cazurilor (cod mort) care nu ar fi niciodată executate, este una dintre cele mai răspândite modalități de a realiza această strategie de ofuscare. Aceste afirmații nu au altă funcție decât aceea de a nedumeri hackerul vizat. În cazul orientării condiționate a programului, această modificare a secvenței instrucțiunilor de execuție a programului este extrem de utilă.

Obfuscarea este în curs de depanare.

Informațiile de depanare sunt frecvent utile pentru a determina informații vitale despre fluxul programului și defectele prin decompilarea și recompilarea codului sursă. Este esențial să ascundem astfel de date de identificare modificându-le identitățile, numerele de linii sau dezactivând complet accesul la datele de depanare.

Obuscarea ar trebui abordată.

Greșelile de programare a memoriei s-au răspândit pe scară largă în atacuri, în special în limbajele care nu sunt sigure pentru memorie, cum ar fi C și C++. Defectele de securitate sunt cauzate frecvent de erori, cum ar fi accesul necontrolat la matrice. Abordarea de ofuscare a adreselor face dificilă ingineria inversă, deoarece adresele virtuale ale codului și datele programului sunt randomizate de fiecare dată când se realizează codul convertit. Ca urmare, majoritatea atacurilor de eroare de memorie sunt nedeterministe, cu o probabilitate foarte scăzută de succes.

Codare personalizată

Dezvoltatorii folosesc această abordare pentru a cripta șirurile cu un algoritm personalizat și apoi oferă o funcție de decodor pentru a recupera codul original.

Argumentele trecute la Runtime

Este posibil să modificați programul astfel încât să aștepte parametrii în timpul rulării. Pentru a decoda variabilele, utilizatorul trebuie să aibă atât codul, cât și cheia de decriptare.

Pentru a dezvolta o metodă de apărare stratificată pentru protejarea aplicațiilor împotriva diverselor amenințări de securitate, echipa de securitate poate alege să implementeze mai multe tehnici în același timp.

Concluzie

Pe scurt, direcționarea greșită este ineficientă în combaterea problemelor avansate de securitate. Este mai dificil să defuscați codul din cauza disponibilității software-ului IA și a priceperii hackerilor, dar nu este imposibil. Prin urmare, criptografie nu este un panaceu pentru toate problemele de securitate software.
Echipa de dezvoltare ar putea folosi o varietate de abordări de ofuscare a codului pentru a-și securiza codul într-un mediu neîncrezat, în funcție de nevoia de securitate, natura programului și standardul de performanță. Acestea trebuie efectuate ținând cont de avantajele și dezavantajele fiecărei abordări. Alte inițiative AppSec, cum ar fi criptarea, RASP, reglementările privind păstrarea datelor și așa mai departe, ar trebui să fie susținute de această strategie. Atunci când este combinat cu soluții RASP precum AppSealing, devine un antidot puternic pentru problemele de securitate de astăzi.