TU Darmstadt / ULB / TUprints

Raising The Bar: Advancing Mitigations Against Memory-Corruption and Side-Channel Attacks

Frassetto, Tommaso (2022)
Raising The Bar: Advancing Mitigations Against Memory-Corruption and Side-Channel Attacks.
Technische Universität
doi: 10.26083/tuprints-00021436
Ph.D. Thesis, Primary publication, Publisher's Version

[img] Text
Dissertation Tommaso Frassetto.pdf
Copyright Information: CC BY-NC-ND 4.0 International - Creative Commons, Attribution NonCommercial, NoDerivs.

Download (5MB)
Item Type: Ph.D. Thesis
Type of entry: Primary publication
Title: Raising The Bar: Advancing Mitigations Against Memory-Corruption and Side-Channel Attacks
Language: English
Referees: Sadeghi, Prof. Dr. Ahmad-Reza ; Conti, Prof. Mauro
Date: 2022
Place of Publication: Darmstadt
Collation: viii, 147 Seiten
Date of oral examination: 19 May 2022
DOI: 10.26083/tuprints-00021436
Abstract:

The complexity of computer programs has been increasing for multiple decades. As a result, the number and impact of security vulnerabilities have been rising as well. Memory-corruption attacks have been one of the most severe security threats for decades, despite the tremendous efforts of the security community: according to data published by Microsoft in 2019, 70% of vulnerabilities addressed in security updates during the previous decade are memory safety issues. Similarly, according to the 2021 CWE Top 25, two out of the three most dangerous vulnerability categories are related to memory corruption.

A variety of approaches have been proposed that aim to either discover vulnerabilities before they are deployed to a production environment, or to mitigate vulnerabilities by making them harder to exploit. The former case includes strategies like static analysis, test suites, and fuzzing. While these methods are important and beneficial, it is not feasible to find all software bugs: most deployed software projects suffer from memory-corruption vulnerabilities, in particular if they contain legacy code.

Hence, it is crucial to investigate, develop, and deploy mitigations, in order to make exploitation of these vulnerabilities substantially harder or even infeasible. Three prominent approaches are software diversity (e.g., randomization), integrity checks (e.g., CFI), and memory isolation (e.g., TEEs). The scope of this cumulative dissertation includes contributions to these three mitigation approaches, as well as applications to more practical problems.

The idea of software diversity is to change the protected program so that one or more of its properties, e.g., the address of code or data, is unknown to the attacker. Since memory-corruption exploits depend on the address of code and data, the adversary needs to correctly guess or otherwise acquire the address of all the memory structures required for the exploit, which substantially increases the attack's difficulty. We present Selfrando, a scheme which randomizes the executable code of a program with a fine granularity. In contrast to previous works, our scheme performs the randomization every time the application is launched. This way, the same application package can be distributed through traditional channels to all users, but each run has a different memory layout. Selfrando was successfully integrated in the privacy-preserving Tor Browser and deployed in the hardened version of Tor Browser for Linux.

The principle of Control-Flow Integrity (CFI) is to instrument indirect control flow transfers to inspect the computed target before the control transfer is performed. As an example of a coarse-grained CFI scheme, indirect call instructions can be instrumented to only allow calls to the start addresses of known functions. A variety of CFI approaches with different granularity have been proposed. Given this variety, it is important to be able to quantify the security guarantees of each scheme. We present CFInsight, a benchmark for CFI security. Unlike previous works, our analysis is based on properties of the paths between indirect call sites and system call instructions, which attackers need to reach in order to interact with the operating system or the file system. Our metric is based on quantitative measurements of these paths and indicates how hard it is to construct an attack.

Memory isolation involves introducing barriers between various software components, so that a vulnerability in one of them cannot be used to exploit a different one. Memory isolation can be implemented purely in software or with the help of hardware extensions, e.g., Trusted Execution Environments (TEEs). Memory isolation is particularly beneficial for software that is composed by a significant number of diverse components, especially if some of them handle untrusted data. This is the case of web browsers, where an attacker can target the Just-In-Time (JIT) compiler and force it to generate malicious code. We present JITGuard, which leverages memory isolation and a TEE in order to protect the internal data of a browser's JIT compiler from attackers. Unlike alternative approaches, our construction maintains the existing synchronous calling semantics and does not require complex redesigns in the original code.

Memory isolation, and TEEs in particular, can be used for a number of purposes, including to ensure the confidentiality of a component. However, there is a category of attacks that is particularly effective in breaking the confidentiality property of memory isolation. These attacks leverage side channels in order to extract information from a component without directly interacting with it. Below, we introduce our proposals of a software-only and a hardware-based countermeasure against these attacks.

A traditional approach to limit side-channel leakage is to manually design alternative algorithms, which requires significant expertise and is highly error-prone. Instead, we present DR.SGX, a software-only solution that automatically protects all data used in a TEE by applying a fine-grained location randomization. The data location is periodically re-randomized to further limit the leakage during extended execution.

