
În urma analizei aplicațiilor mobile prin reverse engineering, devine evident că multe dintre riscurile de securitate nu sunt cauzate de intenții malițioase, ci de lipsa unor practici de dezvoltare sigure. Multe aplicații ajung în magazinele oficiale fără măsuri de bază de protecție, iar utilizatorii sunt expuși la colectări de date nejustificate, comportamente opace sau vulnerabilități critice. Prin urmare, una dintre cele mai importante contribuții pe care o poate aduce un analist de securitate este formularea de recomandări clare pentru dezvoltatori.
Scopul acestei lecții este să sintetizeze acele recomandări care pot îmbunătăți securitatea unei aplicații, fără a compromite experiența utilizatorului sau performanța aplicației. Aceste sugestii se bazează pe greșelile identificate frecvent în aplicații analizate și pot fi aplicate de orice echipă de dezvoltare, indiferent de nivelul tehnic.
Securizarea codului sursă și a aplicației
Una dintre cele mai mari greșeli este presupunerea că, odată compilat, codul sursă este inaccesibil. În realitate, oricine poate decompila o aplicație Android cu unelte gratuite, și poate observa cum funcționează aplicația, ce biblioteci include, cum tratează datele sau ce chei API folosește.
Pentru a limita aceste riscuri, se recomandă:
🔹 Ofuscarea codului: utilizarea de unelte precum ProGuard sau R8 pentru a ascunde numele claselor, metodelor și variabilelor. Astfel, codul devine mai greu de înțeles pentru un atacator.
🔹 Eliminarea string-urilor sensibile: nu salva parole, chei API, tokenuri de acces sau URL-uri critice direct în cod. Acestea trebuie stocate în mod criptat sau obținute dintr-un server securizat.
🔹 Verificarea integrității aplicației: implementarea de mecanisme prin care aplicația detectează dacă a fost modificată (ex: semnătura digitală sau checksum-uri).
Un cod bine protejat nu face aplicația impenetrabilă, dar crește efortul necesar pentru a o ataca și descurajează tentativele de inginerie inversă amatoricească.
Gestionarea datelor utilizatorului
Orice aplicație mobilă interacționează într-un fel sau altul cu datele utilizatorului – de la informații de bază, cum ar fi nume și email, până la date sensibile, cum ar fi locația, contactele sau mesajele. Modul în care aceste date sunt colectate, procesate și transmise trebuie să respecte atât standardele tehnice, cât și reglementările legale (ex: GDPR).
Cele mai importante bune practici includ:
🔹 Solicită doar permisiunile absolut necesare. Dacă aplicația ta nu are nevoie de acces la microfon sau contacte, nu cere aceste permisiuni doar „în caz că”. Permisiunile excesive sunt un semnal de alarmă pentru utilizatori și pot duce la respingerea aplicației în review.
🔹 Informează clar utilizatorul despre ce date colectezi, de ce le colectezi și cum le folosești. Politica de confidențialitate nu trebuie să fie doar o formalitate, ci un document clar și ușor de înțeles.
🔹 Transmite toate datele în mod securizat, prin canale criptate (HTTPS cu certificate valide, SSL pinning dacă este posibil).
🔹 Nu păstra local date sensibile, sau dacă este absolut necesar, criptează-le și protejează-le cu mecanisme suplimentare (ex: autentificare biometrică).
Un aspect adesea neglijat este modul în care aplicația reacționează la pierderea conexiunii, schimbări de rețea sau resetări de dispozitiv. În toate aceste cazuri, datele nu trebuie să se piardă, dar nici să fie expuse accidental.
Apărare împotriva atacurilor comune
O aplicație mobilă nu trebuie să se teamă doar de ingineria inversă, ci și de atacuri externe directe: interceptarea traficului, injectarea de cod sau exploatarea de funcții slab protejate. De aceea, este important să incluzi și măsuri de apărare la nivel de runtime.
Câteva recomandări utile:
🔹 Verifică mediul de execuție: detectează dacă aplicația rulează într-un emulator sau este debug-uită. Deși nu trebuie să blochezi complet rularea în aceste condiții, poți limita accesul la anumite funcții.
🔹 Implementează rate limiting pentru acțiuni critice (ex: login, trimitere coduri, resetare parole). Astfel, reduci riscul atacurilor de tip brute-force.
🔹 Evită comenzi de sistem sau execuții dinamice de cod care pot fi manipulate de atacatori.
🔹 Folosește standarde moderne de criptare (AES, RSA, HMAC) și evită reinventarea roții – nu scrie propriile funcții de criptare.
Toate aceste măsuri nu doar că protejează utilizatorul, ci și reputația aplicației și a companiei care o dezvoltă.
Testing și audit periodic
Nu în ultimul rând, aplicațiile trebuie testate constant – nu doar când sunt lansate, ci și pe parcursul actualizărilor. Un update banal poate introduce o vulnerabilitate critică. De aceea, testarea de securitate trebuie să facă parte din ciclul de viață al produsului.
Două liste esențiale:
1. Teste automate:
🔹 Scannere de permisiuni
🔹 Verificări statice de cod (lint, analyzers)
🔹 Integrare cu CI/CD (ex: MobSF CLI)
2. Audituri externe:
🔹 Penetration testing anual
🔹 Revizuirea manuală a aplicației de către experți externi
🔹 Simulări de atac în sandbox-uri controlate
Dacă ești dezvoltator, implică echipa de securitate de la început. Dacă ești analist, include aceste recomandări în rapoartele tale și oferă exemple concrete.
Această lecție este puntea dintre analiza tehnică și schimbarea reală. În următoarea lecție vom vorbi despre cum poți proteja propriile aplicații împotriva tipurilor de atac pe care le-ai învățat până acum să le recunoști.