Ranjivost u izvršavanju koda u Mozilla NSS-u prilikom obrade certifikata

Prepoznata je kritična ranjivost (CVE-2021-43527) u NSS (Network Security Services) skupu kriptografskih biblioteka koje je razvila Mozilla, a koja može dovesti do izvršenja koda napadača prilikom obrade DSA ili RSA-PSS digitalnih potpisa specificiranih pomoću DER metoda kodiranja ( Distinguished Encoding Rules). Problem kodnog naziva BigSig riješen je u NSS 3.73 i NSS ESR 3.68.1. Ažuriranja paketa u distribucijama dostupna su za Debian, RHEL, Ubuntu, SUSE, Arch Linux, Gentoo, FreeBSD. Još nema dostupnih ažuriranja za Fedoru.

Problem se javlja u aplikacijama koje koriste NSS za rukovanje digitalnim potpisima CMS, S/MIME, PKCS #7 i PKCS #12 ili prilikom provjere certifikata u TLS, X.509, OCSP i CRL implementacijama. Ranjivost se može pojaviti u različitim klijentskim i poslužiteljskim aplikacijama koje podržavaju TLS, DTLS i S/MIME, klijentima e-pošte i PDF preglednicima koji koriste NSS CERT_VerifyCertificate() poziv za provjeru digitalnih potpisa.

Kao primjeri ranjivih aplikacija spominju se LibreOffice, Evolution i Evince. Potencijalno, problem također može utjecati na projekte kao što su Pidgin, Apache OpenOffice, Suricata, Curl, Chrony, Red Hat Directory Server, Red Hat Certificate System, mod_nss za Apache http poslužitelj, Oracle Communications Messaging Server, Oracle Directory Server Enterprise Edition. Međutim, ranjivost se ne pojavljuje u preglednicima Firefox, Thunderbird i Tor, koji za provjeru koriste zasebnu biblioteku mozilla::pkix, također uključenu u NSS. Problem također ne utječe na preglednike temeljene na Chromiumu (osim ako nisu posebno izrađeni s NSS-om), koji su koristili NSS do 2015., ali su zatim prešli na BoringSSL.

Ranjivost je uzrokovana pogreškom u kodu provjere certifikata u funkciji vfy_CreateContext iz datoteke secvfy.c. Pogreška se javlja i kada klijent čita certifikat s poslužitelja i kada poslužitelj obrađuje certifikate klijenta. Prilikom provjere digitalnog potpisa kodiranog DER-om, NSS dekodira potpis u međuspremnik fiksne veličine i prosljeđuje međuspremnik PKCS #11 modulu. Tijekom daljnje obrade, veličina se netočno provjerava za DSA i RSA-PSS potpise, što dovodi do prekoračenja međuspremnika dodijeljenog za strukturu VFYContextStr ako veličina digitalnog potpisa prelazi 16384 bita (2048 bajtova je alocirano za međuspremnik, ali ne provjerava se da potpis može biti veći) ).

Kod koji sadrži ranjivost može se pratiti unazad do 2003. godine, ali nije predstavljao prijetnju sve do refaktoriranja provedenog 2012. godine. U 2017. godini napravljena je ista greška prilikom implementacije RSA-PSS podrške. Za izvođenje napada nije potrebno generiranje određenih ključeva s intenzivnim resursima za dobivanje potrebnih podataka, budući da se prekoračenje događa u fazi prije provjere ispravnosti digitalnog potpisa. Dio podataka koji prelazi granice zapisuje se u memorijsko područje koje sadrži pokazivače na funkcije, što pojednostavljuje stvaranje radnih exploita.

Ranjivost su otkrili istraživači iz Google Project Zero dok su eksperimentirali s novim metodama testiranja fuzzinga i dobra je demonstracija kako trivijalne ranjivosti mogu ostati neotkrivene dugo vremena u naširoko testiranom dobro poznatom projektu:

  • NSS kod održava iskusan sigurnosni tim koristeći najsuvremenije tehnike testiranja i analize pogrešaka. Postoji nekoliko programa za isplatu značajnih nagrada za identificiranje ranjivosti u NSS-u.
  • NSS je bio jedan od prvih projekata koji se pridružio Googleovoj oss-fuzz inicijativi, a također je testiran u Mozillinom sustavu za testiranje fuzza temeljenom na libFuzzeru.
  • Kod biblioteke je mnogo puta provjeravan u raznim statičkim analizatorima, uključujući i praćenje usluge Coverity od 2008.
  • Do 2015. NSS se koristio u pregledniku Google Chrome i neovisno ga je provjerio Googleov tim neovisno o Mozilli (od 2015. Chrome je prešao na BoringSSL, ali podrška za priključak temeljen na NSS-u ostaje).

Glavni problemi zbog kojih je problem dugo ostao neotkriven:

  • NSS modularna biblioteka i testiranje fuzzinga nisu provedeni kao cjelina, već na razini pojedinačnih komponenti. Na primjer, posebno je provjeravan kod za dekodiranje DER-a i obradu certifikata - tijekom fuzzinga se mogao dobiti certifikat koji bi doveo do manifestacije dotične ranjivosti, ali njegova provjera nije došla do verifikacijskog koda i problem nije otkriti se.
  • Tijekom fuzzing testiranja postavljena su stroga ograničenja na veličinu izlaza (10000 10000 bajtova) u nedostatku sličnih ograničenja u NSS-u (mnoge strukture u normalnom načinu rada mogle bi imati veličinu veću od 224 1 bajtova, pa je bilo potrebno više ulaznih podataka za identificiranje problema) . Za potpunu provjeru, ograničenje je trebalo biti 16-XNUMX bajta (XNUMX MB), što odgovara maksimalnoj veličini certifikata dopuštenoj u TLS-u.
  • Zabluda o pokrivenosti koda za testiranje fuzza. Ranjivi kod je aktivno testiran, ali korištenjem fuzzera koji nisu mogli generirati potrebne ulazne podatke. Na primjer, fuzzer tls_server_target koristio je unaprijed definirani skup gotovih certifikata, koji su ograničili provjeru verifikacijskog koda certifikata samo na TLS poruke i promjene stanja protokola.

Izvor: opennet.ru

Dodajte komentar