Linux дистрибутивтерінің көпшілігінде түбірлік қатынасқа рұқсат беретін PolKit-тегі маңызды осалдық

Qualys артықшылығы жоқ пайдаланушыларға қолжетімділік құқықтарының жоғарылауын талап ететін әрекеттерді орындауға мүмкіндік беру үшін таратылымдарда пайдаланылатын Polkit (бұрынғы PolicyKit) жүйе құрамдасындағы осалдықты (CVE-2021-4034) анықтады. Осалдық артықшылығы жоқ жергілікті пайдаланушыға жүйені толық бақылауға алу үшін өз артықшылықтарын арттыруға мүмкіндік береді. Мәселе PwnKit кодтық атымен аталды және көптеген Linux дистрибутивтерінде әдепкі конфигурацияда жұмыс істейтін жұмыс эксплойт жасауымен ерекшеленеді.

Мәселе SUID түбір жалауымен бірге келетін және көрсетілген PolKit ережелеріне сәйкес басқа пайдаланушының артықшылықтары бар пәрмендерді орындауға арналған PolKit pkexec утилитасында бар. pkexec бағдарламасына жіберілген пәрмен жолы аргументтерінің дұрыс өңделмеуіне байланысты артықшылығы жоқ пайдаланушы аутентификацияны айналып өтіп, кіру ережелері жиынына қарамастан өз кодын түбір ретінде іске қоса алады. Шабуыл үшін PolKit-те қандай параметрлер мен шектеулер көрсетілгені маңызды емес, pkexec утилитасы бар орындалатын файл үшін SUID түбірлік төлсипаты орнатылғаны жеткілікті.

Pkexec процесті бастаған кезде жіберілген пәрмен жолы аргументі санының (argc) жарамдылығын тексермейді. Pkexec әзірлеушілері argv массивіндегі бірінші жазбада әрқашан процестің атауы (pkexec), ал екіншісінде NULL мәні немесе pkexec арқылы іске қосылған пәрмен атауы болады деп есептеді. Аргументтердің саны массивтің нақты мазмұнымен салыстырылмағандықтан және әрқашан 1-ден үлкен деп есептелетіндіктен, Linux execve функциясы рұқсат ететіндей процесс бос argv массивінен өтсе, pkexec бірінші аргумент ретінде NULL мәнін қарастырады ( процесс атауы) және келесісі буферлік жадтан тыс, массивтің келесі мазмұны сияқты. |———+———+——+————|———+———+——+————| | argv[0] | argv[1] | ... | argv[argc] | envp[0] | envp[1] | ... | envp[envc] | |—-|—-+—-|—-+——+——|——|—-|—-+—-|—-+——+——|——| ВВВВВ "бағдарлама" "-опция" NULL "мән" "PATH=атауы" NULL

Мәселе мынада, argv массивінен кейін жадта қоршаған ортаның айнымалы мәндерін қамтитын envp массиві бар. Осылайша, argv массиві бос болса, pkexec мазмұнын басқаруға болатын орта айнымалы мәндері бар массивтің бірінші элементінен (argv[1] envp[0] бірдей болды), жоғары артықшылықтармен іске қосу пәрмені туралы деректерді шығарады. шабуылдаушы арқылы.

argv[1] мәнін ала отырып, pkexec PATH ішіндегі файл жолдарын ескере отырып, орындалатын файлға толық жолды анықтауға тырысады және argv[1]-ге кері толық жолы бар жолға көрсеткіш жазады. argv[1] envp[0]-мен бірдей болғандықтан, бірінші орта айнымалысының мәнін қайта жазуға әкеледі. Бірінші орта айнымалысының атын өңдеу арқылы шабуылдаушы pkexec ішіндегі басқа орта айнымалы мәнін ауыстыра алады, мысалы, suid бағдарламаларында рұқсат етілмеген «LD_PRELOAD» айнымалы ортаны ауыстырады және ортақ кітапханасының жүктелуін ұйымдастырады. процесс.

Жұмыс эксплойт коды iconv_open() қолданатын g_printerr() функциясын шақыру кезінде динамикалық түрде жүктелетін символдарды қайта кодтау кітапханасына жолды анықтау үшін пайдаланылатын GCONV_PATH айнымалысын ауыстыруды қамтиды. GCONV_PATH ішіндегі жолды қайта анықтау арқылы шабуылдаушы жүктелетін стандартты iconv кітапханасы емес, pkexec әлі де жұмыс істеп тұрған кезеңде қате туралы хабар көрсетілген кезде өңдегіштері орындалатын өзінің кітапханасы екеніне көз жеткізе алады. түбірлік құқықтары және іске қосу рұқсаттары тексеріледі.

Мәселе жадтың бүлінуінен туындағанына қарамастан, пайдаланылған аппараттық архитектураға қарамастан, оны сенімді және қайталап пайдалануға болатыны атап өтілген. Дайындалған эксплойт Ubuntu, Debian, Fedora және CentOS жүйелерінде сәтті сынақтан өтті, бірақ оны басқа дистрибутивтерде де пайдалануға болады. Түпнұсқа эксплойт әлі жалпыға қолжетімді емес, бұл оның тривиальды екенін және басқа зерттеушілер оңай қайта жасай алатынын көрсетеді, сондықтан патч жаңартуын көп пайдаланушылық жүйелерге мүмкіндігінше тезірек орнату маңызды. Polkit BSD жүйелері мен Solaris үшін де қол жетімді, бірақ оларда пайдалану үшін зерттелмеген. OpenBSD ядросы execve() шақырылған кезде нөлдік argc мәнін беруге рұқсат бермейтіндіктен, OpenBSD-де шабуылды жүзеге асыру мүмкін емес екені белгілі.

Мәселе 2009 жылдың мамырынан бастап, pkexec пәрмені қосылғаннан бері бар. PolKit осалдығын түзету қазіргі уақытта патч ретінде қол жетімді (патч шығарылымы шығарылған жоқ), бірақ дистрибьюторларды әзірлеушілер мәселе туралы алдын ала хабарланғандықтан, дистрибутивтердің көпшілігі жаңартуды осалдық туралы ақпаратты ашумен бір мезгілде жариялады. Мәселе RHEL 6/7/8, Debian, Ubuntu, openSUSE, SUSE, Fedora, ALT Linux, ROSA, Gentoo, Void Linux, Arch Linux және Manjaro жүйелерінде шешілді. Осалдықты блоктаудың уақытша шарасы ретінде /usr/bin/pkexec бағдарламасынан SUID түбірлік жалаушасын жоюға болады («chmod 0755 /usr/bin/pkexec»).



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

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