Koda izpildes ievainojamība programmā Mozilla NSS, apstrādājot sertifikātus

Mozilla izstrādātajā kriptogrāfisko bibliotēku NSS (Network Security Services) komplektā ir konstatēta kritiska ievainojamība (CVE-2021-43527), kas var izraisīt uzbrucēja koda izpildi, apstrādājot DSA vai RSA-PSS ciparparakstus, kas norādīti, izmantojot DER kodēšanas metode ( Distinguished Encoding Rules). Problēma ar koda nosaukumu BigSig ir atrisināta NSS 3.73 un NSS ESR 3.68.1. Pakešu atjauninājumi izplatījumos ir pieejami Debian, RHEL, Ubuntu, SUSE, Arch Linux, Gentoo, FreeBSD. Fedora atjauninājumi vēl nav pieejami.

Problēma rodas lietojumprogrammās, kas izmanto NSS, lai apstrādātu CMS, S/MIME, PKCS #7 un PKCS #12 ciparparakstus, vai pārbaudot sertifikātus TLS, X.509, OCSP un CRL ieviešanā. Ievainojamība var parādīties dažādās klientu un serveru lietojumprogrammās, kas atbalsta TLS, DTLS un S/MIME, e-pasta klientos un PDF skatītājos, kas izmanto NSS CERT_VerifyCertificate() izsaukumu, lai pārbaudītu ciparparakstus.

LibreOffice, Evolution un Evince ir minēti kā neaizsargātu lietojumprogrammu piemēri. Potenciāli problēma var ietekmēt arī tādus projektus kā Pidgin, Apache OpenOffice, Suricata, Curl, Chrony, Red Hat Directory Server, Red Hat sertifikātu sistēma, mod_nss Apache http serverim, Oracle Communications Messaging Server, Oracle Directory Server Enterprise Edition. Tomēr ievainojamība neparādās pārlūkprogrammās Firefox, Thunderbird un Tor Browser, kuru pārbaudei tiek izmantota atsevišķa mozilla::pkix bibliotēka, kas iekļauta arī NSS. Problēma neietekmē arī pārlūkprogrammas, kuru pamatā ir Chromium (ja vien tās nav īpaši izveidotas ar NSS), kas izmantoja NSS līdz 2015. gadam, bet pēc tam pārgāja uz BoringSSL.

Ievainojamību izraisa kļūda sertifikāta verifikācijas kodā funkcijā vfy_CreateContext no faila secvfy.c. Kļūda rodas gan tad, kad klients nolasa sertifikātu no servera, gan tad, kad serveris apstrādā klienta sertifikātus. Pārbaudot DER kodētu ciparparakstu, NSS dekodē parakstu fiksēta izmēra buferī un nodod buferi PKCS #11 modulim. Turpmākās apstrādes laikā tiek nepareizi pārbaudīts izmērs DSA un RSA-PSS parakstiem, kas noved pie VFYContextStr struktūrai piešķirtā bufera pārpildes, ja ciparparaksta lielums pārsniedz 16384 bitus (buferim tiek atvēlēti 2048 baiti, bet nav pārbaudīts, vai paraksts var būt lielāks) ).

Kodam, kas satur ievainojamību, var izsekot līdz 2003. gadam, taču tas neradīja draudus līdz 2012. gadā veiktajai pārstrukturēšanai. 2017. gadā tāda pati kļūda tika pieļauta, ieviešot RSA-PSS atbalstu. Lai veiktu uzbrukumu, nepieciešamo datu iegūšanai nav nepieciešama resursietilpīga noteiktu atslēgu ģenerēšana, jo pārpilde notiek posmā pirms ciparparaksta pareizības pārbaudes. Datu daļa, kas pārsniedz robežas, tiek ierakstīta atmiņas apgabalā, kurā ir norādes uz funkcijām, kas vienkāršo darba uzdevumu izveidi.

Ievainojamību atklāja Google Project Zero pētnieki, eksperimentējot ar jaunām neskaidrām testēšanas metodēm, un tā ir labs pierādījums tam, kā triviālas ievainojamības var palikt nepamanītas ilgu laiku plaši pārbaudītā labi zināmā projektā:

  • NSS kodu uztur pieredzējusi drošības komanda, izmantojot vismodernākās testēšanas un kļūdu analīzes metodes. Ir izveidotas vairākas programmas, lai maksātu ievērojamu atlīdzību par NSS ievainojamību noteikšanu.
  • NSS bija viens no pirmajiem projektiem, kas pievienojās Google oss-fuzz iniciatīvai, un tika pārbaudīts arī Mozilla uz libFuzzer balstītajā fuzz testēšanas sistēmā.
  • Bibliotēkas kods ir daudzkārt pārbaudīts dažādos statiskajos analizatoros, tostarp kopš 2008. gada to uzrauga Coverity dienests.
  • Līdz 2015. gadam NSS tika izmantots pārlūkprogrammā Google Chrome, un Google komanda to neatkarīgi verificēja neatkarīgi no Mozilla (kopš 2015. gada pārlūks Chrome pārgāja uz BoringSSL, taču joprojām tiek atbalstīts NSS bāzes ports).

Galvenās problēmas, kuru dēļ problēma ilgu laiku palika neatklāta:

  • NSS moduļu bibliotēka un izplūdes pārbaude tika veikta nevis kopumā, bet gan atsevišķu komponentu līmenī. Piemēram, atsevišķi tika pārbaudīts kods DER dekodēšanai un sertifikātu apstrādei - izplūdināšanas laikā varēja iegūt sertifikātu, kas novestu pie attiecīgās ievainojamības izpausmes, taču tā pārbaude nesasniedza verifikācijas kodu un problēma netika konstatēta. atklāj sevi.
  • Izplūdes testēšanas laikā tika noteikti stingri ierobežojumi izvades izmēram (10000 10000 baiti), jo NSS nebija līdzīgu ierobežojumu (daudzām struktūrām normālā režīmā izmērs varētu būt lielāks par 224 1 baitiem, tāpēc, lai identificētu problēmas, bija nepieciešams vairāk ievades datu). . Pilnīgai pārbaudei ierobežojumam bija jābūt 16–XNUMX baitam (XNUMX MB), kas atbilst TLS atļautajam maksimālajam sertifikāta izmēram.
  • Nepareizs priekšstats par izplūdes testēšanas koda pārklājumu. Ievainojamais kods tika aktīvi pārbaudīts, taču tika izmantoti fuzeri, kas nespēja ģenerēt nepieciešamos ievades datus. Piemēram, fuzzer tls_server_target izmantoja iepriekš definētu gatavu sertifikātu kopu, kas ierobežoja sertifikāta verifikācijas koda pārbaudi tikai ar TLS ziņojumiem un protokola stāvokļa izmaiņām.

Avots: opennet.ru

Pievieno komentāru