Google har offentliggjort kildekoden til værktøjet GWPSan, som er designet til at identificere fejl under kørslen af applikationer, der er bygget til x86-64 og ARM64 arkitekturer. GWPSan leveres som et delt bibliotek, som knyttes til applikationen ved hjælp af LD_PRELOAD ved opstart, og bruger de tilgængelige mekanismer i Linux-kernen til stop (PERF_TYPE_BREAKPOINT) og procesprøvetagning til at analysere programmets udførelse. Koden er skrevet i C++ og distribueres under Apache 2.0 licensen.
GWPSan er designet som en modulær ramme, der understøtter tilslutning af moduler med implementering af detektorer for forskellige klasser af fejl. GWPSan udfører dynamisk analyse, der aktiveres gennem signalbehandlere, hvilket gør det muligt at undgå ændringer i den udførbare applikationskode. For at de fleste detektorer kan fungere effektivt, kræver det, at applikationen kompileres med særlige flag, der tilføjer nødvendige metadata. Minimumskrav er Clang 18 og Linux-kernen 6.4.
I øjeblikket er der tre detektorer tilgængelige:
- UAR (Use-after-return) — identificerer fejl forårsaget af brugen af et objekt på stakken efter det er forladt fra den funktion, hvor objektet blev defineret. Beskyttelsen er organiseret gennem opsnapning af ind- og udgangspunkter for funktionen — ved indgangen erstattes stakken med en kopi til brug under udførelsen af funktionen, og ved udgangen returneres den gamle staktilstand.
- TSan (Thread Sanitizer) — identificerer racedækning mellem tråde (Data-race), som opstår når forskellige tråde, der kører samtidigt, kan læse eller ændre fælles hukommelsesområder uden at bruge synkroniseringsprimitive. Beskyttelsen er baseret på brugen af hardware stoppunkter, der knyttes til de fælles hukommelsesområder. En handler aktiveres i en kort periode og undertrykker kørsel af tråden ved adgang til hukommelse, og kontrollerer under denne pause, om et stoppunkt blev udløst for en anden tråd.
- LMSan (Lightweight Memory Sanitizer) — identificerer brugen af uinitialiserede data i hukommelsen. Detektoren er markeret som eksperimentel og anbefales ikke til brug.
GWPSan analyserer programmens eksekverende kode ved hjælp af DynamoRIO-rammeværket til at dekode maskinkode til abstrakte ISA-instruktioner, som derefter udføres ved hjælp af emulering. Gennem periodiske signaler fra timeren kaldes en unified handler, der ved hver kald udfører en bestemt mængde instruktioner for den analyserede strøm. Ved opdagelse af specifikke instruktioner, der eksekveres, aktiveres en instruktionsspecifik problemdetektor; for instruktioner, der tilgår hukommelsen, aktiveres f.eks. detektor for race-tilstande.
Kilde: opennet.ru
