GnuTLS parandab mälu haldamise vea – värskendage kohe!

Allikasõlm: 1603833

Peaaegu kindlasti on avatud lähtekoodiga maailma tuntuim krüptograafiline raamatukogu OpenSSL.

Esiteks on see üks kõige laialdasemalt kasutatavaid, kuni selleni, et enamik enamiku platvormide arendajaid on sellest kuulnud, isegi kui nad pole seda otseselt kasutanud.

Teiseks on see ilmselt kõige laiemalt avalikustatud, kahjuks üsna vastiku vea tõttu, mida tuntakse heartbleed mis avastati enam kui kaheksa aastat tagasi.

Hoolimata sellest, et Heartbleed on koheselt parandatud (ja hoolimata usaldusväärsetest lahendustest arendajatele, kes ei saanud või ei soovinud oma haavatavaid OpenSSL-i versioone kiiresti värskendada), on Heartbleed endiselt omamoodi „esitlusvea“, muu hulgas seetõttu, et see oli üks esimesi vigu, mis avastati. avastajate poolt agressiivseks PR-sõidukiks.

Muljetavaldava nime, oma logo ja spetsiaalse veebisaidiga Heartbleedist sai kiiresti ülemaailmne küberturvalisus. superlugu, ja nii heas kui halvas, sai see nime mainimisega lahutamatult seotud OpenSSL, justkui elaks vea oht edasi ka pärast seda, kui see oli koodist välja lõigatud.

Elu väljaspool OpenSSL-i

Kuid on ka mitmeid teisi avatud lähtekoodiga krüptoteeke, mida kasutatakse laialdaselt OpenSSL-i kõrval või selle asemel, sealhulgas Mozilla oma. NSS (lühike Võrgu turvateenused) ja GNU projekti gnuTLS raamatukogu.

Juhtub, et GnuTLS parandas lihtsalt vea, mida tuntakse kui CVE-2022-2509, teatati projektis turvalisuse nõustamine GNUTLS-SA-2022-07-07.

See plaaster parandab mälu vale haldamise vea, mida nimetatakse a topeltvaba.

Topeltvaba selgitatud

Lihtsamalt öeldes tekib topeltvaba haavatavus, kui programmeerija palub operatsioonisüsteemil eraldada ajutiseks kasutamiseks mäluplokk...

…ja annab selle tagasi, et saaks selle väljalaenatud plokkide loendist kustutada, et see saaks programmi muude osade jaoks kasutamiseks vabastada…

…ja siis palub süsteemil kogemata seesama mäluplokk uuesti vabastada.

Ideaalis tuvastab mälujaotustarkvara, et plokk ei kuulu enam programmi sellesse ossa, mis seda "tagastab", tuvastab, et rikkuv plokk on juba ringlusse võetud, ja ei eralda seda teist korda, hoides seega kõrvale selle uuesti "vabastamise" riskid.

Ennetavalt tuvastatud topeltvabaga õrn käsitlemine on keeruline probleem. C-funktsioon, mis annab mälu tagasi, on prototüüpitud kui void free(void *ptr); nii et edastate ploki aadressi, mida soovite vabastada, kuid ei saa tagasi tagastuskoodi. (C-funktsioon koos a void tagastusväärtus on see, mida teised programmeerimiskeeled kutsuvad a procedure: see teeb teie heaks midagi, kuid sellel pole võimalust tulemust teavitada.) Seega pole isegi hoolikalt kirjutatud C-koodil standardset viisi tuvastada, et midagi läks valesti free(), ja seetõttu ei saa veaga toime tulla, proovides graatsiliselt välja lülitada. Rikkuva programmi ühepoolne lõpetamine on süsteemi jaoks ainus turvaline lahendus.

Aga kui mälujaotus ei mõista (võib-olla sellepärast, et seesama plokk on vahepeal sama programmi teisele osale välja antud, nii et see on tagasi laenatud loendis täpselt samal kujul, nagu see oli varem) , siis juhtuvad tõenäoliselt halvad asjad.

Eelkõige võib mäluhaldur tahtmatult ja ootamatult „konfiskeerida” topeltvabastatud ploki koodist, mis seda nüüd seaduslikult kasutab, ja määrata selle uuesti mõnele muule programmi osale, võib-olla isegi pahatahtlikule koodile, mida ründaja on hoolikalt ajastanud, et ära kasutada. halvast juhtimisest.

Seega võib juhtuda, et sama programmi kaks osa manipuleerivad sama mälumahuga.

Programmi üks osa eeldab, et suudab mälu sisu kaudselt usaldada, kuna peab end ploki seaduslikuks "omanikuks".

Samal ajal teab programmi teine ​​​​osa, et see võib andmetega segamini ajada (või võidakse neid segamini ajada), et esimene osa tahtlikult komistada.

Vale asja tegemine teeb õiget asja

Irooniline on see, et GnuTLS-i sertifikaadi kinnituskoodis on viga CVE-2022-2509.

