MSc-Talk Felix Stegmaier - Inter-procedural Static Analysis for Unsafe Rust using PhASAR
Abstract
Memory safety is an ever-present concern in software development where errors can lead to serious vulnerabilities and exploits. Rust is an emerging systems programming language that guarantees memory safety by utilizing a strong static type system and employing ownership-based resource management. Rust also grants access to low-level resources with unsafe code, which can circumvent some restrictions Rust usually imposes. Incorrect usage of unsafe code can lead to undefined behavior and memory safety issues. Static program analysis approaches can help to detect the presence of such memory safety issues. PhASAR is a static analysis framework developed by the Secure Software Engineering Group at Paderborn University that can run inter-procedural dataflow analysis on programs written in the intermediate representation of the LLVM compiler framework. As Rust uses LLVM for compilation, it is possible to apply analyses written with PhASAR to Rust programs. This thesis explores the feasibility of PhASAR-based dataflow analyses on the LLVM IR level to detect memory safety issues that arise from unsafe Rust code. An assessment of previously reported vulnerabilities related to unsafe Rust and a study of existing literature shows that certain patterns of unsafe code can lead to incorrect automatic deallocation of memory, which in turn leads to double-free and use-afterfree issues. This thesis presents an analysis implementation that uses a typestate analysis in PhASAR which tries to detect these patterns in the LLVM IR generated from Rust code. The analysis detects the presence of specific patterns of function call chains involving a possibly aliased set of values passed to the functions. Evaluation of the analysis on artificial test cases, on libraries with known vulnerabilities, and on popular libraries shows that the analysis can detect the pattern in simple, intra-procedural code but lacks effectiveness for real-world and inter-procedural code. This thesis concludes that PhASAR can be used for Rust programs for sample code but application on real-world code requires extra effort.
Zusammenfassung
Speichersicherheit is ein immer wiederkehrendes Thema in der Softwareentwicklung, bei dem Fehler zu schwerwiegenden Schwachstellen und Angriffsmöglichkeiten führen können. Rust ist eine aufstrebende Systemprogrammiersprache, die Speichersicherheit garantiert, indem sie ein strenges statisches Typsystem verwendet und eine Ressourcenverwaltung einsetzt, die auf Eigentümerschaft (ownership) basiert. Rust erlaubt durch die Verwendung von unsicherem (unsafe) Code auch den Zugriff auf systemnahe Ressourcen, wodurch einige Restriktionen umgangen werden können, die Rust normalerweise durchsetzt. Bei fehlerhafter Verwendung von unsicherem Code kann es zu undefiniertem Verhalten Problemen mit der Speichersicherheit kommen. Statische Programmanalysen können helfen, solche Speichersicherheitsfehler zu finden, ohne den Code auszuführen. PhASAR ist ein statisches Analyse-Framework, das von der Secure Software Engineering Group an der Universität Paderborn entwickelt wurde. Es kann interprozedurale Datenflussanalysen für Programme durchführen, die in der Zwischencode-Darstellung des LLVM-Compilersystems geschrieben wurden. Rust verwendet LLVM zur Kompilierung. Daher können Analysen, die mit PhASAR geschrieben wurden, auf Rust-Programme angewendet werden. In dieser Arbeit wird untersucht, ob es möglich ist Datenflussanalysen mit PhASAR zu verweden, um Speichersicherheitsfehler zu erkennen, die durch unsicheren Rust-Code entstehen. Eine Bewertung bereits gemeldeter Schwachstellen im Zusammenhang mit unsicherem Rust-Code und eine Untersuchung der bestehenden Literatur zeigt, dass bestimmte Code-Muster zu einer fehlerhaften automatischen Freigabe von Speicher führen können, was wiederum zu mehrfacher Deallokation (double-free Fehler) oder Verwendung von Speicher nach der Deallokation (use-after-free Fehler) führt. Diese Arbeit beschreibt eine Analyse-Implementierung, die eine Typestate-Analyse in PhASAR verwendet, um diese Muster in LLVM-Zwischencode zu erkennen, der aus Rust-Code generiert wurde. Die Analyse erkennt diese Muster an Funktionsaufrufen auf Variablen. Die Analyse wurde an synthetischen Testfällen, Bibliotheken mit bekannten Schwachstellen und populären Bibliotheken getestet. Die Auswertung zeigt, dass sie die Muster in einfachem, intra-prozeduralem Code erkennen kann, aber für praxisrelevanten und inter-prozeduralem Code nicht effektiv ist. Die Arbeit kommt zu dem Schluss, dass PhASAR für Rust-Programme in eingeschränktem Maße geeignet ist. Die Anwendung auf Codebasen aus der Praxis aber erfordert weitere Arbeit.