Control Flow Guard schützt Kontrollfluss im C++-Compiler Clang/LLVM und in Rust
Die Sicherheitstechnik soll zum Beispiel das Verändern von Funktions-Pointern durch erzwungene Kontrollfluss-Integrität verhindern.
- Silke Hahn
Neuerdings unterstützen der C/C++-Compiler Clang/LLVM 10.0 und Rust (ab 1.47) den Control Flow Guard (CFG) von Microsoft. Beim LLVM-Projekt handelt es sich um eine Sammlung modularer, wiederverwendbarer Compiler- und Toolchain-Technologien – das aktuelle LLVM 10.0 unterstützt CFG, dessen Implementierung nun vollständig in den Kernbibliotheken des Compilers enthalten ist. Jeder auf LLVM aufbauende Compiler kann die Implementierung offenbar durch das Setzen passender Flags wiederverwenden.
Die Sicherheitstechnologie CFG ist bereits sei Windows 8.1 verfügbar und zielt darauf ab, Änderungen des Kontrollflusses in Programmen zu verhindern. Angriffe durch Speichersicherheitslücken, zum Beispiel per Code-Reuse-Angriff und beim Versuch, Funktions-Pointer zu beschädigen, erfordern in der Regel, dass die Angreifer die Integrität des Kontrollflusses verletzen.
Prüfung per Bitmap mit zulässigem Adressraum
Der CFG soll dieser Möglichkeit auf zweierlei Weise vorbeugen: Das Wächtertool prüft Laufzeiten, um die Zieladresse jeder indirekten Verzweigungsanweisung zu validieren, bevor die Verzweigung (Branch) abgeschlossen ist. Dafür fügt es an passenden Stellen Laufzeitprüfungen hinzu und stellt eine Liste mit gültigen Branchzielen bereit.
Während der Kompilierung identifiziert der Wächter offenbar alle indirekten Zweige und fügt jedem eine CFG-Prüfung hinzu. Dann gibt er Metadaten mit den relativen Adressen aller aufgerufenen Funktionen aus. Diese Metadaten nutzt der Loader, um eine Bitmap des Adressraums zu erzeugen, und markiert darin, welche Adressen gültige Zielzweige enthalten. Sind indirekte Branches adressiert, prüft das Tool, ob die Zieladresse in der Bitmap enthalten ist. Falls nicht, unterbindet es den Prozess.
Ein Tool gegen Exploits, auch für Rust
Microsoft erforscht auch den Einsatz von Rust als potentiell sicherer Systemprogrammiersprache. An sich gilt es als größte Stärke von Rust, dass sein Ownership-Modell Speichersicherheit garantiert. Das Anpreisen eines Tools zur Absicherung vor der Ausnutzung von Speicher-Sicherheitslücken für Rust könnte daher zunächst irritieren.
Laut Blogeintrag des Microsoft Security Response Center gibt es allerdings zwei handfeste Gründe für den Einsatz von CFG bei Rust: Code dieser Programmiersprache koexistiert oft mit C/C++-Code in einer gemeinsamen Code-Basis, also wenn ein Rust-Programm C/C++-Bibliotheken aufruft oder umgekehrt. Aber auch bei rein Rust-basiertem Code könnten wohl Sicherheitslücken auftreten, wenn dieser unsichere Passagen enthält.
Aktivieren des Control Flow Guard per Flag
Der CFG ist ab Rust 1.47 (Nightly Version) verfügbar. Zum Aktivieren müssen Nutzer lediglich das Flag -C control-flow-guard
setzen. Bei Clang 10.0 ist der Guard für C/C++-Projekte verfügbar, zum Beispiel lässt er sich mit der Option -cfguard cc1
dort aktivieren. Der Control Flow Guard ist laut Blogeintrag kompatibel zu anderen vorbeugenden Maßnahmen gegen Exploit-Programme, die Sicherheitslücken in Computersystemen ausnutzen.
Weiterführende Informationen lassen sich dem ankündigenden Blogeintrag des Microsoft Security Response Center (MSRC) entnehmen. Hintergründe zum Control Flow Guard finden Interessierte in der Dokumentation des Tools. Zu Microsofts Forschung an Rust hat das MSRC-Team eine Reihe von Blogbeiträgen zusammengestellt.
(sih)