Another common approach to limit cache-based side-channel leakage is to partition the caches, which leads to high performance overheads. Our proposal HybCache is a new cache architecture that limits side-channel leakage by design. Security-sensitive code accesses a subset of the cache fully-associatively, using a random replacement policy, which prevents any address-specific information leakage. At the same time, security-insensitive code accesses the cache in the traditional set-associative way, which, unlike cache partitioning, results in no performance degradation.

Lastly, we describe two practical use cases that show how TEEs can be used to improve protocols. First, we show VoiceGuard, a TEE-based design for a voice recognition system that protects from disclosure both the user's voice data and the vendor's machine learning model. Second, we present FastKitten, a TEE-based protocol that allows for fast and efficient smart contract execution on cryptocurrencies that do not support smart contracts.

Alternative Abstract:
Alternative AbstractLanguage

Die Komplexität von Computerprogrammen nimmt seit Jahrzehnten zu. Infolgedessen haben auch die Anzahl und die Auswirkungen von Sicherheitslücken zugenommen. Memory-Corruption Angriffe sind seit Jahrzehnten eine der schwerwiegendsten Sicherheitsbedrohungen, trotz der enormen Anstrengungen der Security-Community: Nach 2019 veröffentlichten Statistiken von Microsoft sind 70% der in den letzten 10 Jahren behobenen Schwachstellen in Sicherheitsupdates Probleme mit der Speicherintegrität. Auch in den CWE Top 25 von 2021 stehen zwei der drei gefährlichsten Schwachstellenkategorien im Zusammenhang mit Speicherkorruption.

Es wurde eine Vielzahl von Ansätzen vorgeschlagen, die darauf abzielen, entweder Schwachstellen zu entdecken, bevor sie in einer Produktionsumgebung eingesetzt werden, oder Schwachstellen zu verhindern, indem man sie schwerer ausnutzbar macht. Zum ersten Fall gehören Strategien wie statische Analyse, Testsuiten und Fuzzing. Solche Methoden sind zwar wichtig und vorteilhaft, allerdings ist es nicht realistisch alle Softwarefehler zu finden: Die meisten Softwareprojekte leiden unter Memory-Corruption Schwachstellen, insbesondere wenn sie Legacy-Code enthalten.

Daher ist es entscheidend, Schutzmaßnahmen zu erforschen, zu entwickeln und einzusetzen, um das Ausnutzen solcher Schwachstellen erheblich zu erschweren oder sogar unmöglich zu machen. Drei prominente Ansätze dazu sind Software-Diversität (z.B. Randomisierung), Integritätsprüfungen (bspw. CFI) und Speicherisolierung (z.B. TEEs). Im Rahmen dieser kumulativen Dissertation werden Beiträge zu diesen drei Maßnahmen, aber auch Anwendungen für praktischere Probleme, präsentiert.

Die Idee von Software-Diversität besteht darin, das zu schützende Programm so zu verändern, dass eine oder mehrere seiner Eigenschaften, z.B. die Adresse von Code oder Daten, dem Angreifer nicht zugänglich sind. Da Speicherkorruptionen von der Adresse des Codes oder der Daten abhängen, muss der Angreifer alle Speicheradressen, welche für den Angriff erforderlich sind, entweder erraten oder auf andere Weise in Erfahrung bringen. Dies erhöht die Schwierigkeit des Angriffs erheblich. Mit Selfrando stellen wir einen Ansatz vor, welcher den ausführbaren Code eines Programms feingranular randomisiert. Im Gegensatz zu früheren Veröffentlichungen, führt unser Ansatz die Randomisierung jedes Mal durch, wenn die Software gestartet wird. Auf diese Weise kann das gleiche Programmpaket über herkömmliche Kanäle an alle Benutzer verteilt werden, aber jede Ausführung bekommt ein anderes Speicherlayout. Selfrando wurde erfolgreich in den privaten Tor-Browser integriert und mit der gehärteten Version des Tor-Browsers für Linux ausgerollt.

Das Prinzip von Control-Flow Integrity (CFI) besteht darin, indirekte Kontrollflusstransfers zu instrumentieren, um das berechnete Ziel zu prüfen bevor der Kontrollflusstransfer durchgeführt wird. Als Beispiel für einen groben CFI-Ansatz können indirekte Call-Instruktionen instrumentiert werden, um nur Aufrufe an die Startadressen bekannter Funktionen zu erlauben. Es wurde eine Vielzahl von CFI-Ansätzen mit unterschiedlicher Granularität vorgeschlagen. Angesichts dieser Vielfalt ist es wichtig, die Sicherheitsgarantien der einzelnen Verfahren quantifizieren zu können. Dazu stellen wir CFInsight vor, ein Benchmark für CFI-Sicherheit. Im Gegensatz zu vorherigen Ansätzen basiert unsere Analyse auf den Eigenschaften der Pfade zwischen indirekten Call-Instruktionen und System-Calls, die Angreifer erreichen müssen, um mit dem Betriebssystem oder dem Dateisystem zu interagieren. Unsere Metrik basiert auf quantitativen Messungen dieser Pfade und gibt an, wie schwer es ist, einen Angriff zu konstruieren.

