Tvrtka Google objavila je izvorne kodove alata GWPSan, namijenjenog za otkrivanje grešaka tijekom izvođenja aplikacija sastavljenih za arhitekture x86-64 i ARM64. GWPSan se sastavlja kao dijeljena biblioteka koja se povezuje prilikom pokretanja aplikacije pomoću LD_PRELOAD i koristi mehanizme za analizu rada programa dostupne u Linux kernelu (PERF_TYPE_BREAKPOINT) i uzorkovanja procesa. Kod je napisan na C++ jeziku i distribuira se pod Apache 2.0 licencom.
GWPSan je strukturiran kao modularni okvir koji podržava povezivanje modula s implementacijama detektora različitih klasa grešaka. GWPSan izvršava dinamičku analizu, aktiviranu putem rukovatelja signala, što omogućava izbjegavanje promjene izvršnog koda aplikacije. Za učinkovito funkcioniranje većine detektora potrebna je izrada aplikacije s određenim zastavicama kompajlera koje dodaju potrebne metapodatke. Potreban je barem Clang 18 i Linux kernel 6.4.
Trenutno su dostupna tri detektora:
- UAR (Use-after-return) — otkriva greške uzrokovane korištenjem objekta u stogu nakon izlaska iz funkcije u kojoj je taj objekt bio definiran. Zaštita je organizirana putem presretanja ulaza i izlaza iz funkcije — pri ulazu se stog zamjenjuje kopijom za korištenje tijekom izvođenja funkcije, a pri izlasku se vraća prethodno stanje stoga.
- TSan (Thread Sanitizer) — određuje stanja utrke između niti (Data-race), koja nastaju kada različite niti koje se istovremeno izvode mogu čitati ili mijenjati zajednička područja memorije, a da pritom ne koriste mehanizme za sinkronizaciju rada. Zaštita se temelji na upotrebi hardverskih točaka prekida, povezanih sa zajedničkim područjima memorije. U trenutku aktiviranja, rukovatelj na kratko zaustavlja izvršavanje niti prilikom pristupa memoriji i tijekom tog prekida provjerava je li se aktivirala točka prekida za drugu nit.
- LMSan (Lightweight Memory Sanitizer) — identificira korištenje neinicijaliziranih podataka u memoriji. Detektor je označen kao eksperimentalni i nije preporučen za korištenje.
GWPSan analizira izvršni kod programa koristeći DynamoRIO okvir za dekodiranje strojno kodiranih instrukcija u apstraktne ISA instrukcije, koje se zatim izvršavaju putem emulatora. Periodičnim signalima s timerom poziva se unified handler, koji pri svakom pozivu izvršava određeni dio instrukcija za analizirani tok. U slučaju otkrivanja problema pri izvršavanju određenih instrukcija, pokreće se detektor specifičan za te instrukcije, na primjer, za instrukcije koje pristupaju memoriji, pokreće se detektor stanja utrke.
Izvor: opennet.ru
