GnuTLS odpravlja napako pri slabem upravljanju pomnilnika – posodobite zdaj!

Izvorno vozlišče: 1603833

Najbolj znana kriptografska knjižnica v odprtokodnem svetu je skoraj zagotovo OpenSSL.

Prvič, je eden najpogosteje uporabljenih, do te mere, da je večina razvijalcev na večini platform slišala zanj, tudi če ga niso neposredno uporabili.

Drugič, verjetno je najbolj oglaševana, na žalost zaradi precej neprijetnega hrošča, znanega kot heartbleed ki so ga odkrili pred več kot osmimi leti.

Kljub temu, da je bil nemudoma popravljen (in kljub temu, da obstajajo zanesljive rešitve za razvijalce, ki niso mogli ali niso hoteli hitro posodobiti svojih ranljivih različic OpenSSL), Heartbleed ostaja nekakšna "predstavitvena" napaka, nenazadnje zato, ker je bila ena prvih napak, njeni odkritelji spremenili v agresivno PR vozilo.

Z impresivnim imenom, lastnim logotipom in namenskim spletnim mestom je Heartbleed hitro postal svetovna kibernetska varnost superzgodba, in je, v dobrem in slabem, postalo neločljivo povezano z omembami imena OpenSSL, kot da bi nevarnost hrošča obstajala tudi potem, ko je bila iz kode izrezana.

Življenje onkraj OpenSSL

Vendar pa obstaja več drugih odprtokodnih kriptografskih knjižnic, ki se pogosto uporabljajo kot tudi ali namesto OpenSSL, zlasti vključno z Mozillino NSS (kratek za Storitve omrežne varnosti) in projektov GNU gnuTLS knjižnica.

Kot se zgodi, je GnuTLS pravkar popravil hrošč, znan kot CVE-2022-2509, poročajo v projektu varnostno svetovanje GNUTLS-SA-2022-07-07.

Ta popravek odpravlja napako pri slabem upravljanju pomnilnika, znano kot a dvojno brezplačno.

Dvojno brezplačno razloženo

Preprosto povedano, dvojno prosta ranljivost se ustvari, ko programer zahteva od operacijskega sistema, da dodeli blok pomnilnika za začasno uporabo ...

... in ga vrne, da ga lahko izbrišete s seznama izposojenih blokov, da jih sprostite za uporabo v drugih delih programa ...

... in nato pomotoma zahteva od sistema, naj znova sprosti isti pomnilniški blok.

V idealnem primeru bo programska oprema za dodeljevanje pomnilnika zaznala, da blok ne pripada več delu programa, ki ga »vrača«, bo ugotovila, da je bil blok, ki je kršil, že recikliran, in ga ne bo drugič sprostila, s čimer se bo izognila tveganja, da ga ponovno "osvobodimo".

Nežno ravnanje z dvojno brez, ki je zaznano proaktivno, je težavno vprašanje. Funkcija C, ki vrne pomnilnik, je zasnovana kot prototip void free(void *ptr); tako da posredujete naslov bloka, ki ga želite sprostiti, vendar ne dobite nazaj povratne kode. (Funkcija AC z a void vrnjena vrednost je tisto, kar drugi programski jeziki imenujejo a procedure: naredi nekaj namesto vas, vendar ne more sporočiti rezultata.) Tako tudi skrbno napisana koda C nima standardnega načina za odkrivanje, da je šlo kaj narobe v free(), in zato ni nobenega načina za obravnavo napake s poskusom elegantnega izklopa. Enostranska prekinitev kršitvenega programa je edina varna rešitev za sistem.

Če pa se dodeljevalec pomnilnika ne zaveda (morda zato, ker je bil isti blok od takrat izročen drugemu delu istega programa, tako da je spet na seznamu »izposojenih« v popolnoma enaki obliki, kot je bil prej) , potem se bodo verjetno zgodile slabe stvari.

Predvsem lahko upravitelj pomnilnika nenamerno in nepričakovano »zapleni« dvojno osvobojen blok kodi, ki ga zdaj zakonito uporablja, in ga znova dodeli drugemu delu programa, morda celo zlonamerni kodi, ki jo je napadalec skrbno določil, da bi izkoristil prednost. slabega upravljanja.

Tako lahko na koncu dobite dva dela istega programa, ki upravljata z istim kosom pomnilnika.

En del programa predvideva, da lahko implicitno zaupa vsebini pomnilnika, ker se ima za legitimnega "lastnika" bloka.

Istočasno drugi del programa ve, da se lahko zaplete s podatki (ali ga lahko zavedejo, da se zamoti z njimi), da bi namerno spotaknil prvi del.

Če delaš napačno stvar, narediš pravo stvar

Ironično je, da napaka CVE-2022-2509 obstaja v kodi za preverjanje potrdila v GnuTLS.

(Ironija je, če se sprašujete, da je programska oprema, ki na splošno ni varna, ker se ne trudi preverjati zaupanja vrednih povezav TLS, imuna na to specifično varnostno napako.)

