Monitoring and Securing Execution at the OS Level
Throughout the history of computer systems, there has been a never-ending arms race developing, in an effort to gain the upper hand when trying to attack or defend a system. On one hand of the equation, we find adversaries trying to come up with new ways to attack and bypass any security measures in-place. The research community (industrial, academic or otherwise), on the other hand, tries to propose new and safe ways to develop software. The main aim of these attempts is to reduce bugs and vulnerabilities in code, as much as possible. Furthermore, new and innovative ideas for security mechanisms are constantly being developed, in order to defend against any attempt to jeopardize the underlying system. However, complete security of a program is not possible due to increased software complexity and market cost considerations. Consequently, the aforementioned vulnerabilities need to be detected before an attacker gets a chance to take advantage of them, or ''catch in the act'' the attacker, while trying to actively exploit them. This dissertation focuses on providing a unified approach that, during execution, ensures the security of the applications and the underlying system by extension. This approach breaks up an application into different components and detects attacks against them. It achieves this, by monitoring all the execution paths among the components. Furthermore, it responds to these attacks properly, by enforcing a set of security policies. These policies ensure a high degree of security, when an application is being executed. The thesis starts by listing a number of challenges that make its aim difficult and complicated, and its contributions towards delivering a secure operating environment. Continuing, it presents a comprehensive list of the state-of-the-art research and approaches that focus in the same field as what we are trying to achieve, i.e., defend against Code Injection/Reuse Attacks. The thesis, then, presents the design considerations of the unified approach: (i) its architecture, (ii) the adversary model considered during the stage of development, (iii) the security assumptions for the underlying system, (iv) the testbed used during implementation and testing and (v) the use-cases used to evaluate its applicability and efficiency. The thesis, also, shows how to enforce access control for library calls at the user-code level, in order to restrict access to specific functions. Furthermore, a library is divided in smaller segments, offering more precise control over any access attempt. The thesis, then, deals with an approach to generate the security policies that can be applied at run-time and dictate to the monitoring sub-system what transitions are permitted. Following, the thesis presents a kernel-level mechanism that can cooperate with its user-level counterpart, in the attempt to strengthen the underlying system. By modifying the Memory Management Unit, this mechanism divides the memory space of a running application into separate code regions based on page permissions, and determines if a call should be made from one region to another. In this way, we provide a finer-grained level of compartmentalization of a process's memory area, than what is currently the norm. Additionally, the thesis presents a training environment, which has been incorporated in the platform of the THREAT-ARREST EU H2020 research project. Concluding, the thesis sets a number of requirements and characteristics that any security mechanism should have, in order to be practical and have better chances of gaining wide acceptance and adoption. Moreover, the overall approach is compared to the state-of-the-art mechanisms, which shows that it can stand as a concrete solution among them.
Im Laufe der Geschichte der Computersysteme hat sich ein nicht enden wollendes Wettrüsten entwickelt, bei dem es darum geht, die Oberhand zu gewinnen, wenn es darum geht, ein System anzugreifen oder zu verteidigen. Auf der einen Seite der Gleichung stehen die Gegner, die versuchen, neue Wege zu finden, um Angriffe zu starten und die vorhandenen Sicherheitsmaßnahmen zu umgehen. Auf der anderen Seite versucht die (industrielle, akademische oder sonstige) Forschungsgemeinschaft, neue und sichere Wege zur Entwicklung von Software vorzuschlagen. Das Hauptziel dieser Versuche besteht darin, Fehler und Schwachstellen im Code so weit wie möglich zu reduzieren. Außerdem werden ständig neue und innovative Ideen für Sicherheitsmechanismen entwickelt, um jeden Versuch abzuwehren, das zugrunde liegende System zu gefährden. Eine vollständige Sicherheit eines Programms ist jedoch aufgrund der zunehmenden Softwarekomplexität und der Kostenerwägungen des Marktes nicht möglich. Folglich müssen die oben genannten Schwachstellen entdeckt werden, bevor ein Angreifer die Chance hat, sie auszunutzen, oder der Angreifer muss auf frischer Tat ertappt werden, während er versucht, sie aktiv auszunutzen. Diese Dissertation konzentriert sich auf die Bereitstellung eines einheitlichen Ansatzes, der während der Ausführung die Sicherheit der Anwendungen und des zugrundeliegenden Systems durch Erweiterung gewährleistet. Dieser Ansatz zerlegt eine Anwendung in verschiedene Komponenten und erkennt Angriffe auf diese Komponenten. Dies wird erreicht, indem alle Ausführungspfade zwischen den Komponenten überwacht werden. Außerdem wird auf diese Angriffe angemessen reagiert, indem eine Reihe von Sicherheitsrichtlinien durchgesetzt wird. Diese Richtlinien gewährleisten ein hohes Maß an Sicherheit, wenn eine Anwendung ausgeführt wird. Die Arbeit beginnt mit einer Auflistung einer Reihe von Herausforderungen, die das Ziel schwierig und kompliziert machen, und ihren Beiträgen zur Bereitstellung einer sicheren Betriebsumgebung. Anschließend wird eine umfassende Liste der neuesten Forschungsergebnisse und -ansätze vorgestellt, die sich auf das gleiche Gebiet konzentrieren wie das, was wir zu erreichen versuchen, nämlich die Verteidigung gegen Code Injection/Reuse Attacks. Anschließend werden die Designüberlegungen des einheitlichen Ansatzes vorgestellt: (i) seine Architektur, (ii) das in der Entwicklungsphase berücksichtigte Gegner-Modell, (iii) die Sicherheitsannahmen für das zugrundeliegende System, (iv) die während der Implementierung und des Testens verwendete Testumgebung und (v) die zur Bewertung seiner Anwendbarkeit und Effizienz verwendeten Anwendungsfälle. In dieser Arbeit wird auch gezeigt, wie die Zugriffskontrolle für Bibliotheksaufrufe auf Benutzercode-Ebene durchgesetzt werden kann, um den Zugriff auf bestimmte Funktionen zu beschränken. Außerdem wird eine Bibliothek in kleinere Segmente unterteilt, was eine genauere Kontrolle über jeden Zugriffsversuch ermöglicht. Die Arbeit befasst sich also mit einem Ansatz zur Erstellung von Sicherheitsrichtlinien, die zur Laufzeit angewendet werden können und dem Überwachungs-Subsystem vorschreiben, welche Übergänge erlaubt sind. Anschließend wird ein Mechanismus auf Kernel-Ebene vorgestellt, der mit seinem Gegenstück auf Benutzerebene zusammenarbeiten kann, um das zugrunde liegende System zu stärken. Durch eine Modifikation der Memory Management Unit teilt dieser Mechanismus den Speicherbereich einer laufenden Anwendung auf der Grundlage von Seitenberechtigungen in separate Coderegionen auf und bestimmt, ob ein Aufruf von einer Region in eine andere erfolgen soll.Auf diese Weise bieten wir eine feinere Unterteilung des Speicherbereichs eines Prozesses, als es derzeit die Norm ist. Darüber hinaus wird in dieser Arbeit eine Trainingsumgebung vorgestellt, des Forschungsprojekts THREAT-ARREST, welches von der EU im Rahmen des H2020-Programms gefördert wurde, integriert wurde. Abschließend stellt die Arbeit eine Reihe von Anforderungen und Merkmalen auf, die jeder Sicherheitsmechanismus haben sollte, um praktikabel zu sein und bessere Chancen auf eine breite Akzeptanz und Annahme zu haben. Darüber hinaus wird der Gesamtansatz mit den modernsten Mechanismen verglichen, was zeigt, dass er als konkrete Lösung unter diesen bestehen kann.