Compania Checkpoint un mecanism de protecție Safe-Linking, care complică crearea de exploate ce manipulează definiția sau modificarea indicatoarelor către buffer-ele alocate în timpul apelului malloc. Safe-Linking nu blochează complet posibilitatea exploatării vulnerabilităților, dar cu un cost minimal complică semnificativ crearea unor categorii de exploate, deoarece, pe lângă exploatarea supraîncărcării buffer-ului, este necesar să se găsească încă o vulnerabilitate care să provoace o scurgere de informații despre plasarea heap-ului în memorie.
Patch-urile cu implementarea Safe-Linking sunt pregătite pentru Glibc (ptmalloc), uClibc-NG (dlmalloc), gperftools (tcmalloc) și Google TCMalloc, și de asemenea au fost propuse pentru modernizarea protecției în Chromium (în
Chromium din 2012 este deja integrată o tehnică de protecție MaskPtr, care vizează soluționarea aceleași probleme, dar soluția de la Checkpoint demonstrează o performanță mai ridicată).
Patch-urile propuse sunt deja aprobate pentru livrare în versiunea din august și utilizarea Safe-Linking va fi inclusă implicit. În uClibc-NG, suportul pentru Safe-Linking face parte din versiunea 1.0.33 și este inclus implicit. În gperftools (vechiul tcmalloc) modificările , dar vor fi propuse într-una din viitoarele versiuni ca opțiune.
Dezvoltatori (noul tcmalloc) a refuzat să fie acceptat , invocând o scădere semnificativă a performanței și necesitatea adăugării de teste extinse pentru verificarea regulată a faptului că totul funcționează corect. Testarea efectuată de inginerii Checkpoint a arătat că metoda Safe-Linking nu duce la un consum suplimentar de memorie, iar performanța în efectuarea operațiunilor cu heap-ul scade în medie cu doar 0.02%, iar în cele mai rele circumstanțe cu 1.5% (pentru comparație, costurile în metoda folosită în Chromium sunt estimate ca „mai puțin de 2%”). Activarea
Safe-Linking duce la executarea a 2-3 instrucțiuni assembly suplimentare la fiecare apel free() și 3-4 instrucțiuni la apelul malloc(). Rularea stadiilor de inițializare și generare de valori aleatorii nu este necesară.
Safe-Linking poate fi utilizat nu doar pentru a spori securitatea diverselor implementări ale heap-ului, ci și pentru a adăuga mecanisme de control al integrității în orice structuri de date care folosesc liste simple de pointeri, plasate lângă buffer-urile în sine. Metoda este foarte simplă de implementat și necesită doar adăugarea unei macrocomenzi și aplicarea acesteia pe pointerii către următorul bloc din cod (de exemplu, pentru Glibc doar câteva linii în cod). Metoda constă în următoarele modificări:
+#define PROTECT_PTR(pos, ptr) \
+ ((__typeof (ptr)) ((((size_t) pos) >> 12) ^ ((size_t) ptr)))
+#define REVEAL_PTR(ptr) PROTECT_PTR (&ptr, ptr)
— nextp = p->fd;
+ nextp = REVEAL_PTR (p->fd);
…
Esenta metodei constă în aplicarea datelor aleatoare de la mecanismul de randomizare a adreselor ASLR (mmap_base) pentru a proteja listele simple, cum ar fi Fast-Bins și TCache. Înainte de aplicarea valorii pointerului către următorul element din listă, se efectuează o transformare prin mascare și o verificare a aliniamentului pe limita paginii de memorie. Pointerul este înlocuit cu rezultatul operației „(L >> PAGE_SHIFT) XOR (P)”, unde P este valoarea pointerului, iar L este locația din memorie unde este stocat acest pointer.
Când este utilizat în sistem (Address Space Layout Randomization) o parte din biții L cu adresa de bază a heap-ului conțin valori aleatoare, care sunt utilizate ca o cheie pentru codificarea P (sunt extrase prin operația de deplasare cu 12 biți pentru paginile de 4096 de bytes). O astfel de manipulare reduce riscul capturării pointerului în exploit-uri, deoarece pointerul nu este stocat în forma sa originală și pentru a-l înlocui este necesar să se cunoască informațiile despre alocarea heap-ului. În plus, în codul patch-ului există, de asemenea, o verificare suplimentară a aliniamentului blocului, care nu permite atacatorului să înlocuiască pointerul cu o valoare nealiniată și necesită cunoașterea numărului de biți cu care s-a efectuat alinierea, ceea ce pe sistemele pe 64 de biți blochează suplimentar 15 din 16 încercări de atac, neținând cont de aliniere.
Metoda este eficientă pentru a proteja împotriva atacurilor care utilizează redefinirea parțială a pointerilor (modificarea biților inferiori), rescrierea completă a pointerilor (redirijarea către codul atacatorului) și schimbarea poziției listei la o adresă nealiniată. Ca exemplu, s-a arătat că aplicarea Safe-Linking în malloc ar bloca exploatarea recentă. de către aceiași cercetători vulnerabilități în iluminarea inteligentă Philips Hue Bridge, cauzată de un overflow de buffer care permite preluarea controlului asupra dispozitivului.
Sursa: opennet.ro
