Firma Google opublikowała źródłowe kody narzędzia GWPSan, zaprojektowanego do wykrywania błędów na etapie wykonywania aplikacji skompilowanych dla architektur x86-64 i ARM64. GWPSan jest dostarczany w postaci biblioteki dzielonej, która jest ładowana podczas uruchamiania aplikacji za pomocą LD_PRELOAD i wykorzystuje dostępne w jądrze Linux mechanizmy zatrzymywania (PERF_TYPE_BREAKPOINT) oraz próbkowania procesów. Kod jest napisany w języku C++ i rozpowszechniany na licencji Apache 2.0.
GWPSan jest zaprojektowany jako modułowy framework, wspierający integrację modułów z implementacjami detektorów różnych klas błędów. GWPSan przeprowadza dynamiczną analizę, aktywowaną przez obsługę sygnałów, co pozwala na obejście się bez modyfikacji wykonywanego kodu aplikacji. Aby większość detektorów działała efektywnie, wymagane jest skompilowanie aplikacji z określonymi flagami kompilatora, które dodają niezbędne metadane. Wymagana jest przynajmniej wersja Clang 18 oraz jądro Linux 6.4.
Obecnie dostępne są trzy detektory:
- UAR (Use-after-return) — wykrywa błędy spowodowane używaniem obiektu na stosie po zakończeniu funkcji, w której ten obiekt był zdefiniowany. Ochrona jest zorganizowana poprzez przechwytywanie punktów wejścia i wyjścia z funkcji — przy wejściu stos jest zastępowany kopią do użycia podczas wykonywania funkcji, a przy wyjściu przywracany jest poprzedni stan stosu.
- TSan (Thread Sanitizer) — określa stany wyścigu między wątkami (Data-race), które pojawiają się, gdy różne wątki wykonujące się jednocześnie mogą odczytywać lub modyfikować wspólne obszary pamięci, nie używając przy tym prymitywów synchronizacyjnych. Ochrona opiera się na użyciu sprzętowych punktów zatrzymania, które są przypinane do wspólnych obszarów pamięci. Aktywowany handler na chwilę wstrzymuje wykonanie wątku podczas dostępu do pamięci i w tym czasie sprawdza, czy inny wątek nie uruchomił punktu zatrzymania.
- LMSan (Lightweight Memory Sanitizer) — wykrywa użycie niezainicjowanych danych w pamięci. Detektor oznaczony jest jako eksperymentalny i niezalecany do użycia.
GWPSan analizuje wykonywalny kod programu, wykorzystując framework DynamoRIO do dekodowania kodu maszynowego na abstrakcyjne instrukcje ISA, które następnie są wykonywane za pomocą emulacji. Poprzez okresowe sygnały z timera wywoływany jest jednolity handler, który przy każdym wywołaniu wykonuje określoną część instrukcji dla analizowanego strumienia. W przypadku wykrycia podczas wykonywania określonych instrukcji uruchamiany jest specyficzny dla danych instrukcji detektor problemów, na przykład dla instrukcji odwołujących się do pamięci uruchamiany jest detektor stanów wyścigu.
Źródło: opennet.ru
