Razvijalci projekta Chromium 912 nevarnih in kritičnih ranljivosti, odkritih v stabilnih izdajah Chromov od leta 2015, in prišli so do zaključka, da je 70% od njih povzročilo negotovo ravnanje s spominom (napake pri obravnavanju kazalcev v C/C++). Polovica teh težav (36,1%) izhaja iz dostopov do pomnilnika po njegovem sprostitvi (use-after-free).
Pri načrtovanju Chromiuma je bilo izhodiščno , da v kodi niso izključene napake, zato se je velik poudarek dajal uporabi peskovnika za omejevanje posledic rabe ranljivosti. Danes so možnosti uporabe te tehnologije dosegle svoje meje in nadaljnje razbijanje na procese ni smiselno z vidika porabe virov.
Za vzdrževanje varnosti kode Google prav tako uporablja "", po katerem vsak dodan koda izpolnjuje največ dve od treh pogojev: delo z nepreverjenimi vhodnimi podatki, uporaba nevarnega programskega jezika (C/C++) in izvajanje z višjimi privilegiji. Iz tega pravila sledi, da mora biti kod za obravnavo zunanjih podatkov bodisi omejen na minimalne privilegije (izoliran) bodisi napisan v varnem programskem jeziku.
Za nadaljnje krepitev varnosti kode je bil zagnan projekt za preprečevanje napak pri ravnanju s spominom v kodi. Izpostavljajo se tri osnovne pristope: ustvarjanje knjižnic C++ s funkcijami za varno delo s spominom in razširitev uporabe zbiralnika smeti, uporaba strojnih zaščitnih mehanizmov (Memory Tagging Extension) in pisanje komponent v jezikih, ki zagotavljajo varno delo s spominom (Java, Kotlin, JavaScript, Rust, Swift).
Pričakuje se, da se bo delo osredotočilo na dve usmeritvi:
- Znatna sprememba procesa razvoja v C++, ki ne izključuje negativnega vpliva na zmogljivost (dodatne omejitve in zbiranje smeti). Namesto surovih kazalcev se predlaga uporaba tipa , ki omogoča, da se izkoriščene napake razreda use-after-free zmanjšajo na neškodljive zrušitve, brez očitnega negativnega vpliva na zmogljivost, porabo pomnilnika in stabilnost.
- Uporaba jezika, zasnovanih na preverjanju varnosti dela s pomnilnikom med prevajanjem (kar bo odpravilo negativne vplive na uspešnost, značilne za takšna preverjanja med izvajanjem kode, a bo privedlo do dodatnih stroškov za organizacijo medsebojnega delovanja kode v novem jeziku s kodo v C++).
Uporaba knjižnic za varno delo s pomnilnikom je najbolj preprost, a manj učinkovit pristop. Prepisovanje kode v Rust pa se ocenjuje kot najučinkovitejši, a zelo drag postopek.
Izvor: opennet.ru
