Сертификаттарды өңдеу кезінде Mozilla NSS жүйесінде кодты орындау осалдығы

Mozilla әзірлеген криптографиялық кітапханалардың NSS (Network Security Services) жинағында маңызды осалдық (CVE-2021-43527) анықталды, ол DSA немесе RSA-PSS цифрлық қолтаңбаларын пайдалану арқылы өңдеу кезінде шабуылдаушы кодының орындалуына әкелуі мүмкін. DER кодтау әдісі (ерекше кодтау ережелері). BigSig кодтық атауы бар мәселе NSS 3.73 және NSS ESR 3.68.1 нұсқаларында шешілген. Дистрибуциялардағы бума жаңартулары Debian, RHEL, Ubuntu, SUSE, Arch Linux, Gentoo, FreeBSD үшін қол жетімді. Fedora үшін қол жетімді жаңартулар әлі жоқ.

Мәселе CMS, S/MIME, PKCS #7 және PKCS #12 цифрлық қолтаңбаларын өңдеу үшін NSS қолданатын қолданбаларда немесе TLS, X.509, OCSP және CRL іске асыруларында сертификаттарды тексеру кезінде орын алады. Осалдық сандық қолтаңбаларды тексеру үшін NSS CERT_VerifyCertificate() қоңырауын пайдаланатын TLS, DTLS және S/MIME, электрондық пошта клиенттері мен PDF қарау құралдарын қолдайтын әртүрлі клиенттік және серверлік қолданбаларда пайда болуы мүмкін.

LibreOffice, Evolution және Evince осал қолданбалардың мысалдары ретінде аталған. Әлеуетті түрде мәселе Pidgin, Apache OpenOffice, Suricata, Curl, Chrony, Red Hat каталог сервері, Red Hat сертификат жүйесі, Apache http серверіне арналған mod_nss, Oracle Communications Messaging Server, Oracle Directory Server Enterprise Edition сияқты жобаларға әсер етуі мүмкін. Дегенмен, осалдық Firefox, Thunderbird және Tor Browser браузерлерінде пайда болмайды, олар тексеру үшін NSS-ке енгізілген бөлек mozilla::pkix кітапханасын пайдаланады. 2015 жылға дейін NSS пайдаланған, бірақ кейін BoringSSL-ге ауысқан Chromium негізіндегі браузерлерге (олар арнайы NSS-пен құрастырылған болмаса) да мәселе әсер етпейді.

Осалдық secvfy.c файлындағы vfy_CreateContext функциясындағы сертификатты тексеру кодындағы қатеден туындайды. Қате клиент серверден сертификатты оқығанда да, сервер клиент сертификаттарын өңдеген кезде де орын алады. DER-кодталған цифрлық қолтаңбаны тексеру кезінде NSS қолтаңбаны бекітілген өлшемді буферге декодтайды және буферді PKCS #11 модуліне береді. Әрі қарай өңдеу кезінде өлшем DSA және RSA-PSS қолтаңбалары үшін қате тексеріледі, бұл VFYContextStr құрылымы үшін бөлінген буфердің толып кетуіне әкеледі, егер цифрлық қолтаңбаның өлшемі 16384 биттен асса (буферге 2048 байт бөлінген, бірақ қолдың үлкенірек болуы мүмкін екені тексерілмейді) ).

Осалдықты қамтитын кодты 2003 жылдан бастап байқауға болады, бірақ ол 2012 жылы жасалған рефакторингке дейін қауіп төндірмеді. 2017 жылы RSA-PSS қолдауын енгізу кезінде дәл осындай қателік жіберілді. Шабуыл жасау үшін қажетті деректерді алу үшін белгілі бір кілттердің ресурсты қажет ететін генерациясы қажет емес, өйткені толып кету ЭЦҚ дұрыстығын тексерудің алдында орын алады. Мәліметтердің шекарадан шығатын бөлігі функцияларға көрсеткіштерді қамтитын жад аймағына жазылады, бұл жұмыс эксплуаттарын жасауды жеңілдетеді.

Бұл осалдықты Google Project Zero зерттеушілері тестілеудің жаңа әдістерімен тәжірибе жасау кезінде тапты және тривиальды осалдықтардың кеңінен сыналған белгілі жобада ұзақ уақыт бойы анықталмай қалуының жақсы көрінісі болып табылады:

  • NSS кодын тәжірибелі қауіпсіздік тобы ең заманауи тестілеу және қателерді талдау әдістерін пайдалана отырып жүргізеді. NSS жүйесіндегі осалдықтарды анықтау үшін айтарлықтай сыйақы төлеуге арналған бірнеше бағдарламалар бар.
  • NSS Google компаниясының oss-fuzz бастамасына қосылған алғашқы жобалардың бірі болды және сонымен қатар Mozilla libFuzzer негізіндегі fuzz тестілеу жүйесінде сынақтан өтті.
  • Кітапхана коды әртүрлі статикалық анализаторларда бірнеше рет тексерілді, соның ішінде Coverity қызметі 2008 жылдан бері бақыланады.
  • 2015 жылға дейін NSS Google Chrome жүйесінде қолданылды және оны Mozilla-дан тәуелсіз Google командасы тәуелсіз тексерді (2015 жылдан бастап Chrome BoringSSL-ге ауысты, бірақ NSS негізіндегі портты қолдау сақталады).

Мәселе ұзақ уақыт бойы анықталмаған негізгі мәселелер:

  • NSS модульдік кітапханасы және fuzzing тестілеуі тұтастай емес, жеке құрамдас бөліктер деңгейінде жүргізілді. Мысалы, DER кодының декодтауына және сертификаттарды өңдеуге арналған код бөлек тексерілді - бұлдырлау кезінде қарастырылып отырған осалдықтың көрінісіне әкелетін сертификат алынуы мүмкін еді, бірақ оны тексеру тексеру кодына жетпеді және мәселе шешілмеді. өзін танытады.
  • Тестілеу кезінде NSS-де ұқсас шектеулер болмаған кезде шығыс өлшеміне (10000 10000 байт) қатаң шектеулер қойылды (қалыпты режимдегі көптеген құрылымдардың өлшемі 224 1 байттан асуы мүмкін, сондықтан проблемаларды анықтау үшін көбірек кіріс деректері қажет болды) . Толық тексеру үшін шек 16-XNUMX байт (XNUMX МБ) болуы керек, бұл TLS рұқсат етілген сертификаттың максималды өлшеміне сәйкес келеді.
  • Қатты тестілеу кодын қамту туралы қате түсінік. Осал код белсенді түрде сынақтан өтті, бірақ қажетті кіріс деректерін жасай алмаған fuzzers қолданылды. Мысалы, fuzzer tls_server_target сертификатты тексеру кодын тексеруді тек TLS хабарларымен және протокол күйінің өзгерістерімен шектейтін дайын сертификаттардың алдын ала анықталған жинағын пайдаланды.

Ақпарат көзі: opennet.ru

пікір қалдыру