Tõsine turvalisus: GnuTLS järgib OpenSSL-i, parandab ajastusründe vea

Tõsine turvalisus: GnuTLS järgib OpenSSL-i, parandab ajastusründe vea

Allikasõlm: 1956368

Eelmisel nädalal kirjutasime paljudest mäluhalduse vead mis parandati populaarse OpenSSL-i krüpteerimisteegi uusimas turbevärskenduses.

Koos nende mäluvigadega teatasime ka dubleeritud veast CVE-2022-4304: Oracle'i ajastus RSA dekrüpteerimisel.

Selle vea korral käivitatakse serveris ikka ja jälle sama krüpteeritud sõnum, kuid muudetakse andmete lõpus olevat polstrit, et muuta andmed kehtetuks ja provotseerida seega mingi ettearvamatu käitumine…

…ei võtaks pidevalt aega, eeldades, et olete võrgus sihtmärgi lähedal, et saaksite usaldusväärselt arvata, kui kaua protsessi andmeedastusosa aega võtab.

Kõiki andmeid ei töödelda võrdselt

Kui käivitate päringu, määrate vastuse, kui kaua aega võtab ja lahutate võrguandmete madalal tasemel saatmiseks ja vastuvõtmiseks kulunud aja, saate teada, kui kaua kulus serveril päringu töötlemiseks sisemiste arvutuste tegemiseks aega. .

Isegi kui te pole kindel, kui palju aega võrgus kulub, saate otsida edasi-tagasi reiside aegade variatsioone, esitades palju päringuid ja kogudes palju proove.

Kui võrk on piisavalt usaldusväärne, et eeldada, et võrgu üldkulud on suures osas konstantsed, võite kasutada statistilisi meetodeid, et järeldada, millist tüüpi andmete muutmine põhjustab täiendava töötlemise viivituse.

Sellest saate paljudel järeldada algsete krüptimata andmete struktuuri või isegi sisu kohta, mida tuleks iga korduva päringu puhul salajas hoida.

Isegi kui saate lihtteksti eraldada ainult ühe baidi, ei peaks see juhtuma.

Niinimetatud ajastusrünnakud Sellised on alati tülikad, isegi kui teil võib tekkida vajadus saata miljoneid võltspakette ja neid kõiki ajastada, et teil oleks võimalus taastada vaid üks bait lihtteksti andmeid...

...sest võrgud on kiiremad, prognoositavamad ja suudavad taluda palju suuremat koormust kui paar aastat tagasi.

Võib arvata, et miljonid reetlikud paketid, mis teile näiteks järgmise tunni jooksul rämpsposti saadetakse, paistavad silma nagu pöidla.

Kuid "miljon pakki tunnis rohkem või vähem kui tavaliselt" pole lihtsalt enam eriti suur erinevus.

Sarnane "oraakli" viga GnuTLS-is

Noh, sama isik, kes teatas OpenSSL-i lõpuks parandatud veaajastamise veast, teatas ka a sarnane viga GnuTLS-is umbes samal ajal.

Sellel on vea identifikaator CVE-2023-0361.

Kuigi GnuTLS pole nii populaarne ega laialdaselt kasutatav kui OpenSSL, on teie IT-varas või isegi teie arvutis tõenäoliselt palju programme, mis seda kasutavad või sisaldavad, sealhulgas FFmpeg, GnuPG, Mplayer, QEMU. , Rdesktop, Samba, Wget ja Wireshark.

Irooniline on see, et GnuTLS-i ajastusviga ilmnes koodis, mis pidi algselt logima ajastusründe vigu.

Nagu näete koodide erinevusest (diferentseerima) allpool, teadis programmeerija, et kõik tingimuslikud (if ... then) toiming, mida kasutatakse dekrüpteerimisvea kontrollimiseks ja käsitlemiseks, võib põhjustada ajastusvariatsioone, kuna protsessoritel kulub tavaliselt erinev aeg, olenevalt sellest, kuidas teie kood pärast "haru" käsku läheb.

(See kehtib eriti haru kohta, mis läheb sageli ühte ja harva teistpidi, sest protsessorid kipuvad meelde või vahemällu salvestama koodi, mis töötab jõudluse parandamiseks korduvalt, muutes nii harva kasutatava koodi töötamise märgatavalt aeglasemaks.)

Gnutls-3.7.8/lib/auth/rsa.c koodi erinevus 3.7.9 vastu

Kuid programmeerija tahtis siiski logida, et võib juhtuda rünnak, mis juhtub siis, kui if (ok) ülaltoodud test ebaõnnestub ja hargneb else { ... } sektsiooni.

Sel hetkel kutsub kood välja _gnutls_debug_log() funktsioon, mille toimimine võib võtta üsna kaua aega.

Seetõttu sisestas kodeerija tahtliku kõne numbrile _gnutls_no_log() aasta then { ... } osa koodist, mis teeskleb, et logib "rünnakut", kui seda pole, et püüda ühtlustada aega, mille kood kulutab kummaski suunas, if (ok) haru juhendamine võib võtta.

Ilmselt aga ei olnud need kaks kooditeed oma ärakasutamise ajal (või võib-olla ka _gnutls_debug_log() funktsioon iseseisvalt ei olnud erinevat tüüpi vigade käsitlemisel piisavalt järjekindel) ja ründaja võis pärast umbes miljonit katset hakata dekrüpteerimise märgutulesid eristama.

Mida teha?

Kui olete programmeerija: siinne veaparandus oli lihtne ja järgis põhimõtet „vähem on rohkem”.

Ülaltoodud roosa kood, mis ei andnud niikuinii väga kasulikke rünnakutuvastusandmeid, kustutati lihtsalt põhjusel, et koodi, mida seal pole, ei saa kogemata sisse kompileerida, olenemata teie ehituse seadetest...

…ja kood, mis pole kompileeritud, ei saa kunagi käivituda, kas juhuslikult või kavandatult.

Kui olete GnuTLS-i kasutaja: hiljuti avaldatud versioon 3.7.9 ja "uue toote maitse" 3.8.0 kaasata see parandus koos mitme muuga.

Kui kasutate Linuxi distributsiooni, otsige värskendusi mis tahes keskselt hallatavale GnuTLS-i jagatud teegi versioonile, samuti rakendustele, mis toovad kaasa oma versiooni.

Linuxis otsige faile selle nimega libgnutls*.so mis tahes ühiskasutatavate raamatukogude leidmiseks ja otsimiseks gnutls-cli et leida teegiga sageli kaasas oleva käsurea utiliidi koopiaid.

Võite käivitada gnutls-cli -vv et teada saada, millise versiooni libgnutls see on dünaamiliselt seotud:

 $ gnutls-cli -vv gnutls-cli 3.7.9 <-- minu Linuxi distributsioon sai värskenduse eelmisel reedel (2023-02-10)

Ajatempel:

Veel alates Alasti turvalisus