GCC optimiert Sicherheitsprüfungen weg

Die Compiler der Gnu Compiler Collection (GCC) optimieren ab Version 4.1 bestimmte Längenprüfungen weg. In der Folge können damit kompilierte Programme für Pufferüberläufe anfällig sein.

In Pocket speichern vorlesen Druckansicht 602 Kommentare lesen
Lesezeit: 2 Min.
Von

Die Entwickler der quelloffenen Compiler-Sammlung GCC haben einige Grundannahmen geändert, durch die Optimierungen beim Kompilieren bestimmte Längenprüfungen aus dem Code entfernen können. In der Folge können damit erzeugte Programme anfällig für Pufferüberläufe sein. Erste Hinweise auf dieses Problem gab es offenbar bereits vor zwei Jahren, aber erst jetzt warnt das US-CERT vor dieser Änderung.

Bei Operationen mit den Datentypen

char *buf;
int len;

gehen die gcc-Compiler ab Version 4.1 davon aus, dass die Summe von buf und len stets größer als der Wert von buf ist, wenn sie den int-Wert für vorzeichenlos halten, etwa weil ihm zuvor ein Wert zugewiesen wurde. Enthält der Programmcode Prüfungen der Art

if(buf+len < buf) { ... }

entfernt der Compiler die Prüfung und den Funktionsblock. Allerdings kann durch einen Ganzzahl-Überlauf diese Annahme falsch und in der Folge der erzeugte Binärcode anfällig für einen Pufferüberlauf sein.

Das CCC-Mitglied Felix von Leitner hat diese Verhaltensänderung der gcc-Compiler bereits Mitte April 2006 als Fehler an die gcc-Entwickler gemeldet. Laut einem Eintrag im Bugtracker-System haben die Entwickler auch einen Patch in die Quellen eingepflegt, allerdings scheint der das Problem nicht zu beheben.

Das US-CERT erläutert in einer Sicherheitsmeldung, wie Programmierer das Problem umgehen können. Zum einen schlagen die Sicherheitsexperten vor, Überlauf-Prüfungen als sogenannte Pre-Conditions vorzunehmen. Als einfacher und rascher umzusetzende Lösung können Programmierer sich aber auch einer Typ-Umwandlung bedienen. Die obige Prüfung funktioniert, wenn der Typ char* vor der Prüfung in uintptr_t oder size_t gewandelt wird:

if((uintptr_t)buf+len < (uintptr_t)buf) { ... }

Laut US-CERT sind gcc-Compiler ab Version 4.2 von dieser Verhaltensänderung betroffen, von Leitner hat sie jedoch bereits in der Version 4.1 gemeldet. Entwickler sollten ihren Code auf das Vorkommen betroffener Prüfungen untersuchen und sie entweder wie beschrieben anpassen oder ihren Code mit älteren gcc-Compilern übersetzen.

Siehe dazu auch:

(dmk)