Në paketën e bibliotekave kriptografike NSS (Shërbime të Sigurisë në Rrjet), të zhvilluara nga kompania Mozilla, është zbuluar një ndjeshmëri kritike (CVE-2021-43527), e cila mund të çojë në ekzekutimin e kodit nga një sulmues gjatë përpunimit të nënshkrimeve digjitale DSA ose RSA-PSS, të caktuara duke përdorur metodën e kodimit DER (Rregullat e Kodimit të Dalluar). Problemi, i njohur me emrin kodues BigSig, është rregulluar në edicionet NSS 3.73 dhe NSS ESR 3.68.1. Përditësimet e paketave janë të disponueshme për distribucionet Debian, RHEL, Ubuntu, SUSE, Arch Linux, Gentoo, FreeBSD. Për momentin nuk ka përditësime të disponueshme për Fedora.
Problemi shfaqet në aplikacione që përdorin NSS për të përpunuar nënshkrimet digjitale CMS, S/MIME, PKCS #7 dhe PKCS #12, ose gjatë verifikimit të certifikatave në realizimet TLS, X.509, OCSP dhe CRL. Ndjeshmëria mund të dalë në aplikacione të ndryshme klient-server me mbështetje për TLS, DTLS dhe S/MIME, klientët e postës dhe shikuesit PDF që përdorin thirrjen NSS CERT_VerifyCertificate() për të verifikuar nënshkrimet digjitale.
Si një shembull i aplikacioneve të ndjeshme përmenden LibreOffice, Evolution dhe Evince. Problemi mund të prekë gjithashtu projekte të tjera si Pidgin, Apache OpenOffice, Suricata, Curl, Chrony, Red Hat Directory Server, Red Hat Certificate System, mod_nss për serverin http Apache, Oracle Communications Messaging Server, Oracle Directory Server Enterprise Edition. Megjithatë, kjo ndjeshmëri nuk shfaqet në Firefox, Thunderbird dhe Tor Browser, të cilat përdorin një bibliotekë të veçantë mozilla::pkix për verifikim, e cila është gjithashtu pjesë e NSS. Problemi nuk i prekur as shfletuesit që bazohen në Chromium (nëse nuk janë ndërtuar posaçërisht me NSS), të cilat kishin përdorur NSS deri në vitin 2015, por më pas kaluan në BoringSSL.
Ndjeshmëria shkaktohet nga një gabim në kodin e verifikimit të certifikatave në funksionin vfy_CreateContext nga skedari secvfy.c. Gabimi shfaqet si gjatë leximit të certifikatës nga klienti nga serveri, ashtu edhe gjatë përpunimit. serverin certifikatet e klientëve. Gjatë verifikimit të nënshkrimit digjital, i koduar me metodën DER, NSS dekodon nënshkrimin në një buffer me madhësi të fiksuar dhe e dërgon këtë buffer në modulin PKCS #11. Gjatë përpunimit të mëtejshëm, për nënshkrimet DSA dhe RSA-PSS, madhësia verifikohet në mënyrë të papërshtatshme, çka çon në mbingarkesë të buffer-it të alokuar për strukturën VFYContextStr, nëse madhësia e nënshkrimit digjital e tejkalon 16384 bit (buffer-i alokohet 2048 byte, por nuk kontrollohet që nënshkrimi mund të jetë më i madh).
Kodi që përmban një dobësi është ndjekur që nga viti 2003, por nuk paraqiste rrezik deri në refaktorimin e bërë në vitin 2012. Në vitin 2017, gjatë zbatimit të mbështetjes për RSA-PSS, u bë e njëjta gabim. Për të kryer një sulm, nuk kërkohet gjenerim burimesh të rëndë të çelësave të caktuar për të marrë të dhënat e nevojshme, pasi mbingarkesa ndodh në fazën para verifikimit të korrektësisë së nënshkrimit digjital. Pjesa e të dhënave që del jashtë kufijve shkruhet në një zonë të memories që përmban tregues për funksione, çka e përmirëson krijimin e eksploitëve të funksionueshëm.
Një dobësi u zbulua nga studiusit e Google Project Zero gjatë eksperimenteve me metoda të reja të testimit fuzzing dhe është një shembull i mirë se si në një projekt të njohur të testuar gjerësisht mund të mbeten të pa vënë re dobësitë triviale për një kohë të gjatë:
- Kodi NSS shoqërohet nga një ekip të eksperteve përgjegjës për sigurinë, që përdor metoda moderne testimi dhe analizimi të gabimeve. Ekzistojnë disa programe për shpërblimin e ndjeshëm për zbulimin e dobësive në NSS.
- NSS ishte një nga projektet e para që iu bashkua iniciativës Google oss-fuzz dhe gjithashtu u kontrollua në sistemin e zhvilluar të testimit fuzzing nga Mozilla mbi bazën e libFuzzer.
- Kodi i bibliotekës është kontrolluar disa herë në analizatorë statikë të ndryshëm, duke përfshirë shërbimin Coverity që është ndjekur që nga viti 2008.
- Derisa në vitin 2015 NSS u përdor në Google Chrome dhe u kontrollua nga ekipi i Google, përveç Mozilla-s (nga viti 2015 Chrome kaloi në BoringSSL, por mbështetje për portin e bazuar në NSS vazhdon).
Problemet kryesore për të cilat kjo çështje mbeti e pa vënë re për një kohë të gjatë:
- Biblioteka modulare NSS dhe testimi fuzzing u realizua jo nĂ« tĂ«rĂ«si, por nĂ« nivelin e komponenteve tĂ« veçanta. PĂ«r shembull, u kontrollua veçmas kodi i dekodimit DER dhe pĂ«rpunimi i certifikatave â gjatĂ« fuzzing-ut mund tĂ« ishte marrĂ« njĂ« certifikatĂ« qĂ« shkaktonte shfaqjen e vulnerabilitetit tĂ« shqyrtuar, por verifikimi i saj nuk arrinte deri te kodi i verifikimit dhe problemi nuk e shfaqte veten.
- Gjatë testimit fuzzing, u vendosën kufizime të rrepta për madhësinë e daljes (10,000 byte) në mungesë të kufizimeve të tilla në NSS (shumë struktura në mënyrën e zakonshme mund të kishin madhësi më të madhe se 10,000 byte, kështu që për të identifikuar problemet kërkohej një volum më i madh të dhënash). Për një verifikim të plotë, kufiri duhet të ishte 224-1 byte (16 MB), që përkon me madhësinë maksimale të certifikatës të pranueshme në TLS.
- Një keqkuptim në lidhje me mbulimin e kodit nga testimi me fuzzing. Kodi i ndjeshëm është testuar aktivisht, por duke përdorur fuzzera që nuk janë në gjendje të gjenerojnë të dhënat e nevojshme të hyrjes. Për shembuj, fuzzera tls_server_target përdori një grup të paracaktuar certifikatash të gatshme, çka kufizoi verifikimin e kodit të verifikimit të certifikatës vetëm në mesazhet TLS dhe ndryshimet e gjendjes së protokollit.
Burimi: opennet.ru
