Compiler-Infrastruktur LLVM 15 bringt Sicherheitsfunktionen im Clang-Compiler

Neben den Compiler-Funktionen unter anderem gegen ROP-Exploits, erweitert LLVM die Backends vor allem im Bereich ARM, aber auch für DirectX.

In Pocket speichern vorlesen Druckansicht 9 Kommentare lesen

(Bild: Milos996 (CC BY-SA 4.0))

Lesezeit: 3 Min.
Von
  • Rainald Menge-Sonnentag
Inhaltsverzeichnis

Im turnusmäßigen Halbjahrestakt ist die Compiler-Infrastruktur LLVM in Version 15 erschienen. Sie bringt einige Ergänzungen bei den Backends, darunter eine experimentelle DirectX-Anbindung. Der Clang-Compiler hat im aktuellen Release Sicherheitsfunktionen sowie erste Features des kommenden C++-Standards an Bord.

Clang kennt für x86-Architketuren neuerdings den Parameter -fzero-call-used-regs, der die Inhalte von bestimmten Registern vor der Rückkehr aus einer Funktion auf Null setzt. Das Vorgehen verringert das Risiko von Angriffen durch Return-Oriented Programming (ROP) und den Varianten Jump-Oriented Programming (JOP) und Call-Oriented Programming (COP). Die Attacken manipulieren den Aufrufstack und ändern den Programmfluss beziehungsweise die Kontrollstruktur.

Außerdem kann Clang das Layout von C-Strukturen zufällig anordnen, um Angreifern das Auslesen von Daten aus Strukturen zu erschweren. Das Attribut randomize_layout steuert die zufällige Anordnung, die einen Seed-Wert benötigt und basierend darauf deterministisch ist. Die Randomisierung ist nur für C-Code möglich.

Einige Clang-Fuktionen greifen die kommenden C- und C++-Standards auf, die vermutlich als C23 beziehungsweise C++23 erscheinen werden. In Clang sind sie als C2X und C++2b gekennzeichnet. Für letzteren Standard kann Clang unter anderem den multidimensionalen Subscript-Operator verarbeiten, also mehrdimensionale Arrays in eckigen Klammern wie a[x, y].

Im Zusammenspiel mit C23 erkennt Clang true und false wie im Standardisierungsvorschlag vorgesehen als Schlüsselwörter. Bisher sind die booleschen Literale in C im Gegensatz zu zahlreichen anderen Sprachen wie C++ keine dedizierten Keywords. Außerdem soll in C23 das Attribut [[noreturn]] die bisherige Funktionsauszeichnung _Noreturn ersetzen, um anzuzeigen, dass eine Funktion nach ihrer Ausführung nicht den Programmfluss an den Aufrufer zurückgibt. Die Syntax soll eine konsistente Auszeichnung für C und C++ bieten, und Clang 15 verarbeitet die geplante Änderung.

Jenseits der Neuerungen im Clang-Compiler bringt LLVM 15 einige Ergänzungen mit. Nennenswert sind die neuen Backends im ARM-Umfeld, darunter die Architekturen ARMv9-A, ARMv9.1-A und ARMv9.2. Die von der HLSL-Community (High Level Shading Language) im Frühjahr vorgeschlagene Anbindung der für DirectX entwickelten Shader-Sprache trägt erste Früchte mit dem experimentellen DirectX-Backend in LLVM 15. Microsoft hatte die HLSL bereits 2017 als Open-Source-Projekt freigegeben. Für das DirectX-Backend ist ein manueller Build von LLVM mit dem Parameter -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX in der CMake-Konfiguration erforderlich, da die Anbindung in den vorgefertigten Binaries fehlt.

Darüber hinaus ist eine interne Änderung nennenswert: Für den Zwischencode (Intermediate Representation, IR) verzichtet LLVM künftig auf die explizite Angabe von Pointee-Typen, also den Typ der Werte, auf die ein Pointer zeigt wie i8* oder void()**. Künftig nutzt das System stattdessen den einheitlichen opaken Zeigertyp ptr. Die Änderung wurde erstmals 2015 vorgeschlagen. Die expliziten Pointee-Typen sollten ursprünglich mehr Typsicherheit geben und Optimierungen ermöglichen, die aber wohl weitgehend ausblieben. Stattdessen haben sie die Verarbeitung im Zwischencode verkompliziert.

Weitere Neuerungen und Änderungen lassen sich den Release Notes zu Clang 15 und LLVM 15 entnehmen. Derweil steht mit dem Wechsel des C++-Standard von C++14 auf C++17 bereits die erste Neuerung für LLVM 16 an.

(rme)