(Iroonia on selles, et tarkvara, mis on üldiselt ebaturvaline, kuna see ei sega usaldusväärsete TLS-ühenduste kontrollimist, on selle konkreetse turvavea suhtes immuunne.)

Näiteks kui külastate veebisaiti (või muud tüüpi serverit), mis on kaitstud TLS-iga, saadab teine ​​ots teile tavaliselt veebisertifikaadi, mis kinnitab, et server on tõesti teie soovitud organisatsiooni omanik ja seda haldab.

Arvestades, et igaüks saab luua sertifikaadi mis tahes nimega, ei ütle toorsertifikaat iseenesest teile muidugi palju, nii et sertifikaadi omanik allkirjastab selle tavaliselt digitaalselt ettevõttelt, mida teie brauser juba usaldab.

Praktikas allkirjastatakse sertifikaadid tavaliselt sertifikaadiga, mis omakorda on allkirjastatud sertifikaadiga, mida teie brauser usaldab, kuid lõpptulemuseks on nn. usalduse ahel mida saab turvaliselt jälgida sertifikaadini, mis on juba installitud nn Usaldusväärsed asutused, tuntud ka kui Roots, mida haldab teie brauser või operatsioonisüsteem.

Sertifikaadi ahela kinnitamise protsessi lihtsustamiseks ja kiirendamiseks ei saada paljud serverid lihtsalt oma sertifikaati ja jätavad selle brauseri hooleks, et "ahelat taga ajada" usaldusväärse juureni.

Server sisaldab tavaliselt usaldusahelat, millele see tugineb ja mille ta peab looma vaid üks kord, nii et teie brauser või mis tahes tarkvara, mis kontrollib sertifikaati, saab lihtsalt kontrollida, kas kett on digitaalselt kehtiv, ja seejärel kontrollida, kas viimane sertifikaat ahelas vastab juba usaldusväärsele.

Sel juhul kinnitab GnuTLS tarnitud sertifikaadi õigesti ja turvaliselt, enne kui vabastab selle salvestamiseks kasutatud mäluploki.

Kui aga teine ​​ots ei paku eelgenereeritud sertifikaadiahelat, jättes seega GnuTLS-ile ahela iseseisvaks loomise ja kontrollimise, vabastab GnuTLS-i kood kogemata mälu, mida kasutatakse tarnitud sertifikaadi salvestamiseks enne ahela käivitamist. kontrollimise protsess…

…ja vabastab selle pärast kontrolli lõppemist uuesti.

See põhjustab topelt-vaba tõrke, mis võib viia mälu rikkumiseni, millele järgneb programmi krahh.

Pahavara implanteerimise krahhi juhtimine

Tavaliselt, või vähemalt sageli, põhjustavad kokkujooksmised sellist eksitavat käitumist, et operatsioonisüsteem tuvastab, et rikkuv programm on kaotanud kontrolli programmi täitmise voo üle – näiteks kui programm hüppab juhuslikule mäluaadressile ja proovib käivitada koodi mäluplokk, mida pole üldse eraldatud.

Sel juhul põhjustab krahh süsteemivea ja kuigi seda tüüpi viga võidakse kuritarvitada nn Denial of Service (DoS) rünnak, kus kogu eesmärk on lihtsalt rünnatavat programmi häirida, see ei too kaasa Koodi kaugkäivitamine (RCE), kus selle asemel käivitatakse ebausaldusväärne ja soovimatu tarkvarakood.

Kuid alati, kui toimub programmi krahh, mille ründajad võivad enda edastatud ebausaldusväärsete andmete põhjal omal soovil esile kutsuda, on alati oht, et krahhi võidakse juhtida nii, et kokkujooksev programm suunatakse valesti nii, et see hüppab etteantud käivitatavasse koodi. ründajate poolt.

Nagu võite ette kujutada, võivad ründajad sageli kasutada selliseid turvaauke pahavara siirdamiseks kas ajutiselt või püsivalt, kuna nad saavad teie arvutisse ebausaldusväärset koodi sisestada, ilma et nad esitaks enne luba küsivaid hüpikakende hoiatusi.

Mida teha?

Värskendage Viimane versioon GnuTLS-ist, mis on 3.7.7 kirjutamise ajal.

(See viga võeti ilmselt kasutusele GnuTLS 3.6.0-s ja on olemas igas versioonis alates sellest ajast kuni versioonini 3.7.6 (kaasa arvatud).)

Pange tähele, et paljud populaarsed rakendused ja programmeerimistööriistakomplektid sisaldavad või võidakse luua GnuTLS-i kasutamiseks, kuigi te ei pruugi sellest teadlik olla, sealhulgas, kuid mitte ainult: FFmpeg, GnuPG, Mplayer, QEMU, Rdesktop, Samba, Wget, Wireshark ja Zlib.

Paljud Linuxi või *BSD paketid, mis kasutavad GnuTLS-i, toetuvad teie distributsiooni enda hallatavale kesksele versioonile, nii et värskendage seda kohe, kui teie distributsioonis on see versioon saadaval.

Head lappimist!


Ajatempel:

Veel alates Alasti turvalisus