Checkpoint Company de Safe-Linking-beveiligingsmechanisme, dat het creëren van exploits die manipuleren met de definitie of wijziging van pointers naar buffers, toegewezen tijdens het aanroepen van malloc, bemoeilijkt. Safe-Linking blokkeert niet volledig de mogelijkheid om kwetsbaarheden te exploiteren, maar compliceert met minimale overhead aanzienlijk de creatie van bepaalde categorieën exploits, aangezien naast de geëxploiteerde buffer overflow ook een andere kwetsbaarheid moet worden gevonden die informatie over de geheugenplaatsing van de heap lekt.
Patches met de implementatie van Safe-Linking zijn voorbereid voor Glibc (ptmalloc), uClibc-NG (dlmalloc), gperftools (tcmalloc) en Google TCMalloc, en zijn ook voorgesteld ter modernisering van de bescherming in Chromium (in
Chromium is sinds 2012 al een techniek voor het oplossen van hetzelfde probleem opgebouwd genaamd MaskPtr, maar de oplossing van Checkpoint toont een hogere prestatie).
De voorgestelde patches zijn al goedgekeurd voor opname in de augustusuitgave en de toepassing van Safe-Linking zal standaard worden ingeschakeld. In uClibc-NG zal de ondersteuning voor Safe-Linking in de uitgave 1.0.33 worden opgenomen en standaard zijn ingeschakeld. In gperftools (de oudere tcmalloc) zijn er wijzigingen , maar deze zullen worden voorgesteld in een toekomstige uitgave als optie.
Ontwikkelaars (de nieuwe tcmalloc) hebben geweigerd , verwijzend naar een aanzienlijke prestatievermindering en de noodzaak om uitgebreide tests toe te voegen om regelmatig te controleren of alles correct werkt. Testing door ingenieurs van Checkpoint heeft aangetoond dat de Safe-Linking-methode geen extra geheugenkosten met zich meebrengt, en de prestaties bij heap-operaties dalen gemiddeld slechts met 0,02%, en in het slechtste geval met 1,5% (ter vergelijking, de overhead van de in Chromium toegepaste methode wordt geschat op 'minder dan 2%'). Activatie van
Safe-Linking leidt tot het uitvoeren van 2-3 extra assembler-instructies bij elke aanroep van free() en 3-4 instructies bij de aanroep van malloc(). Het starten van de initialisatiefases en het genereren van willekeurige waarden is niet vereist.
Safe-Linking kan niet alleen worden gebruikt om de veiligheid van verschillende heap-implementaties te verbeteren, maar ook om integriteitscontroles toe te voegen aan gegevensstructuren waarin enkelvoudige lijsten van pointers worden toegepast, die naast de buffers zelf zijn geplaatst. De methode is erg eenvoudig te implementeren en vereist alleen de toevoeging van één macro en het toepassen daarvan op pointers naar de volgende blok in de code (bijvoorbeeld voor Glibc slechts enkele regels in de code). De methode komt neer op de volgende aanpassingen:
+#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);
…
De essentie van de methode is het gebruik van willekeurige gegevens van het adresrandomisatiemechanisme ASLR (mmap_base) ter bescherming van enkelvoudige lijsten, zoals Fast-Bins en TCache. Voor het toepassen op de waarde van de pointer naar het volgende element in de lijst wordt een maskeringstransformatie uitgevoerd en gecontroleerd op pagina-alignment. De pointer wordt vervangen door het resultaat van de bewerking "(L >> PAGE_SHIFT) XOR (P)", waarbij P de waarde van de pointer is en L de locatie in het geheugen waar deze pointer wordt opgeslagen.
Bij gebruik in het systeem (Address Space Layout Randomization) bevatten delen van de bits L met het basisadres van de heap willekeurige waarden, die als sleutel worden gebruikt voor het coderen van P (deze worden verkregen door een 12-bits verschuiving voor 4096-byte pagina's). Een dergelijke manipulatie vermindert het risico op pointerovername in exploits, aangezien de pointer niet in zijn oorspronkelijke vorm wordt opgeslagen en voor vervanging kennis van de heap-locatie vereist is. Bovendien is in de patch-code ook een extra controle op block-alignment aanwezig, die voorkomt dat een aanvaller de pointer vervangt door een niet-uitgelijnde waarde en kennis vereist van het aantal bits waarop is uitgelijnd, wat op 64-bits systemen bovendien 15 van de 16 aanvalspogingen kan blokkeren die de uitlijning negeren.
De methode is effectief ter bescherming tegen aanvallen waarbij gedeeltelijke overschrijving van pointers (wijziging van de laagste bytes), volledige herschrijving van pointers (omleiding naar de code van de aanvaller) en wijziging van de positie van de lijst op een niet-uitgelijnd adres worden gebruikt. Ter illustratie is aangetoond dat het toepassen van Safe-Linking in malloc zou kunnen helpen om de exploitatie die recent is uitgevoerd te blokkeren. dezelfde onderzoekers van de kwetsbaarheden in de slimme verlichting van de Philips Hue Bridge, veroorzaakt door een bufferoverloop die controle over het apparaat mogelijk maakt.
Bron: opennet.ru
