Odcinek 8: Vlad Tsyrklevich z Seattle w stanie Waszyngton (listopad 2019)
Poprzednie odcinki
Debugowanie błędów związanych z bezpieczeństwem pamięci, takich jak „use-after-free” czy przepełnienia bufora, może być trudne. Narzędzia takie jak AddressSanitizer (ASan) pomagają w wykrywaniu błędów pamięci w testach jednostkowych i mechanizmach wyszukiwania, ale wiele błędów pojawia się dopiero po wdrożeniu u użytkowników, gdy nakład pracy ASan jest zbyt wysoki.
GWP-ASan to detektor błędów pamięci składający się tylko z sterty przeznaczony do użytku w środowisku naturalnym. Wykrywa ona przypadki użycia po jej zwolnieniu, przepełnienia/niedopełnienia bufora i podwójne zwolnienie. W przeciwieństwie do ASan nie wykrywa błędów na stosie ani w globalnych obszarach.
Próbkując niewielki odsetek alokacji, GWP-ASan może zapewnić wykrywanie prawdopodobnych błędów przy minimalnym nakładzie pamięci i zniżkach dotyczących wydajności. GWP-ASan powoduje awarię procesu natychmiast po wystąpieniu błędu pamięci wykorzystującej próbkowaną alokację. Ułatwia to wykrywanie błędu, ponieważ awaria pojawia się dokładnie w miejscu wystąpienia błędu, a nie, gdy używana jest uszkodzona pamięć.
Podobnie jak w ASan raporty o awariach GWP-ASan obejmują alokację i śledzenie stosu transakcji, które ułatwiają debugowanie problemów z pamięcią. Spójrzmy na przykład (crbug/956230) niektórych dodatkowych danych w interfejsie awarii:
Zastosowanie i transakcja mają miejsce w tym regionie: PDFiumEngine::ExtendSelection()
.
W źródle szybko widać, że błąd dotyczy użycia unieważnionego iteratora std::vector
.
GWP-ASan jest włączone w wersji stabilnej w przypadku alokacji wykonywanych za pomocą malloc
/new
i PartitionAlloc
w systemach Windows i macOS. Trwają prace nad
obsługą Androida. Do tej pory zgłoszono ponad 60 błędów GWP-ASan i rozwiązaliśmy około 70%. Awarie GWP-ASan to potencjalne problemy z bezpieczeństwem, które mogą zostać wykorzystane. W razie potrzeby oceń je szybko i w razie potrzeby poproś o zwroty.