Vo súbore kryptografických knižníc NSS (Network Security Services), ktoré vyvíja spoločnosť Mozilla, bola zistená kritická zraniteľnosť (CVE-2021-43527), ktorá môže viesť k vykonaniu kódu útočníka pri spracovaní digitálnych podpisov DSA alebo RSA-PSS, stanovených pomocou metódy kódovania DER (Distinguished Encoding Rules). Problém, ktorý dostal kódové meno BigSig, bol odstránený vo vydaniach NSS 3.73 a NSS ESR 3.68.1. Aktualizácie balíkov sú dostupné pre distribúcie Debian, RHEL, Ubuntu, SUSE, Arch Linux, Gentoo, FreeBSD. Aktualizácie pre Fedora zatiaľ nie sú dostupné.
Problém sa prejavuje v aplikáciách, ktoré používajú NSS na spracovanie digitálnych podpisov CMS, S/MIME, PKCS #7 a PKCS #12, alebo pri overovaní certifikátov v realizáciách TLS, X.509, OCSP a CRL. Zraniteľnosť môže vzísť v rôznych klientských a serverových aplikáciách, ktoré podporujú TLS, DTLS a S/MIME, v e-mailových klientoch a PDF prehliadačoch, ktoré používajú volanie NSS CERT_VerifyCertificate() na overenie digitálnych podpisov.
Ako príklad zraniteľných aplikácií sa spomínajú LibreOffice, Evolution a Evince. Potenciálne by problém mohol ovplyvniť aj také projekty ako Pidgin, Apache OpenOffice, Suricata, Curl, Chrony, Red Hat Directory Server, Red Hat Certificate System, mod_nss pre http server Apache, Oracle Communications Messaging Server, Oracle Directory Server Enterprise Edition. Zraniteľnosť sa však neprejavuje v Firefox, Thunderbird a Tor Browser, kde sa na overenie používa samostatná knižnica mozilla::pkix, ktorá je tiež súčasťou NSS. Problém sa netýka ani prehliadačov založených na Chromiu (ak neboli špeciálne zostavené s NSS), ktoré používali NSS do roku 2015, ale potom prešli na BoringSSL.
Zraniteľnosť je spôsobená chybou v kóde overovania certifikátov vo funkcii vfy_CreateContext v súbore secvfy.c. Chyba sa prejavuje pri čítaní certifikátu klienta zo servera, ako aj pri spracovaní serverom certifikátov klientov. Počas overovania digitálneho podpisu, zakódovaného metódou DER, NSS dekóduje podpis do vyrovnávacej pamäte s pevnou veľkosťou a odovzdáva tento vyrovnávaciu pamäť do modulu PKCS #11. Pri ďalšom spracovaní, pre podpisy DSA a RSA-PSS sa nesprávne kontroluje veľkosť, čo vedie k pretečeniu vyrovnávacej pamäte pridelené pod štruktúru VFYContextStr, ak veľkosť digitálneho podpisu presahuje 16384 bitov (pod vyrovnávaciu pamäť je pridelených 2048 bajtov, ale nie je skontrolované, že podpis môže byť väčšieho rozmeru).
Kód so zraniteľnosťou sa sleduje od roku 2003, no nepredstavoval hrozbu až do refaktorovania, ktoré sa uskutočnilo v roku 2012. V roku 2017 bola pri implementácii podpory RSA-PSS vykonaná tá istá chyba. Na vykonanie útoku nie je potrebná náročná generácia určitých kľúčov na získanie požadovaných údajov, pretože pretečenie sa vyskytuje v štádiu pred kontrolou správnosti digitálneho podpisu. Časť údajov, ktorá presahuje limity, sa zapisuje do oblasti pamäte obsahujúcej ukazovatele na funkcie, čo uľahčuje vytváranie funkčných exploitov.
Zraniteľnosť bola odhalená výskumníkmi z Google Project Zero počas experimentov s novými metódami fuzzing-testovania a je dobrým príkladom toho, ako môžu byť triviálne zraniteľnosti v široko testovanom známom projekte dlhodobo prehliadané:
- Kód NSS je spravovaný skúseným tímom zodpovedným za bezpečnosť, ktorý využíva moderné metódy testovania a analýzy chýb. Existuje niekoľko programov na vyplácanie významných odmien za odhaľovanie zraniteľností v NSS.
- NSS bol jedným z prvých projektov, ktoré sa zapojili do iniciatívy Google oss-fuzz, a bol tiež testovaný v rozvíjajúcom sa fuzzing-testovacom systéme Mozilla založenom na libFuzzer.
- Kód knižnice bol opakovane testovaný v rôznych statických analyzátoroch, vrátane sledovania služby Coverity od roku 2008.
- Do roku 2015 sa NSS používal v Google Chrome a nezávisle od Mozilly bol testovaný tímom Google (od roku 2015 prešiel Chrome na BoringSSL, ale podpora portu založeného na NSS zostáva).
Hlavné problémy, kvôli ktorým zostala táto zraniteľnosť dlho bez povšimnutia:
- NSS je modulárna knižnica a fuzzing-testovanie sa niekedy vykonávalo nie na celku, ale na úrovni jednotlivých komponentov. Napríklad sa osobitne testoval kód dekódovania DER a spracovania certifikátov - počas fuzzing-u mohol byť získaný certifikát vedúci k prejavu zvažovanej zraniteľnosti, ale jeho kontrola sa nedostala k overovaciemu kódu a problém sa tak neodhalil.
- Pri fuzzing teste boli nastavené prísne obmedzenia na veľkosť výstupu (10000 bajtov) pri absencii podobných obmedzení v NSS (mnohé štruktúry v štandardnom režime mohli mať väčšiu veľkosť ako 10000 bajtov, preto na odhalenie problémov bolo potrebné väčšie množstvo vstupných dát). Pre úplnú kontrolu mal byť limit 224-1 bajtov (16 MB), čo zodpovedá maximálnej veľkosti certifikátu povolenej v TLS.
- Nesprávne chápanie pokrytia kódu fuzzing testovaním. Zraniteľný kód bol aktívne testovaný, ale s použitím fuzzov, ktoré neboli schopné generovať potrebné vstupné dáta. Napríklad, fuzzer tls_server_target používal preddefinovaný súbor pripravených certifikátov, čo obmedzovalo kontrolu kódu overovania certifikátu len na TLS správy a zmeny stavu protokolu.
Zdroj: opennet.ru
