AddressSanitizer - AddressSanitizer - Wikipedia
![]() | tento článek potřebuje další citace pro ověření.Červenec 2014) (Zjistěte, jak a kdy odstranit tuto zprávu šablony) ( |
AddressSanitizer (nebo ASan) je open source programovací nástroj od Google který detekuje poškození paměti hmyz jako přetečení vyrovnávací paměti nebo přistupuje k a visící ukazatel (use-after-free). AddressSanitizer je založen na překladač instrumentace a přímo mapované stínová paměť. AddressSanitizer je aktuálně implementován v Zvonit (od verze 3.1[1]) , GCC (od verze 4.8[2]), Xcode (od verze 7.0[3]) a MSVC (od verze 16.4[4]). V průměru přístrojové vybavení zvyšuje dobu zpracování přibližně o 73% a využití paměti o 240%.[5]
Uživatelé
Chrom a Firefox vývojáři jsou aktivní uživatelé AddressSanitizer;[6][7] nástroj v těchto webových prohlížečích našel stovky chyb.[8]V systému bylo nalezeno několik chyb FFmpeg[9]a FreeType.[10] The Linuxové jádro povolil AddressSanitizer pro x86-64 architektura od Linuxu verze 4.0.
KernelAddressSanitizer
The KernelAddressSanitizer (KASAN) detekuje chyby dynamické paměti v linuxovém jádře.[11] Přístrojové vybavení jádra vyžaduje speciální funkci v kompilátoru dodávajícím -fsanitize = adresa jádra možnost příkazového řádku, protože jádra nepoužívají stejný adresní prostor jako běžné programy.[12][13]
Příklady
Haldy-použití-po-zdarma
1 // Kompilace: g ++ -O -g -fsanitize = adresa heap-use-after-free.cc2 int hlavní(int argc, char **argv) {3 int *pole = Nový int[100];4 vymazat [] pole;5 vrátit se pole[argc]; // VÝLOŽNÍK6 }
$ ./a.out==5587== CHYBA: AddressSanitizer: halda-použití-po-zdarma na adrese 0x61400000fe44 na PC 0x47b55f bp 0x7ffc36b28200 sp 0x7ffc36b281f8READ velikosti 4 na 0x61400000fe44 vlákno T0 # 0reeree / test_F v hlavním / U .cc: 7 # 1 0x7f15cfe71b14 v __libc_start_main (/lib64/libc.so.6+0x21b14) # 2 0x47b44c v _start (/root/a.out+0x47b44c)0x61400000fe44 se nachází 4 bajty uvnitř 400bytové oblasti [0x61400000 0x61400000ffd0) uvolněno závitem T0 zde: # 0 0x465da9 v operátoru delete [] (void *) (/root/a.out+0x465da9) # 1 0x47b529 v hlavním /home/test/example_UseAfterFree.cc:6 dříve přiděleno vláknem T0 zde : # 0 0x465aa9 v operátoru new [] (unsigned long) (/root/a.out+0x465aa9) # 1 0x47b51e v main /home/test/example_UseAfterFree.cc:5 SHRNUTÍ: AddressSanitizer: heap-use-after-free / home /test/example_UseAfterFree.cc:7 mainShadow bajtů kolem adresy buggy: 0x0c287fff9f70: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 0x0c287fff9f80: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 0x0c287fff9f90: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 0x0c287fff9fa0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 0x0c287fff9fb0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa => 0x0c287fff9fc0: fa fa fa fa fa fa fa fa fa [fd] fd fd fd fd fd fd fd fd 0x0c287fff9fd0: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd 0x0c287fff9fe0: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd 0x0c287fff9ff0: fd fd fd fd fd fd fd fd fd fd fd fa fa fa fa fa fa 0x0c287fffa000: fa fa fa fa fa fa fa 0x0c287fffa010: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa Stínová bajtová legenda (jeden stínový bajt představuje 8 bajtů aplikace): Adresovatelný: 00 Částečně adresovatelný: 01 02 03 04 05 06 07 Halda levá červená zóna: fa halda pravá červená zóna: fb Oblast uvolněné haldy: fd Zásobník levá červená zóna: f1 Zásobník střední červená zóna: f2 Zásobník pravá červená zóna: f3 Zásobník částečná červená zóna: f4 Zásobník po návratu: f5 Použití zásobníku po rozsahu: f8 Globa l redzone: f9 Global init order: f6 Otráveno uživatelem: f7 ASan interní: fe == 5587 == ABORTING
Přetečení haldy vyrovnávací paměti
1 // RUN: clang ++ -O -g -fsanitize = adresa% t && ./a.out2 int hlavní(int argc, char **argv) {3 int *pole = Nový int[100];4 pole[0] = 0;5 int res = pole[argc + 100]; // VÝLOŽNÍK6 vymazat [] pole;7 vrátit se res;8 }
== 25372 == CHYBA: AddressSanitizer: přetečení haldy vyrovnávací paměti na adrese 0x61400000ffd4 na PC 0x0000004ddb59 bp 0x7fffea6005a0 sp 0x7fffea600598READ velikosti 4 na 0x61400000ffd4 vlákno T0 # 0 0x46bfee v main1 napravo od 400bajtové oblasti [0x61400000fe40,0x61400000ffd0) přidělené vláknem T0 zde: # 0 0x4536e1 v operátoru delete [] (void *) # 1 0x46bfb9 v main /tmp/main.cpp:2:16
Přetečení vyrovnávací paměti zásobníku
1 // RUN: clang -O -g -fsanitize = adresa% t && ./a.out2 int hlavní(int argc, char **argv) {3 int stack_array[100];4 stack_array[1] = 0;5 vrátit se stack_array[argc + 100]; // VÝLOŽNÍK6 }
== 7405 == CHYBA: AddressSanitizer: stack-buffer-overflow na adrese 0x7fff64740634 na PC 0x46c103 bp 0x7fff64740470 sp 0x7fff64740468READ velikosti 4 na 0x7fff64740634 vlákno T0 # 0 0x46c10ck inam vlákno T0 při offsetu 436 v rámci # 0 0x46bfaf v main /tmp/example_StackOutOfBounds.cc:2 Tento rámec má 1 objekt (y): [32, 432) 'stack_array' <== Přístup k paměti u offsetu 436 přetéká touto proměnnou
Global-buffer-overflow
// RUN: clang -O -g -fsanitize = adresa% t && ./a.outint global_array[100] = {-1};int hlavní(int argc, char **argv) { vrátit se global_array[argc + 100]; // VÝLOŽNÍK}
== 7455 == CHYBA: AddressSanitizer: globální přetečení vyrovnávací paměti na adrese 0x000000689b54 na PC 0x46bfd8 bp 0x7fff515e5ba0 sp 0x7fff515e5b98READ velikosti 4 na 0x000000689b54 vlákno T0 # 0 0x46bfdO00 do vpravo od globální proměnné 'global_array' od 'example_GlobalOutOfBounds.cc' (0x6899c0) o velikosti 400
Omezení
AddressSanitizer nezjistí žádné neinicializované čtení paměti (ale toto je detekováno MemorySanitizer[14]), a detekuje pouze některé chyby použití po návratu.[15] Rovněž není schopen detekovat všechny chyby poškození libovolného poškození paměti, ani všechny chyby náhodného zápisu kvůli podtečení / přetečení celého čísla (když se k výpočtu posunutí adresy paměti použije celé číslo s nedefinovaným chováním). Sousedící vyrovnávací paměti ve strukturách a třídách nejsou chráněny před přetečením, částečně proto, aby se zabránilo narušení zpětné kompatibility.[16]
Viz také
- Intel MPX
- Ověřovač aplikací (AppVerif.exe) v systému Windows Microsoft Windows SDK
Reference
- ^ „Poznámky k verzi LLVM 3.1“. LLVM. Citováno 8. února 2014.
- ^ „Poznámky k verzi GCC 4.8“. GCC. Citováno 8. února 2014.
- ^ „Address Sanitizer | Apple Developer Documentation“.
- ^ „Visual Studio 2019 verze 16.4 - poznámky k verzi“. Microsoft. Citováno 6. listopadu 2020.
- ^ Konstantin Serebryany; Derek Bruening; Alexander Potapenko; Dmitrij Vyukov. „AddressSanitizer: rychlá kontrola zdravého rozumu“ (PDF). Sborník příspěvků z konference USENIX 2012 o výroční technické konferenci.
- ^ Abhishek Arya; Cris Neckar; Tým zabezpečení Chrome. „Fuzzing for Security“.
- ^ „Zabezpečení Firefoxu: Vyzkoušejte nové techniky analýzy kódu“. Archivovány od originál dne 03.03.2016. Citováno 2018-06-18.
- ^ „Některé z chyb nalezených AddressSanitizer“.
- ^ Mateusz Jurczyk; Gynvael Coldwind (10.01.2014). "FFmpeg a tisíc oprav".
- ^ "Výsledky hledání pro AddressSanitizer v FreeType Bugs".
- ^ „KernelAddressSanitizer (KASAN)“. Archivovány od originál dne 2016-12-23. Citováno 2016-12-08.
- ^ Jake Edge. "Sanitizer adresy jádra".
- ^ Jonathan Corbet. "3.20 sloučení okna část 2".
- ^ "MemorySanitizer".
- ^ „ComparisonOfMemoryTools“. AddressSanitizer Wiki. Citováno 1. prosince 2017.
- ^ „Bypassing AddressSanitizer“ (PDF). Eric Wimberley. Citováno 1. července 2014.