Das Unternehmen Google hat die Quelltexte des GWPSan-Tools veröffentlicht, das zur Erkennung von Fehlern während der Ausführung von Anwendungen entwickelt wurde, die für die Architekturen x86-64 und ARM64 kompiliert sind. GWPSan wird als gemeinsam genutzte Bibliothek bereitgestellt, die beim Start der Anwendung über LD_PRELOAD verknüpft wird und zur Analyse des Programmverhaltens verfügbare Mechanismen im Linux-Kernel zur Unterbrechung (PERF_TYPE_BREAKPOINT) und Prozess-Sampling verwendet. Der Code ist in C++ geschrieben und wird unter der Apache 2.0-Lizenz vertrieben.
GWPSan ist als modulares Framework gestaltet, das die Einbindung von Modulen mit Implementierungen für verschiedene Klassen von Fehlerdetektoren unterstützt. GWPSan führt eine dynamische Analyse durch, die über Signalhandler aktiviert wird, wodurch eine Änderung des ausführbaren Codes der Anwendung vermieden wird. Für den effektiven Betrieb der meisten Detektoren ist es erforderlich, die Anwendung mit bestimmten Compiler-Flags zu kompilieren, die die erforderlichen Metadaten hinzufügen. Es wird mindestens Clang 18 und ein Linux-Kernel 6.4 benötigt.
Derzeit stehen drei Detektoren zur Verfügung:
- UAR (Use-after-return) – erkennt Fehler, die durch die Verwendung eines Objekts auf dem Stack nach dem Verlassen der Funktion verursacht werden, in der das Objekt definiert wurde. Der Schutz erfolgt durch die Abfangung der Eingangs- und Ausgangspunkte der Funktion – beim Eintreten wird der Stack durch eine Kopie ersetzt, die während der Ausführung der Funktion genutzt wird, und beim Verlassen wird der alte Zustand des Stacks zurückgegeben.
- TSan (Thread Sanitizer) – identifiziert Race Conditions (Datenrennen) zwischen Threads, die entstehen, wenn verschiedene gleichzeitig ausgeführte Threads auf gemeinsame Speicherbereiche zugreifen oder diese ändern, ohne dabei Synchronisationsprimitive zu verwenden. Der Schutz beruht auf der Verwendung von hardwaregestützten Haltepunkten, die an gemeinsam genutzte Speicherbereiche gebunden sind. Ein ausgelöster Handler unterbricht für einen kurzen Zeitraum die Ausführung des Threads beim Zugriff auf den Speicher und prüft in dieser Unterbrechung, ob ein Haltepunkt für einen anderen Thread ausgelöst wurde.
- LMSan (Lightweight Memory Sanitizer) – erkennt die Verwendung von nicht initialisierten Daten im Speicher. Dieser Detektor ist als experimentell gekennzeichnet und wird nicht für die Verwendung empfohlen.
GWPSan analysiert den ausgeführten Programmcode, indem es das Framework DynamoRIO verwendet, um den Maschinencode in abstrakte ISA-Anweisungen zu decodieren, die dann durch Emulation ausgeführt werden. Durch periodische Signale des Timers wird der einheitliche Handler aufgerufen, der bei jeder Ausführung einen bestimmten Teil der Anweisungen des analysierten Streams ausführt. Bei der Ausführung bestimmter Anweisungen wird ein spezifischer Problemdetektor für diese Anweisungen aktiviert, beispielsweise wird für Anweisungen, die auf den Speicher zugreifen, ein Detektor für Race Conditions gestartet.
Quelle: opennet.ru
