Компания Checkpoint механизм за защита Safe-Linking, който затруднява създаването на експлойти, манипулиращи определянето или промяната на указателите към буферите, отпуснати при извикване на malloc. Safe-Linking не блокира напълно възможността за експлоатация на уязвимости, но с минимални разходи значително усложнява създаването на определени категории експлойти, тъй като освен експлоатируемото препълване на буфера е необходимо да се намери още една уязвимост, която да предизвика изтичане на информация за разположението на купчина (heap) в паметта.
Патчовете с реализация на Safe-Linking са подготвени за Glibc (ptmalloc), uClibc-NG (dlmalloc), gperftools (tcmalloc) и Google TCMalloc, както и предложени за модернизиране на защитата в Chromium (в
Chromium от 2012 година вече е внедрена насочена към решаване на същия проблем техника за защита MaskPtr, но решението от Checkpoint демонстрира по-висока производителност).
Предложените патчове вече са одобрени за доставка в августовското издание и прилагането на Safe-Linking ще бъде включено по подразбиране. В uClibc-NG поддръжката на Safe-Linking в издание 1.0.33 и е включена по подразбиране. В gperftools (старата tcmalloc) промените , но ще бъдат предложени в едно от бъдещите издания като опция.
Разработчици (новата tcmalloc) отказаха да приемат , като се позовават на значително намаляване на производителността и необходимостта от добавяне на разширени тестове за редовна проверка на това, че всичко работи правилно. Тестовете, проведени от инженерите на Checkpoint, показват, че методът Safe-Linking не води до допълнителни разходи за памет, а производителността при извършване на операции с купчини в средно намалява с едва 0.02%, а при най-лоши обстоятелства с 1.5% (за сравнение, разходите в приложеното в Chromium решение се оценяват като „по-малко от 2%“). Включването
на Safe-Linking води до изпълнение на 2-3 допълнителни асемблерни инструкции при всяко извикване на free() и 3-4 инструкции при извикване на malloc(). Изпълнението на етапите на инициализация и генериране на случайни стойности не е необходимо.
Safe-Linking може да се използва не само за повишаване на сигурността на различни реализации на купчини (heap), но и за добавяне на средства за контрол на целостта в каквито и да е структури данни, в които се използват еднопосочни списъци на указатели, разположени до самите буфери. Методът е много прост за реализиране и изисква само добавяне на един макрос и неговото приложение към указателите на следващия блок в кода (например, за Glibc всъщност само с няколко реда в кода). Методът се състои от следните промени:
+#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);
…
Същността на метода е в прилагането на случайни данни от механизма на рандомизация на адреси ASLR (mmap_base) за защита на еднопосочни списъци, като Fast-Bins и TCache. Преди да се приложи към стойността на указателя на следващия елемент в списъка, се извършва преобразуване по маска и проверка на подравняването по границата на страницата в паметта. Указателят се заменя с резултата от операцията «(L >> PAGE_SHIFT) XOR (P)», където P е стойността на указателя, а L е местоположението в паметта, където се съхранява този указател.
При използване в системата (Randomизация на разпределението на адресното пространство) част от битовете L с основния адрес на купчината съдържат случайни стойности, които се използват като ключ за кодиране на P (извлекат се с операция на сдвиг на 12 бита за 4096-байтови страници). Подобна манипулация намалява риска от захващане на указателя в експлойт, тъй като указателят не се съхранява в оригиналната си форма и за неговата замяна е необходимо да се знаят данни за разположението на купчината. Освен това, в кода на патча също присъства допълнителна проверка за подравняване на блока, която не позволява на нападателя да замени указателя с невярна стойност и изисква знание за броя битове, за които е извършено подравняването, което на 64-битови системи допълнително позволява да се блокират 15 от 16 опита за атака, които не вземат предвид подравняването.
Методът е ефективен за защита от атаки, при които се използва частично презаписване на указатели (промяна на най-малките байтове), пълно презаписване на указатели (пренасочване към кода на нападателя) и смяна на позицията на списъка по невярен адрес. Като пример е показано, че прилагането на Safe-Linking в malloc би могло да блокира експлоатацията на наскоро от същите изследователи на уязвимости в умната осветителна система Philips Hue Bridge, причинена от препълване на буфера и позволяваща контрол над устройството.
Източник: opennet.ru
