Көпчүлүк Linux дистрибьютерлеринде тамырга кирүү мүмкүнчүлүгүн берген PolKitтин олуттуу аялуулугу

Qualys бөлүштүрүүдө колдонулган Polkit (мурунку PolicyKit) тутум компонентинде артыкчылыксыз колдонуучуларга жогорулатылган кирүү укуктарын талап кылган аракеттерди жасоого уруксат берүү үчүн алсыздыкты (CVE-2021-4034) аныктады. Алсыздык артыкчылыктары жок жергиликтүү колдонуучуга системаны толук башкаруу үчүн өз артыкчылыктарын кеңейтүүгө мүмкүндүк берет. Көйгөйдүн коддуу аты PwnKit болгон жана көпчүлүк Linux дистрибуцияларында демейки конфигурацияда иштеген жумушчу эксплойт чыгаруу менен өзгөчөлөнөт.

Көйгөй PolKitтин pkexec утилитасында бар, ал SUID тамыр желеги менен келген жана PolKitтин көрсөтүлгөн эрежелерине ылайык башка колдонуучунун артыкчылыктары менен буйруктарды иштетүү үчүн иштелип чыккан. 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=name" NULL

Көйгөй argv массивинен кийин эс тутумда чөйрө өзгөрмөлөрүн камтыган envp массивинин бар экендигинде. Ошентип, argv массиви бош болсо, pkexec чөйрө өзгөрмөлөрү бар массивдин биринчи элементинен жогорулатылган артыкчылыктар менен аткарылган буйрук жөнүндө маалыматтарды чыгарып алат (argv[1] envp[0] менен бирдей болуп калды), анын мазмуну башкарылса болот. чабуулчу тарабынан.

argv[1] маанисин алгандан кийин, pkexec PATHдеги файл жолдорун эске алуу менен аткарылуучу файлга толук жолду аныктоого аракет кылат жана argv[1]ге кайра толук жол менен сапка көрсөткүч жазат. argv[1] envp[0] менен бирдей болгондуктан, биринчи чөйрө өзгөрмөсүнүн маанисин кайра жазууга алып келет. Биринчи чөйрө өзгөрмөсүнүн атын манипуляциялоо менен, чабуулчу pkexec ичинде башка чөйрө өзгөрмөсүн алмаштыра алат, мисалы, suid программаларында уруксат берилбеген "LD_PRELOAD" чөйрө өзгөрмөсүн алмаштырып, алардын жалпы китепканасынын жүктөлүшүн уюштура алат. процесс.

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

Көйгөй эс тутумдун бузулушунан келип чыккандыгына карабастан, колдонулган аппараттык архитектурага карабастан, аны ишенимдүү жана кайра-кайра колдонууга мүмкүн экени белгиленет. Даярдалган эксплуатация Ubuntu, Debian, Fedora жана CentOS системаларында ийгиликтүү сыналган, бирок башка дистрибуцияларда да колдонулушу мүмкүн. Түпнуска эксплуатация азырынча жалпыга жеткиликтүү эмес, бул анын маанисиз экенин жана башка изилдөөчүлөр тарабынан оңой эле кайра жаралышы мүмкүн экенин көрсөтүп турат, андыктан көп колдонуучу тутумдарга жаңыртууну мүмкүн болушунча тезирээк орнотуу маанилүү. Polkit BSD системалары жана Solaris үчүн да жеткиликтүү, бирок аларда колдонуу үчүн изилденген эмес. Белгилүү нерсе, OpenBSDде чабуул жасоо мүмкүн эмес, анткени OpenBSD өзөгү execve() чакырылганда null argc маанисин өткөрүүгө жол бербейт.

Көйгөй 2009-жылдын май айынан бери, pkexec командасы кошулгандан бери бар. PolKit чабалдыгын оңдоо учурда патч катары жеткиликтүү (эч кандай патч чыгарыла элек), бирок дистрибьютордук иштеп чыгуучуларга көйгөй тууралуу алдын ала кабарлангандыктан, көпчүлүк дистрибуциялар жаңыртууларды алсыздык жөнүндө маалыматтын ачыкка чыгаруу менен бир убакта жарыялашкан. Маселе RHEL 6/7/8, Debian, Ubuntu, openSUSE, SUSE, Fedora, ALT Linux, ROSA, Gentoo, Void Linux, Arch Linux жана Manjaroдо чечилет. Алсыздыкты бөгөттөө үчүн убактылуу чара катары, SUID тамыр желегин /usr/bin/pkexec программасынан алып салсаңыз болот (“chmod 0755 /usr/bin/pkexec”).



Source: opennet.ru

Комментарий кошуу