Na primer, ko obiščete spletno mesto (ali drugo vrsto strežnika), ki je zaščiteno s TLS, vam bo druga stran običajno poslala spletno potrdilo, ki potrjuje, da je strežnik res v lasti in upravljanju organizacije, ki jo pričakujete.

Seveda, glede na to, da lahko vsak ustvari potrdilo v katerem koli imenu želi, vam neobdelano potrdilo samo po sebi ne pove veliko, zato ga lastnik potrdila običajno digitalno podpiše s strani podjetja, ki mu vaš brskalnik že zaupa.

V praksi so potrdila običajno podpisana s potrdilom, ki je nato podpisano s potrdilom, ki mu vaš brskalnik zaupa, toda končni rezultat je tisto, kar se imenuje verigo zaupanja ki jih je mogoče varno izslediti do potrdila, ki je že nameščeno na seznamu tako imenovanih Zaupanja vredni organi, poznan tudi kot Korenine, ki ga upravlja vaš brskalnik ali operacijski sistem.

Da bi poenostavili in pospešili postopek potrjevanja verige potrdil, številni strežniki ne pošljejo le lastnega potrdila in prepustijo brskalniku, da »sledi verigi« do zaupanja vrednega korena.

Strežnik običajno vključuje verigo zaupanja, na katero se zanaša in jo mora sestaviti samo enkrat, tako da lahko vaš brskalnik ali katera koli programska oprema, ki preverja potrdilo, preprosto preveri, ali je veriga digitalno veljavna, in nato preveri, ali je zadnje potrdilo v verigi se ujema z že zaupanja vrednim.

V tem primeru bo GnuTLS pravilno in varno preveril priloženo potrdilo, preden bo sprostil pomnilniški blok, ki je bil pravkar uporabljen za njegovo shranjevanje.

Toda če drugi konec ne zagotovi vnaprej ustvarjene verige potrdil in tako pusti GnuTLS, da sam ustvari in preveri verigo, potem koda GnuTLS pomotoma sprosti pomnilnik, ki se uporablja za shranjevanje priloženega potrdila, preden začne verigo- postopek preverjanja...

... in ga nato znova sprosti, ko je preverjanje končano.

To povzroči napako dvojnega brezplačnega programiranja, ki bi lahko povzročila poškodbo pomnilnika, čemur sledi zrušitev programa.

Preprečevanje zrušitve za vsaditev zlonamerne programske opreme

Običajno ali vsaj pogosto zrušitve povzročijo tako svojeglavo vedenje, da operacijski sistem zazna, da je napačni program izgubil nadzor nad potekom izvajanja programa – na primer, če program skoči na naključen pomnilniški naslov in poskuša zagnati kodo iz pomnilniški blok, ki sploh ni bil dodeljen.

V tem primeru bi zrušitev povzročila sistemsko napako, in čeprav bi lahko tovrstno napako zlorabili za tako imenovano Denial of Service (DoS), kjer je celoten cilj preprosto motenje napadenega programa, ne vodi do Oddaljeno kodiranje (RCE), kjer se namesto tega sproži nezaupljiva in neželena programska koda.

Kadar pa pride do zrušitve programa, ki jo lahko napadalci sprovocirajo po mili volji na podlagi nezaupljivih podatkov, ki so jih priskrbeli sami, vedno obstaja tveganje, da bi zrušitev lahko preprečili tako, da bi napačno usmerili program, ki se je zrušil, tako da skoči v ponujeno izvedljivo kodo s strani napadalcev.

Kot si lahko predstavljate, lahko napadalci pogosto izkoristijo takšne ranljivosti za vsaditev zlonamerne programske opreme, bodisi začasno ali trajno, glede na to, da lahko v vaš računalnik vbrizgajo nezaupljivo kodo, ne da bi ustvarili kakršno koli pojavno opozorilo, ki bi najprej zahtevalo dovoljenje.

Kaj storiti?

Posodobi na najnovejša različica GnuTLS, ki je 3.7.7 v času pisanja.

(Ta napaka je bila očitno predstavljena v GnuTLS 3.6.0 in obstaja v vseh različicah od takrat do vključno 3.7.6.)

Upoštevajte, da številne priljubljene aplikacije in programski kompleti orodij vključujejo ali so lahko zgrajeni za uporabo GnuTLS, čeprav se tega morda ne zavedate, vključno z, vendar nikakor ne omejeno na: FFmpeg, GnuPG, Mplayer, QEMU, Rdesktop, Samba, Wget, Wireshark in Zlib.

Številni paketi Linux ali *BSD, ki uporabljajo GnuTLS, se zanašajo na osrednjo različico, ki jo upravlja vaša distribucija sama, zato se prepričajte, da posodobite takoj, ko bo vaša distribucija na voljo to različico.

Veselo krpanje!


Časovni žig:

Več od Gola varnost