Крытычная ўразлівасць у PolKit, якая дазваляе атрымаць root-доступ у большасці дыстрыбутываў Linux

Кампанія Qualys выявіла ўразлівасць (CVE-2021-4034) у сістэмным кампаненце Polkit (былы PolicyKit), які выкарыстоўваецца ў дыстрыбутывах для арганізацыі выканання непрывілеяванымі карыстальнікамі дзеянняў, якія патрабуюць павышаных правоў доступу. Уразлівасць дазваляе непрывілеяванаму лакальнаму карыстачу падвысіць свае прывілеі да карыстача root і атрымаць поўны кантроль над сістэмай. Праблема атрымала кодавае імя PwnKit і характэрная падрыхтоўкай працоўнага эксплоіта, які працуе ў канфігурацыі па змаўчанні ў большасці дыстрыбутываў Linux.

Праблема прысутнічае ў уваходнай у склад PolKit утыліце pkexec, якая пастаўляецца са сцягам SUID root і прызначанай для запуску каманд з прывілеямі іншага карыстача ў адпаведнасці з зададзенымі правіламі PolKit. З-за некарэктнай апрацоўкі перадаваных у pkexec аргументаў каманднага радка непрывілеяваны карыстач мог абыйсці аўтэнтыфікацыю і дамагчыся запуску свайго кода з правамі root, незалежна ад усталяваных правіл доступу. Для нападу ўсё роўна якія налады і абмежаванні ў PolKit зададзены, досыць каб для выкананага файла з утылітай pkexec быў выстаўлены прыкмета SUID root.

Pkexec не правярае карэктнасць лічыльніка аргументаў каманднага радка (argc), якія перадаюцца пры запуску працэсу. Распрацоўнікамі pkexec мелася на ўвазе, што першы запіс масіва argv заўсёды ўтрымоўвае імя працэсу (pkexec), а другая альбо значэнне NULL, альбо імя якая запускаецца праз pkexec каманды. Бо лічыльнік аргументаў не правяраўся на адпаведнасць фактычнаму змесціва масіва і меркавалася, што ён заўсёды больш 1, у выпадку перадачы працэсу пустога масіва argv, што дапушчае функцыя execve у Linux, pkexec успрымаў значэнне NULL як першы аргумент (імя працэсу), а наступную за межамі буфера памяць, як далей ідучае змесціва масіва. |———+———+——+————|———+———+——+————| | argv[0] | argv[1] | … | argv[argc] | envp[0] | envp[1] | … | envp[envc] | |—-|—-+—-|—-+——+——|——|—-|—-+—-|—-+——+——|——| VVVVVV "program" "-option" NULL "value" "PATH=name" NULL

Праблема ў тым, што следам за масівам argv у памяці размяшчаецца масіў envp, утрымоўвальны зменныя асяроддзі. Такім чынам, пры пустым масіве argv, pkexec здабывае дадзеныя аб якая запускаецца з падвышанымі прывілеямі камандзе з першага элемента масіва з зменнымі асяроддзі (argv[1] станавіўся ідэнтычны envp[0]), змесціва якога можа кантраляваць атакавалы.

Атрымаўшы значэнне argv[1], pkexec спрабуе з улікам файлавых шляхоў у PATH вызначыць поўны шлях да выкананага файла і запісаць паказальнік на радок з поўным шляхам зваротна ў argv[1], што прыводзіць да перазапісу і значэнні першай зменнай асяроддзя, бо argv[ 1] ідэнтычны envp[0]. Праз маніпуляцыю з імем першай зменнай асяроддзя, атакавалы можа ажыццявіць падстаноўку іншай зменнай асяроддзя ў pkexec, напрыклад, падставіць зменную асяроддзі «LD_PRELOAD», якая не дапушчаецца ў suid-праграмах, і арганізаваць загрузку ў працэс сваёй падзялянай бібліятэкі.

У працоўным эксплоіце ажыццяўляецца падстаноўка зменнай GCONV_PATH, якая выкарыстоўваецца для вызначэння шляху да бібліятэкі перакадавання сімвалаў, дынамічна загружанай пры выкліку функцыі g_printerr(), у кодзе якой выкарыстоўваецца iconv_open(). Перавызначыўшы шлях у GCONV_PATH атакавалы можа дамагчыся загрузкі не штатнай бібліятэкі iconv, а сваёй бібліятэкі, апрацоўшчыкі з якой будуць выкананы падчас высновы паведамлення аб памылцы на стадыі, калі pkexec яшчэ выконваецца з правамі root і да праверкі паўнамоцтваў запуску.

Адзначаецца, што нягледзячы на ​​тое, што праблема выклікана пашкоджаннем памяці, яна можа надзейна і паўтарана эксплуатавацца незалежна ад выкарыстоўванай апаратнай архітэктуры. Падрыхтаваны эксплоіт паспяхова пратэставаны ў Ubuntu, Debian, Fedora і CentOS, але можа быць скарыстаны і ў іншых дыстрыбутывах. Арыгінальны эксплоіт пакуль не даступны публічна, што сведчыць аб тым, што ён з'яўляецца трывіяльным і можа быць лёгка адноўлены іншымі даследчыкамі, таму на шматкарыстальніцкіх сістэмах важна як мага хутчэй усталяваць абнаўленне з выпраўленнем. Polkit таксама даступны для BSD-сістэм і Solaris, але вывучэнне магчымасці эксплуатацыі ў іх не рабілася. Вядома толькі тое, што напад не можа быць ажыццёўлена ў OpenBSD, бо ядро ​​OpenBSD не дапушчае перадачу пры выкліку execve() нулявога значэння argc.

Праблема прысутнічае з траўня 2009 года, з часу дадання каманды pkexec. Выпраўленне уявзимости у PolKit пакуль даступна ў выглядзе патча (які карэктуе выпуск не сфармаваны), але бо распрацоўнікі дыстрыбутываў былі загадзя апавешчаныя аб праблеме, большасць дыстрыбутываў апублікавала абнаўленне адначасова з расчыненнем інфармацыі аб уразлівасці. Праблема ўхіленая ў RHEL 6/7/8, Debian, Ubuntu, openSUSE, SUSE, Fedora, ALT Linux, ROSA, Gentoo, Void Linux, Arch Linux і Manjaro. У якасці часовай меры для блакавання ўразлівасці можна прыбраць сцяг SUID root з праграмы /usr/bin/pkexec (chmod 0755 /usr/bin/pkexec).



Крыніца: opennet.ru

Дадаць каментар