Chyba pri spúšťaní kódu v Mozilla NSS pri spracovaní certifikátov

V sade kryptografických knižníc NSS (Network Security Services) vyvinutých Mozillou bola identifikovaná kritická zraniteľnosť (CVE-2021-43527), ktorá môže viesť k spusteniu kódu útočníka pri spracovaní digitálnych podpisov DSA alebo RSA-PSS špecifikovaných pomocou Metóda kódovania DER (Distinguished Encoding Rules). Problém s kódovým označením BigSig je vyriešený v NSS 3.73 a NSS ESR 3.68.1. Aktualizácie balíkov v distribúciách sú dostupné pre Debian, RHEL, Ubuntu, SUSE, Arch Linux, Gentoo, FreeBSD. Zatiaľ nie sú dostupné žiadne aktualizácie pre Fedoru.

Problém nastáva 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 implementáciách TLS, X.509, OCSP a CRL. Zraniteľnosť sa môže objaviť v rôznych klientskych a serverových aplikáciách, ktoré podporujú TLS, DTLS a S/MIME, e-mailových klientoch a prehliadačoch PDF, ktoré používajú volanie NSS CERT_VerifyCertificate() na overenie digitálnych podpisov.

Ako príklady zraniteľných aplikácií sú uvedené LibreOffice, Evolution a Evince. Problém môže potenciálne ovplyvniť aj projekty ako Pidgin, Apache OpenOffice, Suricata, Curl, Chrony, Red Hat Directory Server, Red Hat Certificate System, mod_nss pre Apache http server, Oracle Communications Messaging Server, Oracle Directory Server Enterprise Edition. Zraniteľnosť sa však neobjavuje v prehliadačoch Firefox, Thunderbird a Tor, ktoré na overenie používajú samostatnú knižnicu mozilla::pkix, ktorá je tiež súčasťou NSS. Problém sa netýka ani prehliadačov založených na prehliadači Chromium (pokiaľ nie sú š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 overovacom kóde certifikátu vo funkcii vfy_CreateContext zo súboru secvfy.c. Chyba sa vyskytuje, keď klient číta certifikát zo servera, ako aj keď server spracováva klientske certifikáty. Pri overovaní digitálneho podpisu kódovaného DER NSS dekóduje podpis do vyrovnávacej pamäte s pevnou veľkosťou a túto vyrovnávaciu pamäť odovzdá modulu PKCS #11. Pri ďalšom spracovaní sa nesprávne kontroluje veľkosť podpisov DSA a RSA-PSS, čo vedie k pretečeniu vyrovnávacej pamäte alokovanej pre štruktúru VFYContextStr, ak veľkosť digitálneho podpisu presiahne 16384 bitov (pre vyrovnávaciu pamäť je alokovaných 2048 bajtov, ale nekontroluje sa, že podpis môže byť väčší) ).

Kód obsahujúci túto zraniteľnosť možno vysledovať až do roku 2003, ale nepredstavoval hrozbu až do refaktorizácie vykonanej v roku 2012. V roku 2017 sa stala rovnaká chyba pri implementácii podpory RSA-PSS. Na vykonanie útoku sa na získanie potrebných údajov nevyžaduje generovanie určitých kľúčov náročné na zdroje, pretože k pretečeniu dochádza vo fáze pred kontrolou správnosti digitálneho podpisu. Časť údajov, ktorá presahuje hranice, sa zapisuje do pamäťovej oblasti obsahujúcej ukazovatele na funkcie, čo zjednodušuje vytváranie pracovných exploitov.

Zraniteľnosť bola objavená výskumníkmi z Google Project Zero pri experimentovaní s novými fuzzing testovacími metódami a je dobrou ukážkou toho, ako môžu triviálne zraniteľnosti zostať dlho neodhalené v široko testovanom známom projekte:

  • Kód NSS je udržiavaný skúseným bezpečnostným tímom pomocou najmodernejších techník testovania a analýzy chýb. Existuje niekoľko programov na vyplácanie významných odmien za identifikáciu zraniteľných miest v NSS.
  • NSS bol jedným z prvých projektov, ktoré sa pripojili k iniciatíve Google oss-fuzz a bol tiež testovaný v fuzz testovacom systéme založenom na Mozille libFuzzer.
  • Knižničný kód bol mnohokrát kontrolovaný v rôznych statických analyzátoroch, vrátane monitorovania službou Coverity od roku 2008.
  • Do roku 2015 sa NSS používal v prehliadači Google Chrome a bol nezávisle overený tímom Google nezávisle od Mozilly (od roku 2015 Chrome prešiel na BoringSSL, ale podpora portu na báze NSS zostáva zachovaná).

Hlavné problémy, kvôli ktorým problém zostal dlho nezistený:

  • Modulárna knižnica NSS a fuzzing testovanie boli realizované nie ako celok, ale na úrovni jednotlivých komponentov. Napríklad kód na dekódovanie DER a spracovanie certifikátov bol kontrolovaný oddelene - počas fuzzingu mohol byť získaný certifikát, ktorý by viedol k prejaveniu predmetnej zraniteľnosti, ale jeho kontrola nedosiahla overovací kód a problém sa nevyriešil odhaliť sa.
  • Počas testovania fuzzingu boli nastavené prísne obmedzenia na veľkosť výstupu (10000 10000 bajtov), ​​keďže podobné obmedzenia v NSS neexistovali (veľa štruktúr v normálnom režime mohlo mať veľkosť viac ako 224 1 bajtov, takže na identifikáciu problémov bolo potrebných viac vstupných údajov) . Pre úplné overenie mal byť limit 16-XNUMX bajtov (XNUMX MB), čo zodpovedá maximálnej veľkosti certifikátu povolenej v TLS.
  • Mylná predstava o pokrytí kódu fuzz testovania. Zraniteľný kód bol aktívne testovaný, ale pomocou fuzzerov, ktoré neboli schopné vygenerovať potrebné vstupné dáta. Napríklad fuzzer tls_server_target používal preddefinovanú sadu hotových certifikátov, ktorá obmedzovala kontrolu overovacieho kódu certifikátu iba na správy TLS a zmeny stavu protokolu.

Zdroj: opennet.ru

Pridať komentár