Společnost Checkpoint ochranný mechanismus Safe-Linking, který komplikuje vytváření exploitů manipulujících s definicí nebo změnou ukazatelů na paměťové buffery alokované při volání malloc. Safe-Linking zcela neblokuje možnost využití zranitelností, ale s minimálními náklady výrazně ztěžuje vytváření některých kategorií exploitů, protože kromě exploatovaného přetečení bufferu je třeba najít ještě jednu zranitelnost, která způsobuje únik informací o umístění haldy (heap) v paměti.
Záplaty s implementací Safe-Linking byly připraveny pro Glibc (ptmalloc), uClibc-NG (dlmalloc), gperftools (tcmalloc) a Google TCMalloc, a také jsou navrženy pro modernizaci ochrany v Chromiu (v
Chromiu je od roku 2012 již integrovaná technika ochrany MaskPtr, zaměřená na řešení stejného problému, ale řešení od Checkpoint vykazuje vyšší výkon).
Navrhované záplaty již byly schváleny pro dodání v srpnovém vydání a použití Safe-Linking bude zahrnuto jako standardní. Podpora Safe-Linking v uClibc-NG zahrnuta do vydání 1.0.33 a je zahrnuta jako standardní. V gperftools (starý tcmalloc) změny , ale budou nabídnuty v některém z budoucích vydání jako volba.
Vývojáři nový tcmalloc byl odmítnut, s odkazem na výrazné snížení výkonu a potřebu přidání rozšířených testů pro pravidelné ověřování, že vše funguje správně. Testování inženýry Checkpoint ukázalo, že metoda Safe-Linking nezpůsobuje dodatečné náklady na paměť, a výkon při manipulaci s haldou se v průměru snižuje pouze o 0,02 % a v nejhorším případě o 1,5 % (pro srovnání náklady v metodě použitou v Chromiu jsou odhadovány na „méně než 2 %“). Zapnutí
Safe-Linking vede k vykonání 2-3 dodatečných assemblerových instrukcí při každém volání free() a 3-4 instrukcí při volání malloc(). Není nutné spouštět fáze inicializace a generování náhodných hodnot.
Safe-Linking může být použit nejen k zvýšení bezpečnosti různých implementací haldy (heap), ale také k přidání prostředků pro kontrolu integrity do jakýchkoli datových struktur, v nichž se používají jednosměrné seznamy ukazatelů umístěné poblíž samotných bufferů. Metoda je velmi jednoduchá na implementaci a vyžaduje pouze přidání jednoho makra a jeho použití na ukazatele na další blok v kódu (například pro Glibc pouze několik řádků kódu). Metoda spočívá v následujících změnách:
+#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);
…
Podstatou metody je použití náhodných dat z mechanismu náhodného rozložení adres ASLR (mmap_base) k ochraně jednosměrných seznamů, jako jsou Fast-Bins a TCache. Před použitím na hodnotu ukazatele na další prvek v seznamu se provádí transformace pomocí masky a kontrola zarovnání na hranici paměťové stránky. Ukazatel je nahrazen výsledkem operace „(L >> PAGE_SHIFT) XOR (P)“, kde P je hodnota ukazatele a L je umístění v paměti, kde je tento ukazatel uložen.
Při použití v systému (Náhodné rozložení adresového prostoru) část bitů L s základní adresou haldy obsahuje náhodné hodnoty, které se používají jako klíč k zakódování P (extrahovány operací posunu o 12 bitů pro 4096-bajtové stránky). Taková manipulace snižuje riziko zachycení ukazatele v exploitu, protože ukazatel není uchováván v původní podobě a pro jeho nahrazení je třeba znát informace o umístění haldy. Kromě toho v patch kódu rovněž existuje další kontrola zarovnání bloku, která útočníkovi neumožňuje nahradit ukazatel nezarovnanou hodnotou a vyžaduje znalost počtu bitů, o které bylo provedeno zarovnání, což na 64bitových systémech navíc umožňuje zablokovat 15 z 16 pokusů o útoky, které neberou v úvahu zarovnání.
Metoda je účinná při ochraně proti útokům, které využívají částečné přepakování ukazatelů (změna nejnižších bytů), úplné přepsání ukazatelů (přesměrování na kód útočníka) a změnu polohy seznamu na nezarovnanou adresu. Jako příklad je uvedeno, že použití Safe-Linking v malloc by zablokovalo exploataci nedávno týmiž výzkumníky zranitelnosti v inteligentním osvětlení Philips Hue Bridge, způsobenou přetečením zásobníku a umožňující převzít kontrolu nad zařízení.
Zdroj: opennet.ru
