Die vielfältigen Dienste und Anwendungen, die durch moderne Computersysteme ermöglicht werden, sind in unserem Alltag allgegenwärtig. Wir verlassen uns zunehmend auf komplexe Computersysteme um wichtige alltägliche Funktionen bereitzustellen. Dabei handelt es sich oft um Systeme, deren Soft- und Hardware nicht spezialisiert, sondern aus Standardkomponenten konstruiert ist. Da wir uns mehr und mehr auf solche Systeme verlassen, müssen wir sicherstellen, dass sie zuverlässig sind und die von ihnen erwartete Funktionalität durchgehend bereitstellen können. Folglich benötigen wir Techniken, die geeignet sind, die Zuverlässigkeit solcher Systeme zu überprüfen und zu verbessern. Praxistaugliche Techniken müssen sowohl auf komplexe Softwaresysteme anwendbar sein als auch mit deren zunehmender Größe skalieren. Verbreitete Ansätze zur Verbesserung der Zuverlässigkeit von Softwaresystemen sind Testverfahren, mit denen Fehler und Zuverlässigkeitsmängel gefunden werden können, sowie Verfahren zur Vorhersage der möglichen Auswirkungen im System verbleibender Fehler. Softwarefehlerinjektionstechniken (SFI-Techniken) können in beiden Kontexten genutzt werden, sowohl um Zuverlässigkeitsmängel zu finden als auch um die Auswirkungen verbleibender Fehler abzuschätzen. Andere Techniken, wie Fuzzing, dienen in erster Linie dazu, Fehler zu finden. Viele Verfahren zur Verbesserung der Softwarezuverlässigkeit leiden unter Skalierbarkeitsproblemen und sind schwer auf große, komplexe Softwaresysteme, insbesondere auf Systemsoftware wie den Betriebssystemkernel, anwendbar. Vor diesem Hintergrund zielt diese Dissertation darauf ab, die Effizienz und Präzision von SFI-Techniken für Systemsoftware zu verbessern sowie neue Steuerungsmechanismen für feedbackbasierte Fuzzing-Verfahren zu entwickeln. Wir entwicklen ein Verfahren zur Nachverfolgung der Ausbreitung von Fehlerauswirkungen in monolithischen Betriebssystemen, wenden es auf Module aus dem weit verbreiteten Linux-Kernel an und zeigen, dass konventionelle Verfahren einen beträchtlichen Anteil der anscheinend erfolgreichen SFI-Testausführungen falsch klassifizieren. Da mit zunehmender Softwarekomplexität gerade auch SFI-Techniken unter Skalierbarkeitsproblemen leiden, wenden wir uns dann der Beschleunigung von SFI-Tests zu. Zunächst entwickeln wir ein neuartiges Ausführungsmodell für im Benutzer-Modus laufende Software, welches, unter Verwendung von statischer und dynamischer Analyse, die wiederholte, redundante Ausführung von Programmcode vermeidet und Parallelisierung begünstigt.
Da lange SFI-Tests für Systeme, welche zusätzliche Instrumentierung zur Nachverfolgung der Auswirkungen von Fehlern benötigen, ein besonders großes Problem sind, entwickeln wir einen Ansatz, der auch SFI-Tests für Betriebssysteme beschleunigen kann. Wir wenden diesen Ansatz auf instrumentierten Code aus dem Linux-Kernel an und erreichen eine erhebliche Verkürzung der SFI-Testdauer. Zuletzt entwickeln wir einen neuartigen Mechanismus zur Steuerung von feedbackbasierten Fuzzing-Verfahren, welcher eingabeabhängige Speicherzugriffe im getesteten Programm nutzt. | German |