TU Darmstadt / ULB / TUprints

On Generating Gadget Chains for Return-Oriented Programming

Follner, Andreas (2017)
On Generating Gadget Chains for Return-Oriented Programming.
Technische Universität Darmstadt
Ph.D. Thesis, Primary publication

[img]
Preview
Text
Andreas Follner - Dissertation - Final.pdf
Copyright Information: CC BY-NC-SA 4.0 International - Creative Commons, Attribution NonCommercial, ShareAlike.

Download (1MB) | Preview
Item Type: Ph.D. Thesis
Type of entry: Primary publication
Title: On Generating Gadget Chains for Return-Oriented Programming
Language: English
Referees: Bodden, Prof. Dr. Eric ; Payer, Prof. Dr. Mathias ; Mezini, Prof. Dr. Mira
Date: 2017
Place of Publication: Darmstadt
Date of oral examination: 21 December 2016
Abstract:

With the increased popularity of embedded devices, low-level programming languages like C and C++ are currently experiencing a strong renewed interest. However, these languages are, meaning that programming errors may lead to undefined behaviour, which, in turn, may be exploited to compromise a system's integrity. Many programs written in these languages contain such programming errors, most infamous of which are buffer overflows. In order to fight this, there exists a large range of mitigation techniques designed to hinder exploitation, some of which are integral parts of most major operating systems' security concept. Even the most sophisticated mitigations, however, can often be bypassed by modern exploits, which are based on the principle of code reuse: they assemble, or chain, together existing code fragments (known as gadgets) in a way to achieve malicious behaviour. This technique is currently the cornerstone of modern exploits.

In this dissertation, we present ROPocop, an approach to mitigate code-reuse attacks. ROPocop is a configurable, heuristic-based detector that monitors program execution and raises an alarm if it detects suspicious behaviour. It monitors the frequency of indirect branches and the length of basic blocks, two characteristics in which code-reuse attacks differ greatly from normal program behaviour. However, like all mitigations, ROPocop has its weaknesses and we show that it and other similar approaches can be bypassed in an automatic way by an aware attacker. To this end, we present PSHAPE, a practical, cross-platform framework to support the construction of code-reuse exploits. It offers two distinguishing features, namely it creates concise semantic summaries for gadgets, which allow exploit developers to assess the utility of a gadget much quicker than by going through the individual assembly instructions. And secondly, PSHAPE automatically composes gadgets to construct a chain of gadgets that can invoke any arbitrary function with user-supplied parameters. Invoking a function is indeed the most common goal of concurrent exploits, as calling a function such as mprotect greatly simplifies later steps of exploitation.

For a mitigation to be viable, it must detect actual attacks reliably while at the same time avoiding false positives and ensuring that protected applications remain usable, i.e., do not crash or become very slow. In the tested sample set of applications, ROPocop detects and stops all twelve real attacks with no false positives. When executed with ROPocop, real-world programs exhibit only some slight input lag at startup but otherwise remain responsive. Yet, we further show how PSHAPE can be used to fully automatically create exploits that bypass various mitigations, for example, ROPocop itself. We also show gadgets PSHAPE found easily, that have great relevance in real exploits, and which previously required intense manual searches to find. Lastly, using PSHAPE, we also discovered a new and very useful gadget type that greatly simplifies gadget chaining.

Alternative Abstract:
Alternative AbstractLanguage

Mit der Verbreitung eingebetteter Systeme erleben hardwarenahe Programmiersprachen wie C und C++ einen großen Aufschwung. Allerdings sind diese Sprachen unsicher, was bedeutet, dass Programmierfehler zu sogenanntem undefiniertem Verhalten führen können. Dies kann ausgenutzt werden, um ein System zu kompromittieren. Viele Programme, die in C/C++ geschrieben sind, beinhalten solche Programmierfehler, zu welchen beispielsweise Pufferüberläufe zählen. Um diese Gefahr zu bekämpfen, existieren diverse Abwehrmechanismen, von denen einige in unseren Betriebssystemen integriert sind und einen wichtigen Beitrag zur Systemsicherheit leisten. Allerdings können selbst die ausgeklügeltsten Abwehrmechanismen umgangen werden, wie aktuelle Angriffe zeigen. Diese Angriffe basieren auf dem Konzept, vorhandene Programmfragmente neu zusammenzusetzen, um bösartigen Code zu erzeugen. Diese Technik ist der Grundstein moderner Angriffe.

In dieser Dissertation präsentieren wir ROPocop, eine Methode um solche Angriffe zu verhindern. ROPocop ist ein auf einer Heuristik basierendes, konfigurierbares Programm, das den Programmfluss eines anderen Programms zur Laufzeit analysiert und Alarm auslöst, falls es ungewöhnliches Verhalten feststellt. Es analysiert Eigenschaften, in denen sich reguläres von bösartigem Programmverhalten, bei dem vorhandene Programmfragmente neu zusammengesetzt werden, unterscheidet. Wie alle aktuellen Abwehrmechanismen hat auch ROPocop Schwächen und wir zeigen, wie ROPocop und ähnliche Abwehrmechanismen vollautomatisiert umgangen werden können. Hierfür präsentieren wir PSHAPE, ein plattformübergreifendes Framework, welches die Entwicklung von Angriffen unterstützt. PSHAPE hilft in zweierlei Hinsicht: es erzeugt kompakte, semantische Zusammenfassungen für Programmfragmente. Diese erlauben eine schnelle Feststellung der Auswirkungen, die ein Fragment auf den Programmzustand hat. Außerdem ist PSHAPE in der Lage, Programmfragmente vollautomatisch zusammenzufügen, um einen Exploit zu erzeugen, der eine Funktion mit beliebigen Parametern aufruft. Dieses Verhalten ist realitätsnah, da das Aufrufen einer Funktion wie mprotect nachfolgende Schritte der Exploit-Entwicklung stark vereinfacht.

Ein praxistauglicher Abwehrmechanismus muss Angriffe zuverlässig erkennen und löst im Idealfall keinen falschen Alarm aus. Außerdem muss sichergestellt sein, dass das geschützte Programm bedienbar bleibt, das heißt, nicht stark verlangsamt wird oder gar abstürzt. Wir haben ROPocop mit zwölf realen Exploits getestet, die alle zuverlässig erkannt wurden, ohne dass ROPocop einen Fehlalarm auslöste. Programme laufen, geschützt durch ROPocop, zu Beginn leicht verlangsamt, danach jedoch ohne merkbare Verzögerungen. Des Weiteren zeigen wir, wie PSHAPE vollautomatisch Exploits erzeugt, die in der Lage sind, diverse Abwehrmechanismen, wie beispielsweise ROPocop, zu umgehen. Außerdem zeigen wir, dass es bestimmte Programmfragmente, die bisher unter großem Zeitaufwand manuell gesucht werden mussten, zuverlässig und vollautomatisch findet. Zudem findet PSHAPE eine neue Art von Programmfragment, das die Exploit-Entwicklung stark vereinfacht.

German
URN: urn:nbn:de:tuda-tuprints-59066
Classification DDC: 000 Generalities, computers, information > 004 Computer science
Divisions: 20 Department of Computer Science
20 Department of Computer Science > EC SPRIDE
20 Department of Computer Science > EC SPRIDE > Secure Software Engineering
Date Deposited: 25 Jan 2017 15:39
Last Modified: 09 Jul 2020 01:30
URI: https://tuprints.ulb.tu-darmstadt.de/id/eprint/5906
PPN: 399366997
Export:
Actions (login required)
View Item View Item