Je compiler kan je beveiligingscontroles ongedaan maken

Hoe optimalisaties kwetsbaarheden introduceren

In een gesprek tijdens Black Hat legt beveiligingsonderzoeker Chris Domas uit hoe legale compiler-optimalisaties beveiligingsmaatregelen kunnen verwijderen, operaties voor het wissen van geheugen kunnen deleten en time-of-check to time-of-use (TOCTOU) kwetsbaarheden kunnen introduceren in code die op het eerste gezicht veilig lijkt.

Chris bespreekt hierbij de abstracte machine van C, de redenen waarom compilers code zo drastisch mogen transformeren en de impact van factoren zoals registerdruk, structuurindeling en datagrootte op de veiligheid van een binair bestand. Een opvallend voorbeeld is dat code met een grootte van 17 of 33 bytes veilig kan zijn, terwijl nabijgelegen groottes juist kwetsbare code produceren.

Analyse en preventie

Tijdens de analyse werd ook gekeken naar alternatieven en tools:

  • Talen en Compilers: Er is besproken of Rust dit probleem oplost en waarom het simpelweg switchen tussen GCC en Clang geen volledige oplossing is.
  • AI-onderzoek: Er is AI ingezet om 500 miljoen regels open-source code te analyseren, waarbij 300 potentieel gevaarlijke patronen zijn geïdentificeerd.

Aanbevelingen voor ontwikkelaars

Om de risico's van compiler-optimalisaties te beperken, adviseert Chris ontwikkelaars de volgende stappen te ondernemen:

  • Schakel compiler-waarschuwingen in.
  • Maak gebruik van sanitizers.
  • Analyseer geoptimaliseerde builds.
  • Test het exacte binaire bestand dat daadwerkelijk wordt verzonden (shipped).