Das Unternehmen Checkpoint Der Safe-Linking-Schutzmechanismus erschwert die Erstellung von Exploits, die auf die Definition oder Änderung von Zeigern auf bei einem malloc-Aufruf reservierte Puffer abzielen. Safe-Linking blockiert nicht vollständig die Möglichkeit, Schwachstellen auszunutzen, erschwert jedoch mit minimalem Overhead erheblich die Erstellung bestimmter Exploit-Kategorien, da neben dem ausnutzbaren Pufferüberlauf auch eine weitere Schwachstelle gefunden werden muss, die zu einer Informationsleckage über die Heap-Platzierung im Speicher führt.
Die Patches mit der Implementierung von Safe-Linking sind für Glibc (ptmalloc), uClibc-NG (dlmalloc), gperftools (tcmalloc) und Google TCMalloc vorbereitet und werden auch zur Verbesserung des Schutzes in Chromium angeboten (in
Chromium ist seit 2012 eine Technik namens MaskPtr implementiert, die auf die gleiche Problemlösung abzielt, aber die Lösung von Checkpoint zeigt eine höhere Leistung).
Die vorgeschlagenen Patches wurden bereits für die August-Veröffentlichung genehmigt und die Anwendung von Safe-Linking wird standardmäßig enthalten sein. In uClibc-NG wird die Unterstützung von Safe-Linking im Release 1.0.33 enthalten sein und standardmäßig aktiviert sein. In gperftools (altes tcmalloc) sind Änderungen , werden jedoch in einer der zukünftigen Versionen als Option angeboten.
Entwickler (neues tcmalloc) wurde abgelehnt , mit Verweis auf einen erheblichen Leistungsverlust und die Notwendigkeit, erweiterte Tests hinzuzufügen, um regelmäßig zu überprüfen, ob alles ordnungsgemäß funktioniert. Die Tests der Ingenieure von Checkpoint zeigten, dass die Methode Safe-Linking zu keinem zusätzlichen Speicherverbrauch führt, und die Leistung bei Heap-Operationen im Durchschnitt nur um 0,02 % verringert wird, während sie im schlimmsten Fall um 1,5 % sinkt (zum Vergleich: die Overhead-Kosten für die in Chromium verwendete Methode werden auf „weniger als 2 %“ geschätzt). Die Aktivierung
von Safe-Linking führt zu 2-3 zusätzlichen Assemblieranweisungen bei jedem Aufruf von free() und 3-4 Anweisungen bei einemmalloc()-Aufruf. Das Starten von Initiierungsphasen und das Generieren von Zufallswerten sind nicht erforderlich.
Safe-Linking kann nicht nur zur Erhöhung der Sicherheit verschiedener Heap-Implementierungen eingesetzt werden, sondern auch zur Hinzufügung von Integritätsprüfungsmechanismen in beliebige Datenstrukturen, die einfach verkettete Listen von Zeigern enthalten, die neben den Buffern platziert sind. Die Methode ist sehr einfach zu implementieren und erfordert lediglich die Hinzufügung eines Makros und dessen Anwendung auf die Zeiger auf den nächsten Block im Code (zum Beispiel für Glibc, nur wenige Zeilen im Code). Die Methode umfasst die folgenden Änderungen:
+#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);
…
Der Kern der Methode besteht darin, Zufallsdaten aus dem ASLR-Adressrandomisierungsmechanismus (mmap_base) zum Schutz von einfach verketteten Listen wie Fast-Bins und TCache zu verwenden. Vor der Anwendung auf den Zeigerwert des nächsten Elements in der Liste erfolgt eine Maskenoperation und eine Überprüfung der Seitenausrichtung im Speicher. Der Zeiger wird durch das Ergebnis der Operation „(L >> PAGE_SHIFT) XOR (P)“ ersetzt, wobei P der Zeigerwert und L der Speicherort ist, an dem dieser Zeiger gespeichert ist.
Bei der Verwendung im System (Address Space Layout Randomization) enthalten einige Bits von L mit der Basisadresse des Heaps zufällige Werte, die als Schlüssel zur Kodierung von P verwendet werden (sie werden durch eine 12-Bit-Verschiebung für 4096-Byte-Seiten extrahiert). Eine solche Manipulation verringert das Risiko, dass Zeiger in einem Exploit übernommen werden, da der Zeiger nicht im ursprünglichen Format gespeichert wird und für dessen Ersetzung Kenntnisse über die Heap-Platzierung erforderlich sind. Darüber hinaus enthält der Patch-Code auch eine zusätzliche Überprüfung der Blockausrichtung, die es einem Angreifer nicht ermöglicht, den Zeiger in einen nicht ausgerichteten Wert zu ändern und Kenntnisse über die Anzahl der Bits, um die die Ausrichtung vorgenommen wurde, erfordert, was auf 64-Bit-Systemen zusätzlich 15 von 16 Angriffsversuchen blockiert, die die Ausrichtung nicht berücksichtigen.
Die Methode ist effektiv zum Schutz vor Angriffen, bei denen teilweise Zeigerüberschreibungen (Änderung der niederwertigen Bytes), vollständige Zeigerüberschreibungen (Umleitung auf den Code des Angreifers) und die Änderung der Listenposition an nicht ausgerichteten Adressen verwendet werden. Beispielhaft wurde gezeigt, dass die Anwendung von Safe-Linking in malloc es ermöglichen würde, die Ausnutzung kürzlich entdeckter den gleichen Forschern Schwachstellen in der intelligenten Beleuchtung Philips Hue Bridge, verursacht durch einen Buffer-Overflow, der die Kontrolle über das Gerät ermöglicht.
Quelle: opennet.ru
