Clang vs. Clang: Verärgert Clang besser nicht
- Ein Blogbeitrag über ein Experiment zu Clang
- Ein Blick auf jüngste Änderungen in LLVM und GCC rund um Compiler-Optimierungen, darunter Optimierungen, Optimierungstests, Test-Fixes und Bugfixes
- Compiler-Autoren möchten keine Verantwortung für Bugs übernehmen, die sie selbst eingeführt haben
- Compiler-Optimierungen tragen kaum zu realen Leistungssteigerungen bei
Probleme bei Compiler-Optimierungen
- Optimierende Compiler verbessern die Performance nur selten
- Zum Beispiel ist die
avx2-Implementierung von kyber768 viermal schneller als mit einem optimierenden Compiler kompilierter Code
- Nach Todd A. Proebstings Gesetz tragen Compiler-Optimierungen fast nichts zur Rechenleistung bei
- Auch die Benchmark-Ergebnisse von Arseny Kapoulkine kommen zu einem ähnlichen Schluss
Sicherheitsprobleme
- Optimierende Compiler können nicht nur klassische Bugs verursachen, sondern auch Sicherheitsprobleme wie Timing-Leaks
- Laut einem EuroS&P-Paper von 2018 können Compiler-Upgrades Timing-Kanäle öffnen und dadurch sicheren Code verwundbar machen
- Für den Kyber-Referenzcode wurden erfolgreiche Timing-Angriffe auf mit Clang 15 oder neuer und Optimierungsoptionen kompilierten Code gemeldet
Das Werkzeug TIMECOP
- TIMECOP 2 ist in das Kryptographie-Test-Framework SUPERCOP integriert und scannt automatisch nach bedingten Verzweigungen, die aus Geheimnissen abgeleitet sind
- Unterschied zwischen TIMECOP 1 und TIMECOP 2: TIMECOP 2 markiert RNG-Ausgaben automatisch als geheim und läuft auf mehreren Kernen
Schreiben von Constant-Time-Code
- Im Juli 2024 wurde ein Vortrag darüber gehalten, wie man Constant-Time-Code schreibt
- Erklärung der in
libmceliece und SUPERCOP bereitgestellten Constant-Time-Funktionen
- Zum Beispiel sorgt die Funktion
crypto_uint32_bitmod_mask(x,j) dafür, dass der Compiler das 1-Bit-Ergebnis nicht erkennt
Vorbeugung gegen Probleme durch Compiler-Optimierungen
- Eine Möglichkeit zu verhindern, dass Compiler Timing-Leaks einführen, ist die Auslieferung von Bibliotheken in Assembler
- Assembler kann allerdings die Überprüfung der Korrektheit von Software erschweren
- Es wird nach Wegen gesucht, Schutz gegen Timing-Leaks schnell in Code wie C und C++ einzubauen
Der Patch clang-vs-clang
- Für die LLVM-Optimierungswerkzeuge wurde ein Patch geschrieben, der nach
&1 und >>31 scannt und Warnmeldungen ausgibt
- Zum Beispiel wird bei Code wie
x >>= 31 eine Warnmeldung ausgegeben
Fazit
- Compiler-Optimierungen tragen kaum zu Leistungssteigerungen bei und können Sicherheitsprobleme verursachen
- Mit Werkzeugen wie TIMECOP sollte man Constant-Time-Code schreiben und Problemen durch Compiler-Optimierungen vorbeugen
Zusammenfassung von GN⁺
- Dieser Artikel behandelt die Probleme und Sicherheitsrisiken von Compiler-Optimierungen
- Er betont, dass Compiler-Optimierungen kaum zu realen Leistungssteigerungen beitragen und Sicherheitsprobleme verursachen können
- Er stellt das Werkzeug TIMECOP und Methoden zum Schreiben von Constant-Time-Code vor, um Sicherheitsprobleme zu vermeiden
- Als weitere Möglichkeit zur Vermeidung von Problemen durch Compiler-Optimierungen wird auch die Auslieferung von Bibliotheken in Assembler vorgeschlagen
- Weitere Projekte in diesem Bereich sind sicherheitsorientierte Compiler wie FaCT und Jasmin
1 Kommentare
Hacker-News-Kommentare
Compiler-Autoren übernehmen keine Verantwortung für Bugs, die durch Optimierungen entstehen
Zustimmung zu Bernsteins Ansicht, aber sie geht manchmal in die falsche Richtung
C und C++ sind ungeeignet, um Algorithmen zu schreiben, die Garantien für konstante Laufzeit benötigen
Auf Intel-CPUs können weder clang noch sonst etwas im User-Mode korrekten Code erzeugen
Keine Zustimmung zu der Behauptung, dass Compiler-Autoren keine Verantwortung für Bugs tragen
clang hat das Attribut
clang::optnone, mit dem sich Optimierungen pro Funktion deaktivieren lassengnu::optimize, mit dem sich das Optimierungsniveau festlegen lässtclang::no_builtinsdeaktiviert Optimierungen für memcpy und memsetWegen des vielen undefinierten Verhaltens in C könnte ein Wechsel zu anderen Sprachen sinnvoll sein
Zustimmung zum Ziel von Kryptoexperten, aber allgemeine Compiler berücksichtigen das nicht
Es stimmt, dass einige Sprachen und Compiler ungeeignet sind, um Krypto-Routinen mit konstanter Laufzeit zu schreiben
Im Beispiel einer bestimmten Funktion tritt bei Eingabe von SIZE_T_MAX undefiniertes Verhalten auf