Bei der Speicherisolierung werden Barrieren zwischen verschiedenen Softwarekomponenten eingesetzt, so dass eine Schwachstelle in einer dieser Komponenten nicht zur Ausnutzung einer anderen genutzt werden kann. Die Speicherisolierung kann ausschließlich in Software, oder mit Hilfe von Hardware-Erweiterungen, z.B. Trusted Execution Environments (TEEs), realisiert werden. Speicherisolierung ist besonders vorteilhaft für Software, die aus einer beträchtlichen Anzahl verschiedener Komponenten besteht, insbesondere wenn einige dieser Komponenten ungeprüfte Daten verarbeiten. Dies ist bei Webbrowsern der Fall, bei denen ein Angreifer den Just-In-Time-Compiler (JIT) angreift und ihn zwingen kann, bösartigen Code zu erzeugen. Daher stellen wir JITGuard vor, welches Speicherisolierung und ein TEE nutzt, um die internen Daten des JIT-Compilers eines Browsers vor Angreifern zu schützen. Im Gegensatz zu alternativen Ansätzen behält unsere Konstruktion die bestehende synchrone Aufrufsemantik bei und erfordert keine komplexen Abänderungen im ursprünglichen Code.

Speicherisolierung und insbesondere TEEs können für eine Reihe von weiteren Zwecken eingesetzt werden, unter anderem um die Vertraulichkeit einer Komponente zu gewährleisten. Es gibt jedoch eine Kategorie von Angriffen, mit denen die Vertraulichkeit der Speicherisolierung besonders effektiv gebrochen werden kann. Diese Angriffe nutzen Seitenkanäle aus, um Informationen aus einer Komponente zu extrahieren, ohne direkt mit dieser zu interagieren. Im Folgenden stellen wir unsere Vorschläge für rein software- und hardwarebasierte Gegenmaßnahmen gegen diese Angriffe vor.

Ein traditioneller Ansatz zur Einschränkung von Seitenkanal-Lecks besteht in der manuellen Entwicklung alternativer Algorithmen, was erhebliche Fachkenntnisse erfordert und höchst fehleranfällig ist. Stattdessen stellen wir DR.SGX vor, eine reine Softwarelösung, die automatisch alle in einem TEE verwendeten Daten durch eine feingranulare Randomisierung des Speicherlayouts schützt. Das Speicherlayout der Daten wird in regelmäßigen Abständen neu randomisiert, um das Datenleck während längerer Laufzeiten weiter zu begrenzen.

Ein anderer gängiger Ansatz zur Begrenzung von Cache-basierten Seitenkanal-Lecks ist die Partitionierung der Caches, was zu einer reduzierten Leistung führt. Bei unserem Projekt HybCache handelt es sich um eine neue Cache-Architektur, welche gezielt Seitenkanal-Lecks begrenzt. Dabei greift der sicherheitskritische Code auf eine Teilmenge des Cache vollständig assoziativ zu, wobei eine zufällige Replacement-Policy verwendet wird, die ein adressenspezifisches Informationsleck verhindert. Gleichzeitig greift unkritischer Code auf traditionelle Weise auf den Cache zu, was im Gegensatz zur Cache-Partitionierung keine Leistungseinbußen zur Folge hat.

Abschließend beschreiben wir zwei praktische Anwendungsfälle, die zeigen, wie TEEs zur Verbesserung von Protokollen eingesetzt werden können. Zunächst präsentieren wir VoiceGuard, ein TEE-basiertes Design für ein Spracherkennungssystem, das sowohl die Sprachdaten des Benutzers als auch das maschinelle Lernmodell des Anbieters vor der Offenlegung schützt. Zweitens stellen wir FastKitten vor, ein TEE-basiertes Protokoll, das eine schnelle und effiziente Ausführung von Smart Contracts in Kryptowährungen ermöglicht, welche keine Smart Contracts unterstützen.

German
Status: Publisher's Version
URN: urn:nbn:de:tuda-tuprints-214363
Classification DDC: 000 Generalities, computers, information > 004 Computer science
Divisions: 20 Department of Computer Science > System Security Lab
Date Deposited: 09 Jun 2022 12:17
Last Modified: 20 Sep 2022 06:51
URI: https://tuprints.ulb.tu-darmstadt.de/id/eprint/21436
PPN: 499510372
Export:
Actions (login required)
View Item View Item