Aflevering 8: door Vlad Tsyrklevitsj in Seattle, WA (november 2019)
Vorige afleveringen
Het debuggen van geheugenveiligheidsfouten, zoals use-after-frees of bufferoverflows, kan lastig zijn. Tools als AddressSanitizer (ASan) zijn behulpzaam bij het opsporen van geheugenfouten in unittests en fuzzers, maar veel bugs manifesteren zich pas na implementatie bij gebruikers waarbij de overhead van ASan onbetaalbaar hoog is.
GWP-ASan is een heap-only geheugenfoutdetector die is ontworpen voor gebruik in het wild. Het detecteert use-after-frees, buffer overflows/underflows en double frees. In tegenstelling tot ASan detecteert het geen fouten op de stapel of in globals.
Door een klein percentage van de toewijzingen te bemonsteren, kan GWP-ASan probabilistische foutdetectie bieden met verwaarloosbare geheugen- en prestatieoverhead. GWP-ASan zorgt ervoor dat het proces onmiddellijk crasht wanneer er een geheugenfout optreedt bij een bemonsterde toewijzing. Dit maakt het gemakkelijker om de bug op te sporen, aangezien de crash precies plaatsvindt op de plek waar de fout is gemaakt, in plaats van op een later tijdstip wanneer beschadigd geheugen wordt gebruikt.
Net als ASan bevatten GWP-ASan-crashrapporten toewijzings- en delocatie-stacktraceringen om geheugenproblemen op te lossen. Laten we eens kijken naar een voorbeeld ( crbug/956230 ) van enkele aanvullende gegevens die in de crash-gebruikersinterface worden weergegeven:
Het gebruik en de toewijzing zijn beide afkomstig van PDFiumEngine::ExtendSelection()
. De bron laat snel zien dat de bug een gebruik is van een ongeldige std::vector
iterator.
GWP-ASan is ingeschakeld op het stabiele kanaal voor toewijzingen gemaakt met malloc
/ new
en PartitionAlloc
op Windows en macOS. Android-ondersteuning is in uitvoering. Tot nu toe zijn er meer dan 60 GWP-ASan-bugs gerapporteerd en ongeveer 70% is opgelost. GWP-ASan-crashes zijn allemaal potentiële beveiligingsproblemen die kunnen worden misbruikt, dus controleer ze snel en vraag waar nodig backports aan.